在日常開發(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);
由上面三張圖可以對比出來,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 ,也是使用了這個原理。以后有空會貼出來。