React Native圖像變換 Transforms詳解

我們知道View的style的大多數(shù)屬性的用法,但是有個(gè)Transforms的屬性我們很少知道,而且中文網(wǎng)上也只是寫了個(gè)屬性列表,并沒有介紹怎么使用,現(xiàn)將原理和使用方法介紹如下,還請(qǐng)各位參考:

入口在官網(wǎng)的View的style屬性下面的Transforms...屬性


View的style屬性下面的Transforms...屬性
中文網(wǎng)的Transforms屬性

打開后我們可以看到有三個(gè)方法,分別是transform、transformMatrix、decomposedMatrix。

其中后兩個(gè)方法已經(jīng)過期了,需要用transform: [{ matrix: ... }]這種方法代替使用,最后會(huì)講解matrix矩陣的用法。

首先講解transform的這幾個(gè)屬性,首先transform必須是數(shù)組的形式存在:

1、translateY和translateX、translate

在官網(wǎng)的介紹里面是沒有translate的,但是官方源碼中給出了這個(gè)屬性可以用,代碼如下:


translateY和translateX、translate代碼

translateY和translateX分別是向Y、X軸偏移,值為可為正可為負(fù),transform:[{translateX:100}],放在style里面。


translateY和translateX、translate運(yùn)行結(jié)果

xyz軸的方向?yàn)椋ㄊ謾C(jī)屏幕面向上,平方在手機(jī)上):

X軸正方向:手機(jī)右側(cè)為正,向左為負(fù);

Y軸正方向:手機(jī)下方為正,上方為負(fù);

Z軸正方向:從手機(jī)背面向屏幕指向?yàn)樨?fù),反之從屏幕向背面指向?yàn)檎?br>

而 ?transform:[{translate:[-100,100,50]}] ,則有單個(gè)參數(shù),分別為X、Y、Z,Z不填的話為0,

VR:第三個(gè)參數(shù)可以再react-Vr中使用,這樣就是3維立體的了如下代碼:


VR中的立體字

上面的代碼就是VR中的代碼,可以看到translate的第三個(gè)參數(shù)是-3,這樣用VR眼鏡看就是立體的字體了,后面的Z軸數(shù)據(jù)在VR中就更真實(shí)了,由此可看見FB以后也將在VR領(lǐng)域大房光彩了

2、scaleX、scaleY、scale

代碼如下:


scaleX、scaleY、scale代碼

運(yùn)行結(jié)果:


scaleX、scaleY、scale的運(yùn)行結(jié)果

scaleX表示width的縮放,scaleY表示height的縮放,而scale代表寬高都縮放;

值若為正數(shù),則正??s放,若為負(fù)數(shù),則是以自己的中心為中心的鏡像

3、rotateZ、rotateX、rotateY、rotate

其中rotateX、rotateY為繞X和Y軸旋轉(zhuǎn),在我們手機(jī)的XY平面中是看不到的,所以此處不做介紹,只介紹rotateZ和rotate,這兩個(gè)是一樣的結(jié)果:


rotateZ代碼

rotateZ的值為負(fù)數(shù),旋轉(zhuǎn)方向?yàn)槟鏁r(shí)針,度數(shù)必須是string,且要加上deg單位,運(yùn)行結(jié)果如下:


逆時(shí)針旋轉(zhuǎn),rotateZ為負(fù)
順時(shí)針旋轉(zhuǎn),rotateZ為正

4、skewY、skewX斜切

代碼如下:


skewY、skewX的代碼
skewY、skewX的運(yùn)行結(jié)果

大家可能懵逼了,其中skewX表示的是以X軸為中心在YZ屏幕中旋轉(zhuǎn),而skewY表示的是以Y軸為中心在XZ屏幕中旋轉(zhuǎn)。

5、perspective

這個(gè)是透視的概念,在RN中目前還看不到效果

6、matrix

大家知道這是矩陣的意思,具體的代碼如下:


實(shí)際上這個(gè)一個(gè)一維數(shù)組

如果第一行最后一個(gè)為0的話,在矩陣中也就是單位矩陣,代表的是原始的大小,沒有任何變形。而這個(gè)0改為1的話就是下面的運(yùn)行結(jié)果

運(yùn)行結(jié)果如下:


左側(cè)為正常模式,右側(cè)改變了數(shù)組中的第四個(gè)0為1

這個(gè)在實(shí)際的開發(fā)過程中用的很少,

如過代碼改成了如下:


第二行第四個(gè)0為1

運(yùn)行結(jié)果為:


左側(cè)為正常模式,數(shù)組第二行的第四個(gè)0為1

其他的值大家自行調(diào)整,自行驗(yàn)證,這個(gè)在開發(fā)中用的還是比較少的,上面講的各種縮放和變換都可以用這個(gè)表示出來的,因?yàn)樽罱K調(diào)用的方法都是這個(gè)方法(MatrixMath.multiplyInto(result, result, value)),源碼如下:

transform的部分源碼

