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

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.

相关推荐
热点推荐
雷暴!大风!冰雹!强对流天气将抵达广西【930新闻眼】

雷暴!大风!冰雹!强对流天气将抵达广西【930新闻眼】

930老友记
2025-03-01 22:45:11
为什么突然感觉列强都不强了?(深度好文)

为什么突然感觉列强都不强了?(深度好文)

阿燕姐说育儿
2025-02-28 00:41:07
著名杀猪盘——韩国浦项钢铁,被印度折磨了十二年,没炼一斤铁

著名杀猪盘——韩国浦项钢铁,被印度折磨了十二年,没炼一斤铁

蓝色海边
2025-02-27 10:31:23
女篮大换血!宫鲁鸣确定奥运第一核心,讽刺某大牌球星花里胡哨!

女篮大换血!宫鲁鸣确定奥运第一核心,讽刺某大牌球星花里胡哨!

猎奇密探
2025-03-01 19:20:05
这不抢风头吗!河南一伴娘把礼服穿成抹胸裙:新郎都有些不好意思

这不抢风头吗!河南一伴娘把礼服穿成抹胸裙:新郎都有些不好意思

唐小糖说情感
2025-02-19 15:46:20
2025中国女篮12人大名单换血,没有人情世故,只看能力和战术需求

2025中国女篮12人大名单换血,没有人情世故,只看能力和战术需求

二疯说球
2025-02-28 13:42:51
败光3亿!哈里凌晨给威廉转账记录曝光,女王棺材板压不住了

败光3亿!哈里凌晨给威廉转账记录曝光,女王棺材板压不住了

沧海一书客
2025-02-27 08:54:07
2025年工商银行存款利率上涨?存20万到期利息11400,储户有福了

2025年工商银行存款利率上涨?存20万到期利息11400,储户有福了

如烟财道
2025-03-01 14:21:22
美媒高呼裁判可耻:勒布朗被击中面门还“边缘接触” 老詹IG回顾

美媒高呼裁判可耻:勒布朗被击中面门还“边缘接触” 老詹IG回顾

颜小白的篮球梦
2025-03-01 20:11:07
世乒赛提前抽签,理由无非只有3个,国乒难题来了,刘国梁难抉择

世乒赛提前抽签,理由无非只有3个,国乒难题来了,刘国梁难抉择

时刻体育正版
2025-02-28 23:32:42
2025浙江养老金调整预测:人均涨幅或破4%关口,这些人领最多!

2025浙江养老金调整预测:人均涨幅或破4%关口,这些人领最多!

娱乐洞察点点
2025-03-01 17:32:19
爆!吴越赵文瑄官宣恋情,娱乐圈又添甜蜜CP!陈建斌选择了沉默...

爆!吴越赵文瑄官宣恋情,娱乐圈又添甜蜜CP!陈建斌选择了沉默...

澳洲红领巾
2025-02-28 12:34:11
江苏女排3-0战胜上海女排,赛后传来3个好消息和1个坏消息

江苏女排3-0战胜上海女排,赛后传来3个好消息和1个坏消息

郝小小看体育
2025-03-01 17:26:18
尊界法务出手了!对造谣抹者黑已报案取证,涉事者已被公安处罚!

尊界法务出手了!对造谣抹者黑已报案取证,涉事者已被公安处罚!

阿纂看事
2025-03-01 10:42:57
暴雷两个半月后崩系统?极越车机APP开始出问题了……

暴雷两个半月后崩系统?极越车机APP开始出问题了……

柴狗夫斯基
2025-02-27 11:31:54
中国船进港要掏150万美金?美犯下致命错误,全球哗然!

中国船进港要掏150万美金?美犯下致命错误,全球哗然!

速看报料
2025-03-01 16:44:23
做事都得先攀关系!一个北方人到江浙沪5年后,痛斥北方衰落原因

做事都得先攀关系!一个北方人到江浙沪5年后,痛斥北方衰落原因

西游日记
2024-01-11 10:50:25
刘太阳为啥这么火?看看她的身材,这能不火吗!

刘太阳为啥这么火?看看她的身材,这能不火吗!

星辰生肖馆
2025-03-02 01:27:49
婚礼大屏幕上惊现他人不雅照,现场600人播了近半分钟,新人起诉索赔!婚庆公司:司仪、调音都是外包的

婚礼大屏幕上惊现他人不雅照,现场600人播了近半分钟,新人起诉索赔!婚庆公司:司仪、调音都是外包的

大风新闻
2025-03-01 08:46:03
未来可期!18岁王钰栋本轮首发,18岁刘诚宇、19岁朱鹏宇中超首秀

未来可期!18岁王钰栋本轮首发,18岁刘诚宇、19岁朱鹏宇中超首秀

直播吧
2025-03-01 21:46:40
2025-03-02 05:28:49
flydean程序那些事
flydean程序那些事
最通俗的解读,最深刻的干货!
356文章数 438关注度
往期回顾 全部

科技要闻

再次震惊!价格屠夫DeepSeek理论利润率545%

头条要闻

特朗普"吵架"时怼CNN:收视率这么低 先关心自己死活吧

头条要闻

特朗普"吵架"时怼CNN:收视率这么低 先关心自己死活吧

体育要闻

詹姆斯连创多项第一 核心PK完胜小卡

娱乐要闻

方大同悼念仪式完成 生前最后话语曝光

财经要闻

雷军,释放了一个新信号

汽车要闻

2025款小鹏G6发布 标配图灵AI智驾/5C超充电池

态度原创

教育
亲子
旅游
本地
手机

教育要闻

小升初数学几何题,今天辅导侄女很久,才把她教会

亲子要闻

小孩哥盼了几个月的弟弟,最后得知是妹妹一整个破大防。

旅游要闻

乘客曝被航班上用过的针头扎出血,多次自费检查并确诊中度抑郁

本地新闻

云游中国|来雁塔区,变身长安潮人

手机要闻

中国手机市场格局变迁:华为凤凰涅槃,苹果仅排第四名!

无障碍浏览 进入关怀版