1. 程式人生 > >徹底弄懂matrix和canvas

徹底弄懂matrix和canvas

Canvas

新建Canvas

我們的圖,幾乎所有的draw….方法,最終都是和Canvas聯絡在一起。
如果需要建立Canvas,必須傳入一個bitmap,作為畫圖的地方。

Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);

繫結之後,我們就可以使用draw… 的方法來將要畫的東西畫到bitmap上面。

Canvas位置變換

android提供了Canvas位置變換的方法,可以變換Canvas的位置,還可以獲得canvas的轉換矩陣物件(getMatrix方法),這樣的效果就相當於筆沒有動,但是畫紙進行了移動。

Canvas也提供了儲存和回滾屬性操作(save和restore),他們就像是你畫了一些東西后,暫時儲存(save)畫了的東西。然後變換一下canvas物件,比如旋轉90度,然後再畫一些東西,畫完後呼叫restore方法返回之前的位置,這裡返回的是我們在save時候的位置。

點9圖

注意,這裡的上左定義的是可以橫向拉伸的區域,下右定義的是可以縱向拉伸的區域。所以相對兩邊的線可以不一樣,這點要特別注意。
以前的誤區。

Matrix

原理

matrix是3*3的一個矩陣。它裡面的九個引數
cosX -sinX translateX
sinX cosX translateY
0 0 scale
其中,sinX和cosX,代表的是旋轉角度的sin和cos值。注意旋轉的正方向是順時針方向。translateX和translateY代表的是平移的X和Y。scale代表的是縮放的大小。

使用示例

 float cosValue = (float) Math.cos(-Math.PI/6);
 float sinValue = (float) Math.sin(-Math.PI/6);
        mMatrix.setValues(
                new float[]{
                        cosValue, -sinValue, 100,
                        sinValue, cosValue, 100,
                        0, 0, 2}); 

這樣的效果就是逆時針旋轉30度,向下向右平移50,擴大兩倍,之所以是50而不是100是因為擴大了兩倍。

android實現

android中matrix的實現主要是rotate ,translate ,scale ,skew(傾斜)四種。並且對這些屬性提供了三種設定方法。
- set:直接設定matrix的值,這樣會直接修改掉當前的matrix值
- pre:前乘,操作給出的矩陣乘以當前的矩陣。
- post:後乘,當前矩陣乘以操作給出的矩陣。

下面對於 將一個圖片旋轉30度,然後平移到(100,100)的地方 這個需求
後乘:

Matrix m = new Matrix(); 
m.postRotate(30); 
m.postTranslate(100, 100);  

前乘

Matrix m = new Matrix(); 
m.setTranslate(100, 100); 
m.preRotate(30);

應用例項

Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap(); 
        mBitmap = bmp; 
        /*首先,將縮放為100*100。這裡scale的引數是比例。有一點要注意,如果直接用100/
bmp.getWidth()的話,會得到0,因為是整型相除,所以必須其中有一個是float型的,直接用100f就好。*/ 
        mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight()); 
                //平移到(100100)處 
        mMatrix.postTranslate(100, 100); 
                //傾斜xy軸,以(100100)為中心。 
        mMatrix.postSkew(0.2f, 0.2f, 100, 100);