<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
flutter中有預設的Route元件,叫做MaterialPageRoute,一般情況下我們在flutter中進行跳轉的話,只需要向Navigator中傳入一個MaterialPageRoute就可以了。
但是MaterialPageRoute太普通了,如果我們想要做點不同的跳轉特效應該如何處理呢?
一起來看看吧。
正常情況下,我們進行路由跳轉需要用到Navigator和MaterialPageRoute,如下所示:
Navigator.push(context, MaterialPageRoute(builder: (context) { return const NextPage();
如果要實現特定的路由動畫,那麼需要進行路由的自定義。
在flutter中也就是要使用PageRouteBuilder來自定義一個Route。
先來看下PageRouteBuilder的定義:
class PageRouteBuilder<T> extends PageRoute<T> { PageRouteBuilder({ super.settings, required this.pageBuilder, this.transitionsBuilder = _defaultTransitionsBuilder, this.transitionDuration = const Duration(milliseconds: 300), this.reverseTransitionDuration = const Duration(milliseconds: 300), this.opaque = true, this.barrierDismissible = false, this.barrierColor, this.barrierLabel, this.maintainState = true, super.fullscreenDialog, })
PageRouteBuilder也是PageRoute的一種,在構建PageRouteBuilder的時候,通過控制不同的屬性值,我們可以自由控制pageBuilder,transitionsBuilder,transitionDuration,reverseTransitionDuration等特性。
可以看到自由程度還是非常高的。
其中pageBuilder是路由將會跳轉的頁面,這個是必須要指定的,要不然路由也就沒有意義了。
另外路由轉換的效果可以經由transitionsBuilder來設定。
這裡的RouteTransitionsBuilder是一個Function,返回一個Widget:
typedef RouteTransitionsBuilder = Widget Function(BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child);
所以理論上,我們可以返回任何widget,但是一般來說,我們會返回一個AnimatedWidget,表示一個動畫效果。
flutter中有個專門的動畫包叫做flutter/animation.dart, flutter中所有動畫的核心叫做Animation。
Animation中定義了很多listener用來監控動畫的變動情況,並且還提供了一個AnimationStatus來儲存當前的動畫狀態:
abstract class Animation<T> extends Listenable implements ValueListenable<T> { const Animation(); AnimationWithParentMixin<T> @override void addListener(VoidCallback listener); @override void removeListener(VoidCallback listener); void addStatusListener(AnimationStatusListener listener); void removeStatusListener(AnimationStatusListener listener); AnimationStatus get status;
AnimationStatus是一個列舉類,它包含了現在動畫的各種狀態:
enum AnimationStatus { dismissed, forward, reverse, completed, }
dismissed表示動畫暫停在開頭。
forward表示動畫在從頭到尾播放。
reverse表示動畫在從尾到頭播放。
completed表示動畫播放完畢,停在了結尾。
有了動畫的表示之後,如何對動畫進行控制呢?這裡就需要用到AnimationController了。
AnimationController可以控制動畫的duration,動畫的最低值lowerBound預設是0.0,動畫的最高值upperBound預設是1.0等等。
預設情況AnimationController中從最低值到最高值是線性變化的,如果你想設定不同的Bound值,那麼可以嘗試自定義 Animatable, 如果你想動畫的變動是非線性的,那麼可以嘗試繼承Animation來實現自己的變動曲線。
這裡我們使用flutter中的SlideTransition,SlideTransition是一個AnimatedWidget,它表示的是一個元件的位置變化的動畫。
class SlideTransition extends AnimatedWidget { const SlideTransition({ super.key, required Animation<Offset> position, this.transformHitTests = true, this.textDirection, this.child, }) : assert(position != null), super(listenable: position);
看下它的建構函式,可以看到SlideTransition需要一個position的屬性,這個position是一個Animation物件,裡面包含的是Offset。
同時這個position是一個listenable物件,通過監聽裡面Offset的變化,從而重新build對應的widget從而實現動畫的效果。
Offset是一個表示位置的類,(0,0) 表示這個widget的左頂點在螢幕的左上角,同樣的(1,1)表示這個widget的左頂點在螢幕的右下角。
因為route過後是一個新的頁面,我們希望出現一個頁面從右下角移動到左上角的動畫,那麼我們可以這樣做:
Route customRoute() { return PageRouteBuilder( pageBuilder: (context, animation, secondaryAnimation) => const SecondPage(), transitionsBuilder: (context, animation, secondaryAnimation, child) { const begin = Offset(1.0, 1.0); const end = Offset.zero; const curve = Curves.easeOut; var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve)); return SlideTransition( position: animation.drive(tween), child: child, ); }, ); }
這裡的begin和end表示widget從螢幕的右下角移動到了螢幕的左上角。
Tween表示的是開始值和結束值之間的線性插值,是一個動態過程,另外我們還可以這個插值變動的曲線,這裡使用了CurveTween,選中了Curves.easeOut這種曲線型別。
最後呼叫animation.drive方法把Tween和Animation關聯起來,這樣一個路由動畫就完成了。
最後程式執行的結果如下:
其實flutter中的動畫很簡單,大家記住就是widget位置沿不同的曲線變化即可。
本文的例子:github.com/ddean2009/learn-flutter
以上就是詳解Android Flutter如何自定義動畫路由的詳細內容,更多關於Android 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