Android 矩陣Martix筆記

偶爾看見網上關於Martix的介紹還是很多,但是對於矩陣的martix.setTranslate()、martix.setScale()、martix.setRotate()、martix.setSkew()結合preXXXX:以pre開頭,例如preTranslate 、postXXXX:以post開頭,例如postScale的結合使用效果說得比較模糊,本文着重講其結合使用效果:

第一:每個martix.setTranslate()、martix.setScale()、martix.setRotate()、martix.setSkew()都會把上個效果清除清除清除(重要的事說三遍)掉,現在的所有操作會影響之後的操作。

例如依次調用了:

martix.setTranslate()

martix.preTranslate()

martix.setScale()

martix.setRotate()

martix.postScale()

martix.setSkew()

martix.postScale()

martix.preTranslate()

那麼最終只有紅色標記的會起作用,所以我們在使用時要注意。

第二:postXXXX、preXXXX使用效果

只做平移變換的話我們很難看出其中的邏輯,所以會穿插使用martix.setScale()。

首先不做任何操作的情況下繪製一張圖片在畫布上:

Matrix matrix = new Matrix();
Bitmap bitmap= BitmapFactory.decodeResource(getContext().getResources(),R.drawable.abc);
canvas.drawBitmap(bitmap, matrix, paint);

下面加入操作實例:

操作1:

Matrix matrix = new Matrix();
matrix.postTranslate(100,100);
matrix.setScale(0.5f, 0.5f);
Bitmap bitmap= BitmapFactory.decodeResource(getContext().getResources(),R.drawable.abc);
canvas.drawBitmap(bitmap, matrix, paint);

因爲說過martix.setXXX方法會清除之前所有變換效果,所以matrix.postTranslate(100,100)就好比沒有執行一樣,最終效果只會執行x/y方向縮小一半,即圖形縮小一半,如下圖

操作2:

Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
matrix.postTranslate(100,100);
Bitmap bitmap= BitmapFactory.decodeResource(getContext().getResources(),R.drawable.abc);
canvas.drawBitmap(bitmap, matrix, paint);

這裏使用了martix.postXXX(),看下最終效果我們在具體說明,如下圖:

 

這裏圖片向右向下移動的距離是100,沒有收到matrix.setScale(0.5f, 0.5f);縮放的影響,那麼這裏我們這裏不用前乘和後乘來說明,因爲很繞,這裏簡單表示爲執行順序爲  matrix.postTranslate(100,100)→matrix.setScale(0.5f, 0.5f),下面我們看換做matrix.preXXX()。

操作3:

Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
matrix.preTranslate(100,100);
Bitmap bitmap= BitmapFactory.decodeResource(getContext().getResources(),R.drawable.abc);
canvas.drawBitmap(bitmap, matrix, paint);

操作3相比操作2我們可以明顯的看到這裏只移動了50,是收到了matrix.setScale(0.5f, 0.5f)的影響,同上我們可以表示爲執行順序是matrix.setScale(0.5f, 0.5f)→matrix.postTranslate(100,100);那麼當存在多個matrix.preXXX()和matrix.postXXX()變換後會是什麼情況,我們接着向下看。

操作4:

Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
matrix.preTranslate(100,100);
matrix.postTranslate(100,0);
Bitmap bitmap= BitmapFactory.decodeResource(getContext().getResources(),R.drawable.abc);
canvas.drawBitmap(bitmap, matrix, paint);

 

上圖很清晰地知道,圖片向右移動了150,向下移動了50,並且縮放到原圖一半,也是符合之前的結論,執行順序爲matrix.postTranslate(100,0)→matrix.setScale(0.5f, 0.5f)→matrix.preTranslate(100,100);

 

從上面的實踐我們可以得出結論,比如下面操作5的執行順序:

Matrix matrix = new Matrix();
matrix.setScale(0.5f, 0.5f);
matrix.preTranslate(100,100);
matrix.preScale(0.5f, 0.5f);
matrix.postTranslate(100,0);
matrix.postScale(0.5f,0.5f);
Log.e("====",matrix.toString());
Bitmap bitmap= BitmapFactory.decodeResource(getContext().getResources(),R.drawable.abc);
canvas.drawBitmap(bitmap, matrix, paint);

打印的log:com.example.myapplication E/====: Matrix{[0.125, 0.0, 75.0][0.0, 0.125, 25.0][0.0, 0.0, 1.0]}

0.125    0.0       75.0

0.0        0.125   25.0

0.0       0.0        1.0

所以,最終結果是縮放爲原圖的0.125倍,x方向右移75像素,y方向下移25像素;結果如圖:

 

所以執行順序

matrix.postScale(0.5f,0.5f)matrix.postTranslate(100,0)matrix.setScale(0.5f, 0.5f)matrix.preTranslate(100,100)matrix.preScale(0.5f, 0.5f);

然後、所以、最後我相信你也發現了也學會了吧。。。。。。下次再見。。。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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