Transform

Transform可以在其子組件繪制時對其應(yīng)用一些矩陣變換來實現(xiàn)一些特效阿逃。Matrix4是一個4D矩陣卧波,通過它我們可以實現(xiàn)各種矩陣操作时肿,下面是一個例子:

Container(

color: Colors.black,

child: new Transform(

alignment: Alignment.topRight, //相對于坐標系原點的對齊方式

transform: new Matrix4.skewY(0.3), //沿Y軸傾斜0.3弧度

child: new Container(

  padding: const EdgeInsets.all(8.0),

  color: Colors.deepOrange,

  child: const Text('Apartment for rent!'),

),

),

);

運行效果如圖5-10所示:

image.png

關(guān)于矩陣變換的相關(guān)內(nèi)容屬于線性代數(shù)范疇,本書不做討論港粱,讀者有興趣可以自行了解螃成。本書中,我們把焦點放在Flutter中一些常見的變換效果上查坪。另外寸宏,由于矩陣變化時發(fā)生在繪制時,而無需重新布局和構(gòu)建等過程偿曙,所以性能很好氮凝。

#平移

Transform.translate接收一個offset參數(shù),可以在繪制時沿x望忆、y軸對子組件平移指定的距離罩阵。

DecoratedBox(

decoration:BoxDecoration(color: Colors.red),

//默認原點為左上角,左移20像素启摄,向上平移5像素

child: Transform.translate(

offset: Offset(-20.0, -5.0),

child: Text("Hello world"),

),

)

效果如圖5-11所示:

image.png

#旋轉(zhuǎn)

Transform.rotate可以對子組件進行旋轉(zhuǎn)變換稿壁,如:

DecoratedBox(

decoration:BoxDecoration(color: Colors.red),

child: Transform.rotate(

//旋轉(zhuǎn)90度

angle:math.pi/2 ,

child: Text("Hello world"),

),

);

注意:要使用math.pi需先進行如下導(dǎo)包歉备。

import 'dart:math' as math;

效果如圖5-12所示:

image.png

#縮放

Transform.scale可以對子組件進行縮小或放大傅是,如:

DecoratedBox(

decoration:BoxDecoration(color: Colors.red),

child: Transform.scale(

  scale: 1.5, //放大到1.5倍

  child: Text("Hello world")

)

);

效果如圖5-13所示:

image.png

#注意

  • Transform的變換是應(yīng)用在繪制階段,而并不是應(yīng)用在布局(layout)階段,所以無論對子組件應(yīng)用何種變化喧笔,其占用空間的大小和在屏幕上的位置都是固定不變的帽驯,因為這些是在布局階段就確定的。下面我們具體說明:

    Row(

    mainAxisAlignment: MainAxisAlignment.center,

    children: <Widget>[

    DecoratedBox(
    
      decoration:BoxDecoration(color: Colors.red),
    
      child: Transform.scale(scale: 1.5,
    
          child: Text("Hello world")
    
      )
    
    ),
    
    Text("你好", style: TextStyle(color: Colors.green, fontSize: 18.0),)
    

    ],

    )

    運行效果如圖5-14所示:

    image.png

    由于第一個Text應(yīng)用變換(放大)后书闸,其在繪制時會放大尼变,但其占用的空間依然為紅色部分,所以第二個Text會緊挨著紅色部分梗劫,最終就會出現(xiàn)文字重合享甸。

  • 由于矩陣變化只會作用在繪制階段,所以在某些場景下梳侨,在UI需要變化時蛉威,可以直接通過矩陣變化來達到視覺上的UI改變,而不需要去重新觸發(fā)build流程走哺,這樣會節(jié)省layout的開銷蚯嫌,所以性能會比較好。如之前介紹的Flow組件丙躏,它內(nèi)部就是用矩陣變換來更新UI择示,除此之外,F(xiàn)lutter的動畫組件中也大量使用了Transform以提高性能晒旅。

思考題:使用Transform對其子組件先進行平移然后再旋轉(zhuǎn)和先旋轉(zhuǎn)再平移栅盲,兩者最終的效果一樣嗎?為什么废恋?

#RotatedBox

RotatedBox和Transform.rotate功能相似谈秫,它們都可以對子組件進行旋轉(zhuǎn)變換,但是有一點不同:RotatedBox的變換是在layout階段鱼鼓,會影響在子組件的位置和大小拟烫。我們將上面介紹Transform.rotate時的示例改一下:

Row(

mainAxisAlignment: MainAxisAlignment.center,

children: <Widget>[

DecoratedBox(

  decoration: BoxDecoration(color: Colors.red),

  //將Transform.rotate換成RotatedBox 

  child: RotatedBox(

    quarterTurns: 1, //旋轉(zhuǎn)90度(1/4圈)

    child: Text("Hello world"),

  ),

),

Text("你好", style: TextStyle(color: Colors.green, fontSize: 18.0),)

],

),

效果如圖5-15所示:

image.png

由于RotatedBox是作用于layout階段,所以子組件會旋轉(zhuǎn)90度(而不只是繪制的內(nèi)容)迄本,decoration會作用到子組件所占用的實際空間上硕淑,所以最終就是上圖的效果,讀者可以和前面Transform.rotate示例對比理解嘉赎。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末置媳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子曹阔,更是在濱河造成了極大的恐慌半开,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赃份,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機抓韩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門纠永,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谒拴,你說我怎么就攤上這事尝江。” “怎么了英上?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵炭序,是天一觀的道長。 經(jīng)常有香客問我苍日,道長惭聂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任相恃,我火速辦了婚禮辜纲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拦耐。我一直安慰自己耕腾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布杀糯。 她就那樣靜靜地躺著扫俺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪固翰。 梳的紋絲不亂的頭發(fā)上狼纬,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音倦挂,去河邊找鬼畸颅。 笑死,一個胖子當(dāng)著我的面吹牛方援,可吹牛的內(nèi)容都是我干的没炒。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼犯戏,長吁一口氣:“原來是場噩夢啊……” “哼送火!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起先匪,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤种吸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呀非,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坚俗,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡镜盯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了猖败。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片速缆。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恩闻,靈堂內(nèi)的尸體忽然破棺而出艺糜,到底是詐尸還是另有隱情,我是刑警寧澤幢尚,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布破停,位于F島的核電站,受9級特大地震影響尉剩,放射性物質(zhì)發(fā)生泄漏真慢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一边涕、第九天 我趴在偏房一處隱蔽的房頂上張望晤碘。 院中可真熱鬧,春花似錦功蜓、人聲如沸园爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽童社。三九已至,卻和暖如春著隆,著一層夾襖步出監(jiān)牢的瞬間扰楼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工美浦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弦赖,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓浦辨,卻偏偏與公主長得像蹬竖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子流酬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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