徹底弄懂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());
//平移到(100,100)處
mMatrix.postTranslate(100, 100);
//傾斜x和y軸,以(100,100)為中心。
mMatrix.postSkew(0.2f, 0.2f, 100, 100);