您好,登錄后才能下訂單哦!
這篇“Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果”文章吧。
Hero 組件是一個 StatefulWidget,構(gòu)造方法如下:
const Hero({ Key? key, required this.tag, this.createRectTween, this.flightShuttleBuilder, this.placeholderBuilder, this.transitionOnUserGestures = false, required this.child, })
其中 createRectTween
就是一個矩形插值,用于控制 Hero 組件的路徑。實(shí)際上,和普通動畫一樣,也是有一個時間曲線,取值范圍是0-1.0,然后createRectTween
保證 Hero 組件動畫前后能夠達(dá)到矩形指定位置和大小。下面一張圖是官網(wǎng)的說明圖:
RectTween 和 Tween類似,實(shí)際上就是矩陣在動畫過程中的變化。我們來看 RectTween 的定義:
class RectTween extends Tween<Rect?> { RectTween({ Rect? begin, Rect? end }) : super(begin: begin, end: end); /// 通過給定的動畫時間值構(gòu)建新的插值矩形 @override Rect? lerp(double t) => Rect.lerp(begin, end, t); }
這個類很簡單,其實(shí)就是每次動畫時間點(diǎn)上調(diào)用 Rect.lerp
構(gòu)建一個插值的矩形。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 都不為空的時候,返回的就是一個通過定點(diǎn)定義的新的矩形。這里的關(guān)鍵是_lerpDouble 方法,其實(shí)最終就是根據(jù)動畫時間完成頂點(diǎn)的移動。
double? lerpDouble(num? a, num? b, double t) { /// ... return a * (1.0 - t) + b * t; }
也就是從矩形 a 的頂點(diǎn)逐步移動到矩形 b的頂點(diǎn),從而完成了兩個矩形的動畫過渡。有了這個基礎(chǔ)我們就可以構(gòu)建自定義的 RectTween 了。和我們的之前說過的動畫曲線(動畫曲線天天用,你能自己整一個嗎?看完這篇你就會了?。┦穷愃频?。
我們來一個自定義 RectTween
,然后保證起始點(diǎn)是矩形 a,結(jié)束點(diǎn)是矩形 b,然后中間沿曲線變動就可以了。下面是我們利用曲線將時間轉(zhuǎn)換后得到的一個自定義 RectTween
。其中使用曲線轉(zhuǎn)換后的transformT
取值還是從0-1.0,然后使用_rectMove
方法就能實(shí)現(xiàn)從開始的矩形過渡到結(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; } }
以上就是關(guān)于“Flutter怎么利用Hero組件實(shí)現(xiàn)自定義路徑動畫效果”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。