Matrix詳解 Matrix怎麼用

2021-09-01 19:04:07 字數 2432 閱讀 7452

在剛才的viewpager練習中,用到了matrix,在這裡再整理一下它的具體用法:

1、translate————平移變換

2、scale ————縮放變換

3、rotate ————旋轉變換

4、skew ————錯切變換

在android的api裡對於每一種變換都提供了三種操作方式:set(用於設定matrix中的值)、post(後乘,根據矩陣的原理,相當於左乘)、pre(先乘,相當於矩陣中的右乘)。預設時,這四種變換都是圍繞(0,0)點變換的,當然可以自定義圍繞的中心點,通常圍繞中心點。

首先說說平移,在對處理的過程中,最常用的就是對進行平移操作,該方法為settranslate(),平移意味著在x軸和y軸上簡單地移**像。settranslate方法採用兩個浮點數作為引數,表示在每個軸上移動的數量。第乙個引數是影象將在x軸上移動的數量,而第二個引數是影象將在y軸上移動的數量。在x軸上使用正數進行平移將向右移**像,而使用負數將向左移**像。在y軸上使用正數進行平移將向下移**像,而使用負數將向上移**像。

再看縮放,matrix類中另乙個有用的方法是setscale方法。它採用兩個浮點數作為引數,分別表示在每個軸上所產生的縮放量。第乙個引數是x軸的縮放比例,而第二個引數是y軸的縮放比例。如:matrix.setscale(1.5f,1);

比較複雜的就是的旋轉了,內建的方法之一是setrotate方法。它採用乙個浮點數表示旋轉的角度。圍繞預設點(0,0),正數將順時針旋轉影象,而負數將逆時針旋轉影象,其中預設點是影象的左上角,如:

matrix matrix = new matrix();

matrix.setrotate(15);

另外,也可以使用旋轉的角度及圍繞的旋轉點作為引數呼叫setrotate方法。選擇影象的中心點作為旋轉點,如:

matrix.setrotate(15,bmp.getwidth()/2,bmp.getheight()/2);

對於程式中,乙個特別有用的方法對是setscale和posttranslate,它們允許跨單個軸(或者兩個軸)翻轉影象。如果以乙個負數縮放,那麼會將該影象繪製到座標系統的負值空間。由於(0,0)點位於左上角,使用x軸上的負數會導致向左繪製影象。因此我們需要使用posttranslate方法,將影象向右移動,如:

matrix.setscale(-1, 1);

matrix.posttranslate(bmp.getwidth(),0);

可以在y軸上做同樣的事情,翻轉影象以使其倒置。通過將影象圍繞兩個軸上的中心點旋轉180°,可以實現相同的效果,如

matrix.setscale(1, -1);

matrix.posttranslate(0, bmp.getheight());

比如乙個matrix呼叫了下列一系列的方法:

matrix.prescale(0.5f, 1); 

matrix.pretranslate(10, 0);

matrix.postscale(0.7f, 1);

matrix.posttranslate(15, 0);

則座標變換經過的4個變換過程依次是:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0),

所以對matrix方法的呼叫順序是很重要的,不同的順序往往會產生不同的變換效果。pre方法的呼叫順序和post方法的互不影響,即以下的方法呼叫和前者在真實座標變換順序裡是一致的,

matrix.postscale(0.7f, 1); 

matrix.prescale(0.5f, 1);

matrix.pretranslate(10, 0);

matrix.posttranslate(15, 0);

而matrix的set方法則會對先前的pre和post操作進行刷除,而後再設定它的值,比如下列的方法呼叫:

matrix.prescale(0.5f, 1);

matrix.posttranslate(10, 0);

matrix.setscale(1, 0.6f);

matrix.postscale(0.7f, 1);

matrix.pretranslate(15, 0);

其座標變換順序是

translate(15, 0) ->scale(1, 0.6f) -> scale(0.7f, 1).

setscale重新設定了矩陣的值,之前的兩個變換是無效的了,所以最終的顯示效果只有三個變換效果。

canvas裡scale, translate, rotate, concat方法都是pre方法,如果要進行更多的變換可以先從canvas獲得matrix, 變換後再設定回canvas.

Matrix類的方法詳解

b matrix的操作,總共分為translate 平移 rotate 旋轉 scale 縮放 和skew 傾斜 四種,每一種變換在 android的api裡都提供了set,post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。b set是直接設定matrix的值,每次...

matrix 解題報告

我們都知道矩陣乘法 給定兩個矩陣a和b,若a是n r的矩陣,b是r m的矩陣,則a b的結果c是乙個n m的矩陣,且c i,j a i,k b k,j 其中1 k r。很顯然,求出每個c i,j 的過程中,我們都做了r次標量乘法。因此,總的標量乘法次數是n m r。矩陣乘法滿足結合律。換句話說,即使...

matrix矩陣變換

在css3轉換以及htmal5畫布裡均有元素或圖形的轉換,除了基本的移動 縮放 轉動 拉伸還有乙個能包含上述所有轉換方法的matrix方法,在html5的canvas裡用的是transform,不管是css3還是html5,其轉換的本質是一樣的,不同的是css3裡預設座標原點在中間,html5預設座...