quay hình ảnh bằng tay có thể là một chút đau đớn, nhưng đây là cách tôi đã thực hiện nó.
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
}
Điều này sẽ xoay carBitmap của bạn thành bất kỳ góc nào bạn chỉ định trong thời gian được chỉ định + thời gian để vẽ khung cuối cùng. Tuy nhiên, có một nhược điểm. Điều này quay carBitmap của bạn mà không điều chỉnh vị trí của nó trên màn hình đúng cách. Tùy thuộc vào cách bạn đang vẽ bitmap của bạn, bạn có thể kết thúc với carBitmap của bạn xoay trong khi góc trên bên trái của bitmap vẫn ở vị trí. Khi chiếc xe quay, bitmap sẽ giãn ra và điều chỉnh để vừa với kích thước xe mới, lấp đầy khoảng trống xung quanh nó bằng các pixel trong suốt. Thật khó để diễn tả này sẽ trông như thế nào, vì vậy đây là một ví dụ xoay một hình vuông:
Khu vực màu xám biểu thị kích thước đầy đủ của bitmap, và được làm đầy với điểm ảnh trong suốt. Để giải quyết vấn đề này, bạn cần sử dụng lượng giác. Đó là một chút phức tạp ... nếu điều này kết thúc là một vấn đề cho bạn (Tôi không biết làm thế nào bạn đang vẽ bitmap của bạn để vải vì vậy nó có thể không được), và bạn không thể làm việc ra các giải pháp, hãy tôi biết và tôi sẽ đăng lên làm thế nào tôi đã làm nó.
(Tôi không biết đây có phải là cách hiệu quả nhất để làm điều đó không, nhưng nó hoạt động trơn tru cho tôi miễn là bitmap nhỏ hơn 300x300 hoặc hơn. Có lẽ nếu ai đó biết cách tốt hơn, họ có thể hãy cho chúng tôi biết!)
Nguồn
2010-03-13 18:47:48
Bạn có khả năng gặp sự cố về hiệu suất nếu bạn liên tục tạo bitmap của mình. Thay vào đó, hãy tạo nó một lần và sau đó chuyển ma trận của bạn vào 'canvas.drawBitmap()'. Ngoài ra, vòng lặp while đó sẽ ngăn chặn bất kỳ thứ gì khác từ hoạt ảnh cho đến khi bạn hoàn tất. Thử vòng lặp trò chơi: http://www.koonsolo.com/news/dewitters-gameloop/ – idbrii