1.Matrix簡介:
Matrix是一個(gè)矩陣,主要功能是坐標(biāo)映射,數(shù)值轉(zhuǎn)換

Matrix在View,圖片,動(dòng)畫效果等各個(gè)方面均有運(yùn)用。畫布操作是對(duì)Matrix的封裝,Matrix作為更接近底層的東西,必然要比畫布操作更加靈活。
使用上,理解它主要理解矩陣的前乘,后乘。
2.Matrix基本原理
矩陣的作用根本上是坐標(biāo)變換,基本變換有4種: 平移(translate)、縮放(scale)、旋轉(zhuǎn)(rotate) 和 錯(cuò)切(skew)。


上面說明了矩陣中參數(shù)的作用。
2.1 縮放(Scale)
x = k1 * x0;
y = k2 * y0;

2.2 錯(cuò)切(Skew)
復(fù)合錯(cuò)切:
x = x0 + k1y0;
y = y0 + k2x0;

2.3 旋轉(zhuǎn)(Rotate)
假定一個(gè)點(diǎn) A(x0, y0) ,距離原點(diǎn)距離為 r, 與水平軸夾角為 α 度, 繞原點(diǎn)旋轉(zhuǎn) θ 度, 旋轉(zhuǎn)后為點(diǎn) B(x, y) 如下:
x0 = r * cosa;
y0 = r * sina;
x = r * cos(a + θ) = r * (cosa * cosθ - sina * sinθ) = x0 *cosθ - y0 * sinθ;
y = r * sin(a + θ) = r * (sina * cosθ + cosa * sinθ) = y0 * cosθ + x0 * sinθ;

2.4 平移(Translate)
x = x0 + △x;
y = y0 + △xy

3.Matrix復(fù)合原理
上面說了坐標(biāo)基本變換,現(xiàn)在重點(diǎn)來了,該如何復(fù)合使用。
Matrix有三類坐標(biāo)設(shè)置方法:,前乘(pre),后乘(post)和設(shè)置(set)。
- 前乘(pre):前乘相當(dāng)于矩陣的右乘。M' = M * S;
- 后乘(post):后乘相當(dāng)于矩陣的左乘。M' = S * M;
- 設(shè)置(set):設(shè)置使用的不是矩陣乘法,而是直接覆蓋掉原來的數(shù)值,所以,使用設(shè)置可能會(huì)導(dǎo)致之前的操作失效。
使用:
由于矩陣乘法不滿足交換律,所以前乘(pre),后乘(post)的區(qū)別還是很大的。
正確使用方式就是先構(gòu)造正常的 Matrix 乘法順序,之后根據(jù)情況使用 pre 和 post 來把這個(gè)順序?qū)崿F(xiàn)。
在構(gòu)造 Matrix 時(shí),個(gè)人建議盡量使用一種乘法,前乘或者后乘,這樣操作順序容易確定,出現(xiàn)問題也比較容易排查。當(dāng)然,由于矩陣乘法不滿足交換律,前乘和后乘的結(jié)果是不同的,使用時(shí)應(yīng)結(jié)合具體情景分析使用。
- 由于矩陣乘法不滿足交換律,請(qǐng)保證使用初始矩陣(Initial Matrix),否則可能導(dǎo)致運(yùn)算結(jié)果不同。
- 注意構(gòu)造順序,順序是會(huì)影響結(jié)果的。
- Initial Matrix是指new出來的新矩陣,或者reset后的矩陣,是一個(gè)單位矩陣。
3.1 僅用pre:
// 使用pre, M' = M*T*S = T*S
Matrix m = new Matrix();
m.reset();
m.preTranslate(tx, ty);
m.preScale(sx, sy);

3.2 僅用post:
// 使用post, M‘ = T*S*M = T*S
Matrix m = new Matrix();
m.reset();
m.postScale(sx, sy); //,越靠前越先執(zhí)行。
m.postTranslate(tx, ty);

3.3 混合:
// 混合 M‘ = T*M*S = T*S
Matrix m = new Matrix();
m.reset();
m.preScale(sx, sy);
m.postTranslate(tx, ty);
或
// 混合 M‘ = T*M*S = T*S
Matrix m = new Matrix();
m.reset();
m.postTranslate(tx, ty);
m.preScale(sx, sy);
上面兩種方式最終形式都是T*S,先后順序沒有變
復(fù)合.png