上面的代碼是我粘出來的代碼,開始都是調(diào)用createIdentityMatrix()方法,返回一個(gè)一維數(shù)組,這個(gè)數(shù)組只不過不同的值表示矩陣而已,最后都是調(diào)用MatrixMath.multiplyInto(result, result, value)的方法,

第一個(gè)參數(shù)result是result = MatrixMath.createIdentityMatrix();,

第二個(gè)參數(shù)是createIdentityMatrix方法或者M(jìn)atrixMath中的其他方法,MatrixMath中的其他方法也是合并的第一個(gè)方法

第三個(gè)是你輸入的值(如:translateY:100中的100,而矩陣的話就是如下代碼

[

? ? 1,1,0,0,

? ? 0,1,0,-1,

? ? 0,0,1,0,

? ? 0,0,0,1

]

7、舉個(gè)例子translateX的由來

假設(shè)我們輸入的是:transform:[{translateX:100}]

首先

_multiplyTransform(result, MatrixMath.reuseTranslate2dCommand, [value, 0]);

_multiplyTransform()方法內(nèi)部是下面的四行----->

var matrixToApply = MatrixMath.createIdentityMatrix();

var argsWithIdentity = [matrixToApply].concat(args);

matrixMathFunction.apply(this, argsWithIdentity);

MatrixMath.multiplyInto(result, result, matrixToApply);

大家可以看出最后又是調(diào)用6中的最后的方法,下面我就一步步的打印結(jié)果給看看,然后和我們直接修改matrix是一樣的結(jié)果。

7.1、 matrixToApply的值為4*4的單位矩陣,也就是16個(gè)值得一維數(shù)組

[?1,0,0,0,?0,1,0,0,?0,0,1,0,?0,0,0,1?]

[

? ? 1,0,0,0,

? ? 0,1,0,0,

? ? 0,0,1,0,

? ? 0,0,0,1

]

大家可以看出是一樣的,

7.2 、argsWithIdentity =? [1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1].concat[100,0]

argsWithIdentity現(xiàn)在有三個(gè)值,一個(gè)是單位矩陣,一個(gè)是100,一個(gè)是0

7.3、把a(bǔ)rgsWithIdentity的三個(gè)值作為三個(gè)參數(shù)傳給MatrixMath.reuseTranslate2dCommand的方法中

7.4、reuseTranslate2dCommand

reuseTranslate2dCommand: function(matrixCommand, x, y) {

? ?matrixCommand[12] = x;

? ?matrixCommand[13] = y;

},

也就是說單位矩陣中的第三行的最后一個(gè)是100,最后一行的第一個(gè)是0,矩陣變成了

[

? 1,0,0,0,

? 0,1,0,0,

? 0,0,1,0,?

? 100,0,0,1

]

用矩陣代替translateX:100

最后的效果和我們之前的結(jié)果是一樣的,


translateX:100

8、matrix代替其他的轉(zhuǎn)換

從7中的分析我們可以看出,

[

? a0,a1,a2,a3,

? a4,a5,a6,a7,

? a8,a9,a10,a11,

? a12,a13,a14,a15

]

translateX:改變矩陣的a12的值就是translateX的改變;

translateY:改變矩陣的a13的值就是translateY的改變;

translate:改變矩陣的a12,a13,a14的值就是translate的改變,其中a12代表的就是X,a13代表的就是Y,a14代表的就是Z(Z的默認(rèn)值為0,可以不填);

skewX:就是改變a4 = Math.sin(radians),其中randians就是我們輸入的‘60deg’,就是60度;同時(shí)還得改變a5 = Math.cos(radians);

skewY:就是改變a0 = Math.cos(radians),其中randians就是我們輸入的‘60deg’,就是60度;同時(shí)還得改變a1 = Math.sin(radians);

scaleX:改變a0就可以了;

scaleY:改變a5就可以了;

scale:同理把a(bǔ)0和a5同時(shí)改變一個(gè)數(shù)值

rotateZ:改變的是

? ? ? ? ? ? ? ?a0 = Math.cos(radians);

? ? ? ? ? ? ? ?a1= Math.sin(radians);

? ? ? ? ? ? ? ? a4 = -Math.sin(radians);

? ? ? ? ? ? ? ? a5= Math.cos(radians);

rotateY:改變的是

? ? ? ? ? ? ? ?a0 = Math.cos(radians);

? ? ? ? ? ? ? ?a2= -Math.sin(radians);

? ? ? ? ? ? ? ?a8 = Math.sin(radians);

? ? ? ? ? ? ? ?a10= Math.cos(radians);

rotateX:改變的是

? ? ? ? ? ? ?a5 = Math.cos(radians);

? ? ? ? ? ? ?a6= Math.sin(radians);

? ? ? ? ? ? ?a9 = -Math.sin(radians);

? ? ? ? ? ? ?a10= Math.cos(radians);

perspective:改變的是 a11= -1 / p;

也就是說大家以后可以用矩陣來變化圖像了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容