Android遊戲開發之繪畫旋轉的物體(Matrix類的邏輯異常)

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,想要放大的角度,旋轉度數,就可以達到旋轉的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章