Android 關(guān)于Matrix的知識(一)

  • 在日常開發(fā)中經(jīng)常能夠看得到Matrix的身影,Matrix直譯過來也就是矩陣的意思,其實我們通常使用它進行一些圖形變換的操作,例如:旋轉(zhuǎn),平移,縮放,扭曲等。

  • 本章節(jié)主要講述的Matrix主要如何使用以及一些需要注意的細節(jié),部分內(nèi)容會直接引用作者查找的一些資料,因為我覺得他們已經(jīng)寫得很好了,再復制一遍真心沒有必要(國內(nèi)大多數(shù)博客都一個德行,大家知道是為什么的)。

  • Matrix的基本實現(xiàn)原理其實就是對矩陣的操作,需要一定的線性代數(shù)的知識,詳細可以查看這篇文章:[Android Matrix詳解]。其實我覺得看懂了并沒有什么卵用,谷歌在這方面已經(jīng)提供了很豐富的api供我們使用。如果要說會用到矩陣的變化,我覺得能使用的地方也就只剩ColorMatrix(后期會再講),但是沒有對圖像研究過,也沒有什么用。所以這里不再進行描述。

會用到Matrix的地方:

1.Canvas:
    canvas.concat(matrix);
    canvas.setMatrix(matrix);

注意這里cancat()與setMatrix()的區(qū)別,cancat應用于當前畫布的全部“對象”,而setMatrix針對于當前畫布。

下面使用該段代碼進行測試:
    matrix = new Matrix();     
   matrix.postScale(2, 2);
//        canvas.save();    
    canvas.setMatrix(matrix);
//        canvas.concat(matrix);       
 canvas.drawRect(100, 100, 300, 300, paint1);
//        canvas.restore();       
 canvas.drawRect(300, 300, 500, 500, paint2);        canvas.drawText("canvas.setMatrix(matrix)", 50, 600, paint1);
original

setMatrix

concat

由上面三張圖可以對比出來,concat針對的是畫布上的全部組件,而setMatrix指的是當前畫布,所以setMatrix的時候由于整個畫布由中心點放大了兩倍,而黑色矩形也因為放大Y軸也想上放大了兩倍,導致了黑色矩形塊被遮擋。

2.ImageView:
 imageView.setImageMatrix(matrix);

這個沒啥好說的。

Matrix的動作:

Matrix的動作有三種,分別是:pre ,post,set
可以參考這篇文章:Matrix 中的post 和pre 和set 方法的區(qū)別 以及Canvas中的方法

其實很簡單,就像排隊:

1.pre 代表著如果之前有過操作,乖乖排隊。

2.post 代表著插隊到第一個。

3.set 代表著,前面的都給老子滾,這里只準留我一個。

Matrix的方法:

Matrix的主要方法有四類,這個在開篇講過,使用起來也非常簡單,
可以去看看這邊文章:Matrix的基本三種變換之Translation、Skew、Rotate

我覺得主要需要注意的點,也沒有什么,唯一需要留心的是在縮放,旋轉(zhuǎn),還有扭曲時,操作點的位置,是使用的“零點”(left,top)呢?還是使用中心點(centerX,centerY)?
我會在下章節(jié)針對于部分小細節(jié),寫些大概的描述。

在這些操作當中,我覺得有一個好玩的方法就是 matrix.setPolyToPoly(),這個方法主要是用于折疊動畫當中,它就是skew(扭曲)的升級版。
可以將規(guī)定矩形框進行變化,感興趣的可以參考下HongYang的這篇文章: Android FoldingLayout 折疊布局 原理及實現(xiàn)(一)

我自己也寫了一個類似蝴蝶飛舞的dialog ,也是使用了這個原理。以后有空會貼出來。

batteryfly
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容