Flutter利用Hero組件實(shí)現(xiàn)自定義路徑效果的動(dòng)畫(huà)
前言
我們?cè)?nbsp;頁(yè)面切換轉(zhuǎn)場(chǎng)動(dòng)畫(huà),英雄救場(chǎng)更有趣!介紹了 Hero 動(dòng)畫(huà)效果,使用 Hero 用于轉(zhuǎn)場(chǎng)能夠提供非常不錯(cuò)的體驗(yàn)。既然稱之為英雄,肯定還有其他技能,本篇我們就來(lái)探索一下 Hero 動(dòng)畫(huà)的返回效果。
Hero 的定義
Hero 組件是一個(gè) StatefulWidget,構(gòu)造方法如下:
const?Hero({ ??Key??key, ??required?this.tag, ??this.createRectTween, ??this.flightShuttleBuilder, ??this.placeholderBuilder, ??this.transitionOnUserGestures?=?false, ??required?this.child, })
其中 createRectTween
就是一個(gè)矩形插值,用于控制 Hero 組件的路徑。實(shí)際上,和普通動(dòng)畫(huà)一樣,也是有一個(gè)時(shí)間曲線,取值范圍是0-1.0,然后createRectTween
保證 Hero 組件動(dòng)畫(huà)前后能夠達(dá)到矩形指定位置和大小。下面一張圖是官網(wǎng)的說(shuō)明圖:
image.png
RectTween
RectTween 和 Tween類似,實(shí)際上就是矩陣在動(dòng)畫(huà)過(guò)程中的變化。我們來(lái)看 RectTween 的定義:
class?RectTween?extends?Tween<Rect?>?{ ??RectTween({?Rect??begin,?Rect??end?})?:?super(begin:?begin,?end:?end); ??///?通過(guò)給定的動(dòng)畫(huà)時(shí)間值構(gòu)建新的插值矩形 ??@override ??Rect??lerp(double?t)?=>?Rect.lerp(begin,?end,?t); }
這個(gè)類很簡(jiǎn)單,其實(shí)就是每次動(dòng)畫(huà)時(shí)間點(diǎn)上調(diào)用 Rect.lerp
構(gòu)建一個(gè)插值的矩形。Rect.lerp 方法如下:
static?Rect??lerp(Rect??a,?Rect??b,?double?t)?{ ????assert(t?!=?null); ????if?(b?==?null)?{ ??????if?(a?==?null)?{ ????????return?null; ??????}?else?{ ????????final?double?k?=?1.0?-?t; ????????return?Rect.fromLTRB(a.left?*?k,?a.top?*?k,?a.right?*?k,?a.bottom?*?k); ??????} ????}?else?{ ??????if?(a?==?null)?{ ????????return?Rect.fromLTRB(b.left?*?t,?b.top?*?t,?b.right?*?t,?b.bottom?*?t); ??????}?else?{ ????????return?Rect.fromLTRB( ??????????_lerpDouble(a.left,?b.left,?t), ??????????_lerpDouble(a.top,?b.top,?t), ??????????_lerpDouble(a.right,?b.right,?t), ??????????_lerpDouble(a.bottom,?b.bottom,?t), ????????); ??????} ????} ??}
在矩形 a 和矩形 b 都不為空的時(shí)候,返回的就是一個(gè)通過(guò)定點(diǎn)定義的新的矩形。這里的關(guān)鍵是_lerpDouble 方法,其實(shí)最終就是根據(jù)動(dòng)畫(huà)時(shí)間完成頂點(diǎn)的移動(dòng)。
double??lerpDouble(num??a,?num??b,?double?t)?{ ??///?... ??return?a?*?(1.0?-?t)?+?b?*?t; }
也就是從矩形 a 的頂點(diǎn)逐步移動(dòng)到矩形 b的頂點(diǎn),從而完成了兩個(gè)矩形的動(dòng)畫(huà)過(guò)渡。有了這個(gè)基礎(chǔ)我們就可以構(gòu)建自定義的 RectTween 了。和我們的之前說(shuō)過(guò)的動(dòng)畫(huà)曲線(動(dòng)畫(huà)曲線天天用,你能自己整一個(gè)嗎?看完這篇你就會(huì)了!)是類似的。
自定義RectTween
我們來(lái)一個(gè)自定義 RectTween
,然后保證起始點(diǎn)是矩形 a,結(jié)束點(diǎn)是矩形 b,然后中間沿曲線變動(dòng)就可以了。下面是我們利用曲線將時(shí)間轉(zhuǎn)換后得到的一個(gè)自定義 RectTween
。其中使用曲線轉(zhuǎn)換后的transformT
取值還是從0-1.0,然后使用_rectMove
方法就能實(shí)現(xiàn)從開(kāi)始的矩形過(guò)渡到結(jié)束的矩形了。
class?CustomRectTween?extends?RectTween?{ ??final?Rect?begin; ??final?Rect?end; ??CustomRectTween({required?this.begin,?required?this.end}) ??????:?super(begin:?begin,?end:?end); ??@override ??Rect?lerp(double?t)?{ ????double?transformT?=?Curves.easeInOutBack.transform(t); ????var?rect?=?Rect.fromLTRB( ????????_rectMove(begin.left,?end.left,?transformT), ????????_rectMove(begin.top,?end.top,?transformT), ????????_rectMove(end.right,?end.right,?transformT), ????????_rectMove(begin.bottom,?end.bottom,?transformT)); ????return?rect; ??} ??double?_rectMove(double?begin,?double?end,?double?t)?{ ????return?begin?*?(1?-?t)?+?end?*?t; ??} }
運(yùn)行效果
可以看到結(jié)束的時(shí)候,有個(gè)回彈效果,那是因?yàn)槭褂昧?code>Curves.easeInOutBack 這個(gè)曲線。源碼已上傳至:動(dòng)畫(huà)相關(guān)源碼。
運(yùn)行效果
總結(jié)
本篇介紹了 Hero 動(dòng)畫(huà)組件的 createRectTween
屬性實(shí)現(xiàn)自定義路徑效果的動(dòng)畫(huà)。實(shí)際使用的時(shí)候,可以根據(jù)自己需要構(gòu)建一些有趣的路徑提升用戶體驗(yàn)或增加趣味性。
以上就是Flutter利用Hero組件實(shí)現(xiàn)自定義路徑效果的動(dòng)畫(huà)的詳細(xì)內(nèi)容,更多關(guān)于Flutter自定義路徑效果動(dòng)畫(huà)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)拍照截取和相冊(cè)圖片截取
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)拍照截取和相冊(cè)獲取圖片截取,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12Android 使用 Scroller 實(shí)現(xiàn)平滑滾動(dòng)功能的示例代碼
這篇文章主要介紹了Android 使用 Scroller 實(shí)現(xiàn)平滑滾動(dòng)功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07如何使用Matrix對(duì)bitmap的旋轉(zhuǎn)與鏡像水平垂直翻轉(zhuǎn)
本篇文章是對(duì)使用Matrix對(duì)bitmap的旋轉(zhuǎn)與鏡像水平垂直翻轉(zhuǎn)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06Win10下android studio開(kāi)發(fā)環(huán)境配置圖文教程
這篇文章主要為大家詳細(xì)介紹了Win10下android studio開(kāi)發(fā)環(huán)境配置圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android RecyclerView網(wǎng)格布局(支持多種分割線)詳解(2)
這篇文章主要為大家詳細(xì)介紹了Android RecyclerView網(wǎng)格布局,支持多種分割線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02屬于自己的Android對(duì)話框(Dialog)自定義集合
這篇文章主要為大家分享了一個(gè)屬于自己的Android對(duì)話框(Dialog)自定義集合,建立自己的Android對(duì)話框,感興趣的小伙伴們可以參考一下2016-02-02Android實(shí)現(xiàn)圓形純數(shù)字按鈕
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓形純數(shù)字按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02Android筆記之:CM9源碼下載與編譯的應(yīng)用
本篇文章介紹了,在Android中CM9源碼下載與編譯的應(yīng)用,需要的朋友參考下2013-04-04autojs模仿QQ長(zhǎng)按彈窗菜單實(shí)現(xiàn)示例
這篇文章主要為大家介紹了autojs模仿QQ長(zhǎng)按彈窗菜單實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01