घूर्णन छवियों मैन्युअल रूप से एक दर्द का एक सा हो सकता है सबसे अच्छा तरीका जानना चाहते हैं, लेकिन यहाँ मैं कैसे किया है है यह।
private void animateRotation(int degrees, float durationOfAnimation){
long startTime = SystemClock.elapsedRealtime();
long currentTime;
float elapsedRatio = 0;
Bitmap bufferBitmap = carBitmap;
Matrix matrix = new Matrix();
while (elapsedRatio < 1){
matrix.setRotate(elapsedRatio * degrees);
carBitmap = Bitmap.createBitmap(bufferBitmap, 0, 0, width, height, matrix, true);
//draw your canvas here using whatever method you've defined
currentTime = SystemClock.elapsedRealtime();
elapsedRatio = (currentTime - startTime)/durationOfAnimation;
}
// As elapsed ratio will never exactly equal 1, you have to manually draw the last frame
matrix = new Matrix();
matrix.setRotate(degrees);
carBitmap = Bitmap.createBitmap(bufferBitmap, 0, 0, width, height, matrix, true);
// draw the canvas again here as before
// And you can now set whatever other notification or action you wanted to do at the end of your animation
}
यह आपके कार बिटमैप को आपके द्वारा निर्दिष्ट समय में निर्दिष्ट कोण में घुमाएगा + अंतिम फ्रेम खींचने का समय। हालांकि, वहाँ एक पकड़ है। यह स्क्रीन पर अपनी स्थिति समायोजित किए बिना आपकी कार बिटमैप को घुमाता है। आप अपने बिटमैप को कैसे आकर्षित कर रहे हैं, इस पर निर्भर करते हुए, आप बिटमैप के ऊपरी-बाएं कोने में रहते हुए अपने कार बिटमैप घूर्णन के साथ समाप्त हो सकते हैं। जैसे-जैसे कार घूमती है, बिटमैप पारदर्शी पिक्सल के साथ इसके चारों ओर अंतराल भरने, नई कार आकार फिट करने के लिए खिंचाव और समायोजित करेगा। यह इस तरह दिखाई देंगे वर्णन करने के लिए मुश्किल है, इसलिए यहाँ एक उदाहरण एक वर्ग घूर्णन है:
ग्रे क्षेत्र बिटमैप का पूर्ण आकार का प्रतिनिधित्व करता है, और पारदर्शी पिक्सेल से भरा है। इस समस्या को हल करने के लिए, आपको त्रिकोणमिति का उपयोग करने की आवश्यकता है। यह थोड़ा जटिल है ... यदि यह आपके लिए एक समस्या हो रहा है (मुझे नहीं पता कि आप कैनवास में अपने बिटमैप्स कैसे चित्रित कर रहे हैं तो यह नहीं हो सकता है), और आप समाधान को हल नहीं कर सकते हैं मुझे पता है और मैं पोस्ट करूंगा कि मैंने यह कैसे किया।
(मुझे नहीं पता कि यह करने का यह सबसे प्रभावी तरीका है, लेकिन यह मेरे लिए आसानी से काम करता है जब तक कि बिटमैप 300x300 या उससे भी कम हो। शायद अगर कोई बेहतर तरीके से जानता है, तो वे हमें बताएं!)
स्रोत
2010-03-13 18:47:48
यदि आप बार-बार अपना बिटमैप बनाते हैं तो आपको प्रदर्शन समस्याओं में भाग लेने की संभावना है। इसके बजाए, इसे एक बार बनाएं और फिर अपने मैट्रिक्स को 'canvas.drawBitmap()' में पास करें। साथ ही, जबकि लूप एनिमेटिंग से कुछ और को रोक देगा जब तक कि आपकी बारी पूरी नहीं हो जाती। गेम लूप आज़माएं: http://www.koonsolo.com/news/dewitters-gameloop/ – idbrii