<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們在 頁面切換轉場動畫,英雄救場更有趣!介紹了 Hero 動畫效果,使用 Hero 用於轉場能夠提供非常不錯的體驗。既然稱之為英雄,肯定還有其他技能,本篇我們就來探索一下 Hero 動畫的返回效果。
Hero 元件是一個 StatefulWidget,構造方法如下:
const Hero({ Key? key, required this.tag, this.createRectTween, this.flightShuttleBuilder, this.placeholderBuilder, this.transitionOnUserGestures = false, required this.child, })
其中 createRectTween
就是一個矩形插值,用於控制 Hero 元件的路徑。實際上,和普通動畫一樣,也是有一個時間曲線,取值範圍是0-1.0,然後createRectTween
保證 Hero 元件動畫前後能夠達到矩形指定位置和大小。下面一張圖是官網的說明圖:
image.png
RectTween 和 Tween類似,實際上就是矩陣在動畫過程中的變化。我們來看 RectTween 的定義:
class RectTween extends Tween<Rect?> { RectTween({ Rect? begin, Rect? end }) : super(begin: begin, end: end); /// 通過給定的動畫時間值構建新的插值矩形 @override Rect? lerp(double t) => Rect.lerp(begin, end, t); }
這個類很簡單,其實就是每次動畫時間點上呼叫 Rect.lerp
構建一個插值的矩形。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 都不為空的時候,返回的就是一個通過定點定義的新的矩形。這裡的關鍵是_lerpDouble 方法,其實最終就是根據動畫時間完成頂點的移動。
double? lerpDouble(num? a, num? b, double t) { /// ... return a * (1.0 - t) + b * t; }
也就是從矩形 a 的頂點逐步移動到矩形 b的頂點,從而完成了兩個矩形的動畫過渡。有了這個基礎我們就可以構建自定義的 RectTween 了。和我們的之前說過的動畫曲線(動畫曲線天天用,你能自己整一個嗎?看完這篇你就會了!)是類似的。
我們來一個自定義 RectTween
,然後保證起始點是矩形 a,結束點是矩形 b,然後中間沿曲線變動就可以了。下面是我們利用曲線將時間轉換後得到的一個自定義 RectTween
。其中使用曲線轉換後的transformT
取值還是從0-1.0,然後使用_rectMove
方法就能實現從開始的矩形過渡到結束的矩形了。
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; } }
可以看到結束的時候,有個回彈效果,那是因為使用了Curves.easeInOutBack
這個曲線。原始碼已上傳至:動畫相關原始碼。
執行效果
本篇介紹了 Hero 動畫元件的 createRectTween
屬性實現自定義路徑效果的動畫。實際使用的時候,可以根據自己需要構建一些有趣的路徑提升使用者體驗或增加趣味性。
以上就是Flutter利用Hero元件實現自定義路徑效果的動畫的詳細內容,更多關於Flutter自定義路徑效果動畫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45