Android遊戲開發中可能有一些旋轉的物體:例如旋轉的地球,花朵,齒輪等零部件,或者背景,甚至承載重要邏輯的對象。
如果由像素點構成,邏輯變化,當然是一種思路,但是這樣很難有很好的視覺效果,還牽扯到重要的底層算法的實現。
但是如果想讓一個圖片在Android畫面中旋轉起來,這裏提供一種思路,使用canvas中的參數爲矩陣的方法,讓畫的圖片旋轉一定角度(當然這裏也可以讓canvas旋轉),即使用canvas的drawBitmap(Bitmap,Matrix,Piant)方法,這裏的矩陣可以讓圖片旋轉,放縮,平移。
使用這個方法需要注意:
1, 這樣一來本來可以使用參數爲兩個矩形方法自動讓圖片適配屏幕,並且讓圖片自動到自己相應的位置去,但是現在必須手動輸入相應的值進行適配,平移。
2, 同時使用矩陣的三個方法進行矩陣的平移邏輯,旋轉邏輯,放縮邏輯時會出現一定的邏輯問題(無法正確的同時達到上述三種效果)
3, Matrix使用時注意旋轉並不是默認繞圖片中心旋轉,默認繞0點,即屏幕左上角進行旋轉,需要傳給其相應的旋轉座標點。
下面詳細介紹:
1, matrix類的使用
使用setRotate方法進行旋轉,可以只傳角度參數,此時圍繞屏幕左上角點進行旋轉,度數採用角度制,非弧度制。還可以傳圍繞座標的x,y
matrix.setRotate(degree,xx,yy);
使用matrix.postTranslate(x,y)進行平移,注意這裏的xy不是絕對座標,而是,水平變化量,豎直變化量,這裏建議先進行旋轉再進行平移。
使用matrix.postScale進行伸縮,傳入參數水平伸縮量,豎直伸縮量。
如上所述,這三個步驟不論先後,如果同時使用,會有邏輯錯誤。
2,解決辦法:
避免三個方法的同時使用。使用別的辦法,先對圖片伸縮處理好再進行矩陣變換。
我的思路是使用new一個新的Bitmap,設置爲想要設置的圖片大小,使用canvas在這個圖片上畫滿(即抽象的進行了適配),達到伸縮效果後。
再進行先旋轉,再平移。這裏是爲了方便的得到此時伸縮圍繞點的座標。
public void drawImage(Bitmap bitmap, int x, int y, int width, int height,float degree) {
//參數解析:資源圖片,平移橫縱座標,想要資源的寬高,旋轉角度
srcRect.set(0, 0, bitmap.getWidth(), bitmap.getHeight());
dstRect.set(0, 0, width, height);
Matrix matrix=new Matrix();
Bitmap b=Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);//放縮只能提前進行
Canvas canvas1=new Canvas(b);
canvas1.drawBitmap(bitmap,srcRect,dstRect,paint);
//x,y通過矩陣放縮,勿忘矩陣變化
int xx=b.getWidth()/2;
int yy=b.getHeight()/2;
matrix.setRotate(degree,xx,yy);//這裏中心點是不會變的
matrix.postTranslate(x,y);//平移
/* matrix.postScale((float)dstRect.width()/(float) srcRect.width(),(float)dstRect.height()/(float) srcRect.height(),x,y);*/
//爲何放縮+旋轉有問題,這是內部邏輯問題
canvas.drawBitmap(b,matrix,paint);
}
這裏是我使用的一個畫筆類中的方法,這個方法只要傳參,左上角x,y,想要放大的角度,旋轉度數,就可以達到旋轉的效果。