网易首页 > 网易号 > 正文 申请入驻

flutter系列之:如何自定义动画路由

0
分享至

简介

flutter中有默认的Route组件,叫做MaterialPageRoute,一般情况下我们在flutter中进行跳转的话,只需要向Navigator中传入一个MaterialPageRoute就可以了。

但是MaterialPageRoute太普通了,如果我们想要做点不同的跳转特效应该如何处理呢?

一起来看看吧。

自定义跳转使用

正常情况下,我们进行路由跳转需要用到Navigator和MaterialPageRoute,如下所示:

Navigator.push(context, MaterialPageRoute(builder: (context) {
return const NextPage();

如果要实现特定的路由动画,那么需要进行路由的自定义。

在flutter中也就是要使用PageRouteBuilder来自定义一个Route。

先来看下PageRouteBuilder的定义:

class PageRouteBuilder extends PageRoute {

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 animation, Animation secondaryAnimation, Widget child);

所以理论上,我们可以返回任何widget,但是一般来说,我们会返回一个AnimatedWidget,表示一个动画效果。

flutter动画基础

flutter中有个专门的动画包叫做flutter/animation.dart, flutter中所有动画的核心叫做Animation。

Animation中定义了很多listener用来监控动画的变动情况,并且还提供了一个AnimationStatus来存储当前的动画状态:

abstract class Animation extends Listenable implements ValueListenable {
const Animation();

AnimationWithParentMixin

@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来实现自己的变动曲线。

实现一个自定义的route

这里我们使用flutter中的SlideTransition,SlideTransition是一个AnimatedWidget,它表示的是一个组件的位置变化的动画。

class SlideTransition extends AnimatedWidget {
const SlideTransition({
super.key,
required Animation 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位置沿不同的曲线变化即可。

本文的例子:https://github.com/ddean2009/learn-flutter.git

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
曾杀害14名中国人、诈骗金额超100亿…缅北明家11人被执行死刑

曾杀害14名中国人、诈骗金额超100亿…缅北明家11人被执行死刑

新加坡万事通
2026-01-29 19:36:43
享界全新SUV渲染图曝光 采用“方盒子”造型 配小蓝灯

享界全新SUV渲染图曝光 采用“方盒子”造型 配小蓝灯

CNMO科技
2026-01-29 10:06:10
站在中国领土上,英国首相一句话震动欧洲,美国直接对中国摊牌了

站在中国领土上,英国首相一句话震动欧洲,美国直接对中国摊牌了

古史青云啊
2026-01-29 16:19:42
朝鲜战场志愿军大胜,彭德怀与金日成产生激烈争执,彭德怀直言:不行你们自己指挥

朝鲜战场志愿军大胜,彭德怀与金日成产生激烈争执,彭德怀直言:不行你们自己指挥

老杉说历史
2025-12-22 21:03:12
钟欣怡嫁孙乐欣「遭强烈反对」!不顾劝阻披婚纱嫁了 12年后吐心声

钟欣怡嫁孙乐欣「遭强烈反对」!不顾劝阻披婚纱嫁了 12年后吐心声

ETtoday星光云
2026-01-29 16:50:46
快船消息:哈登无愧最强双能卫,拒绝3换1交易,战掘金出场更新

快船消息:哈登无愧最强双能卫,拒绝3换1交易,战掘金出场更新

冷月小风风
2026-01-29 12:08:26
花椒立大功?浙大研究发现:花椒可在36小时清除70%老化细胞?

花椒立大功?浙大研究发现:花椒可在36小时清除70%老化细胞?

蜉蝣说
2026-01-28 11:09:12
伊朗,现代人类文明的伤疤

伊朗,现代人类文明的伤疤

科海识贝sci
2026-01-15 16:44:32
0130早评:黄金白银巨震!服务消费利好,只低吸不追高

0130早评:黄金白银巨震!服务消费利好,只低吸不追高

孤烟财经
2026-01-30 07:05:12
她一生“风流成性、老少通吃”,撩汉无数,现如今56岁却依旧单身

她一生“风流成性、老少通吃”,撩汉无数,现如今56岁却依旧单身

青橘罐头
2026-01-28 11:57:14
孙绍骋被查;FBI调查大选;熊海涛被查;英重视对华关系 | 1月30日要闻日报

孙绍骋被查;FBI调查大选;熊海涛被查;英重视对华关系 | 1月30日要闻日报

今日时事要闻
2026-01-30 01:09:27
摩登女郎:一场对当代性的主动投靠

摩登女郎:一场对当代性的主动投靠

疾跑的小蜗牛
2026-01-26 22:47:31
保险公司回应“金晨被曝肇事逃逸”:报案后进行现场查勘,过程中客户放弃索赔,依程序撤销报案

保险公司回应“金晨被曝肇事逃逸”:报案后进行现场查勘,过程中客户放弃索赔,依程序撤销报案

红星新闻
2026-01-29 18:34:20
高洁主任:一个简单动作,让阳气“乖乖回家”,沾床就睡

高洁主任:一个简单动作,让阳气“乖乖回家”,沾床就睡

蜡笔小小子
2026-01-22 14:15:45
董卿父亲董善祥:我这辈子最后悔的事,就是让宝贝女儿嫁给密春雷

董卿父亲董善祥:我这辈子最后悔的事,就是让宝贝女儿嫁给密春雷

星星会坠落
2026-01-29 22:55:49
乌克兰:悔到肠子青,当年卖给中国三架“废铁”,今成大国重器?

乌克兰:悔到肠子青,当年卖给中国三架“废铁”,今成大国重器?

素衣读史
2026-01-26 18:51:48
俄罗斯警告塞尔维亚别乱来,中国不愿看到的一幕发生,武契奇急了

俄罗斯警告塞尔维亚别乱来,中国不愿看到的一幕发生,武契奇急了

有牙的兔纸
2026-01-30 03:33:01
爆冷!队史首胜辽篮 62分耻辱之夜:外援为王时代 抠门真赢不了?

爆冷!队史首胜辽篮 62分耻辱之夜:外援为王时代 抠门真赢不了?

你看球呢
2026-01-30 07:00:19
一场2-1改写两队命运,安东尼神了:独造2球,率队杀入16强

一场2-1改写两队命运,安东尼神了:独造2球,率队杀入16强

足球狗说
2026-01-30 06:28:31
四连胜!黄蜂强势崛起,这一阵容竟打出10胜1负神战绩

四连胜!黄蜂强势崛起,这一阵容竟打出10胜1负神战绩

大眼瞄世界
2026-01-29 21:37:18
2026-01-30 07:36:49
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

周亚辉的AI新赌局:国内太卷 出海另起炉灶

头条要闻

金晨被指肇事逃逸让助理顶包 律师:顶包者或被判刑

头条要闻

金晨被指肇事逃逸让助理顶包 律师:顶包者或被判刑

体育要闻

詹姆斯哭了!骑士视频致敬41岁超巨

娱乐要闻

曝金晨涉嫌交通肇事逃逸 本人尚未回应

财经要闻

崔东树:中国汽车未来年销或达5000万辆

汽车要闻

车长超5米还带后轮转向 比亚迪海豹08/海狮08将亮相

态度原创

房产
家居
本地
亲子
军事航空

房产要闻

寰岛学校卖楼,二次流拍!

家居要闻

极简轻奢 家的无限可能

本地新闻

云游中国|拨开云雾,巫山每帧都是航拍大片

亲子要闻

严格婴幼儿配方液态乳生产许可条件 市场监管总局发布审查细则

军事要闻

中方被指支持俄生产武器 外交部回应

无障碍浏览 进入关怀版