Flutter酷炫的路由动画效果
现在Flutter的路由效果已经非常不错了,能满足大部分App的需求,但是谁不希望自己的App更酷更炫那,下面介绍几个酷炫的路由动画。
其实路由动画的原理很简单,就是重写并继承PageRouterBuilder这个类里的transitionsBuilder方法。
不过这个方法还是有很多写法的,通过写法的不同,产生的动画效果也有所不同。

1、渐隐渐现的动画效果
先编写一个主入口方法,还是最简单的格式,只不过home属性,使用的RouterFirst的组件是我们自定义的,需要我们再次编写。入口文件的代码如下:
import 'package:flutter/material.dart';
import 'pages.dart'; void main()=>runApp(MyApp()); class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title:'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
home:RouterFirst()
);
}
}
然后是pages.dart,这个文件就是生成了两个页面(Flutter里的页面也是Widget,这个你要跟网页区分开)。有了两个页面就可以实现路由跳转了。
这里我们先用普通路由代替,看一看效果。
import 'package:flutter/material.dart';
class RouterFirst extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.red, //背景色
appBar: AppBar(
title: Text('FirstPage',style: TextStyle(fontSize: 36.0)),
elevation: 4.0, //0-4 和下面body的融合程度,0是不显示分隔状态,不写默认是4
),
body: Center(
child: MaterialButton(
child: Icon(
Icons.navigate_next,
color: Colors.white,
size: 64.0
),
onPressed: (){
Navigator.of(context).push(MaterialPageRoute(builder:(BuildContext context){
return RouterSecond();
}));
},
),
),
);
}
}
class RouterSecond extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: Colors.lightBlue,
appBar: AppBar(
title: Text('SecondPage',style:TextStyle(fontSize:36.0),),
backgroundColor: Colors.lightBlue,
leading:Container(),
elevation: 0.0,
),
body:Center(
child: MaterialButton(
child: Icon(
Icons.navigate_before,
color:Colors.white,
size:64.0
),
onPressed: ()=>Navigator.of(context).pop(),
),
)
);
}
}
上面代码中有一个新知识点,需要学习一下:
AppBar Widger的 elevation 属性:这个值是AppBar 滚动时的融合程度,一般有滚动时默认是4.0,现在我们设置成0.0,就是和body完全融合了。
写完这个页面代码后,已经可以进行最基本的导航了,但是并没有什么酷炫的动画。
自定义CustomRoute Widget
这个就是要自定义的路由方法,自定义首先要继承于通用的路由的构造器类PageRouterBuilder。继承之后重写父类的CustomRoute构造方法。
构造方法可以简单理解为:只要以调用这个类或者说是Widget,构造方法里的所有代码就执行了。
代码如下:
class CustomRoute extends PageRouteBuilder{
final Widget widget;
//构造方法
CustomRoute(this.widget)
:super(
transitionDuration:Duration(seconds: ), //过渡时间
pageBuilder:( //构造器
BuildContext context,
Animation<double> animation1,
Animation<double> animation2,
){
return widget;
},
transitionsBuilder:(
BuildContext context,
Animation<double> animation1,
Animation<double> animation2,
Widget child
){
return FadeTransition(
opacity: Tween(begin: 0.0,end: 1.0)
.animate(CurvedAnimation(
parent: animation1,
curve: Curves.fastOutSlowIn, //动画曲线
)),
child: child,
);
}
);
}
FadeTransition:渐隐渐现过渡效果,主要设置opactiy(透明度)属性,值是0.0-1.0。
animate :动画的样式,一般使用动画曲线组件(CurvedAnimation)。
curve: 设置动画的节奏,也就是常说的曲线,Flutter准备了很多节奏,通过改变动画取消可以做出很多不同的效果。
transitionDuration:设置动画持续的时间,建议再1和2之间。
最后要把上面onPressed代码修改下:
onPressed: (){
// Navigator.of(context).push(MaterialPageRoute(builder:(BuildContext context){
// return RouterSecond();
// }));
Navigator.of(context).push(CustomRoute(RouterSecond()));
},
写完代码,我们已经可以看到在切换路由时有了渐隐渐现的动画效果。

2、缩放的动画效果
修改transitionsBuilder下{ }里的内容
//缩放的动画效果
return ScaleTransition(
scale: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(
parent: animation1,
curve: Curves.fastOutSlowIn,
)),
child: child,
);

3、旋转+缩放动画效果
旋转+缩放的思路是在一个路由动画里的child属性里再加入一个动画,让两个动画同时执行。来看详细代码:
//旋转+缩放动画效果
return RotationTransition(
turns: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(
parent:animation1,
curve: Curves.fastOutSlowIn
)),
child: ScaleTransition(
scale: Tween(begin: 0.0,end: 1.0).animate(CurvedAnimation(
parent: animation1,
curve: Curves.fastOutSlowIn
)),
child: child,
),
);

4、左侧滑动进入退出动画
其实用的做多的还是左右滑动路由动画,其实实现起来也是非常简单,直接使用SlideTransition就可以了。
//左侧滑动进入退出
return SlideTransition(
position: Tween<Offset>(
begin: Offset(-1.0, 0.0),
end: Offset(0.0, 0.0)
).animate(CurvedAnimation(
parent: animation1,
curve:Curves.fastOutSlowIn
)),
child: child,
);
Flutter酷炫的路由动画效果的更多相关文章
- 【Flutter 实战】酷炫的开关动画效果
此动画效果是我在浏览文章时发现的一个非常酷炫的效果,于是就使用 Flutter 实现了. 更多动画效果及Flutter资源:https://github.com/781238222/flutter-d ...
- 20个Flutter实例视频教程-第05节: 酷炫的路由动画-1
视屏地址: https://www.bilibili.com/video/av39709290/?p=5 博客地址: https://jspang.com/post/flutterDemo.html# ...
- 20个Flutter实例视频教程-第06节: 酷炫的路由动画-2
博客地址: https://jspang.com/post/flutterDemo.html#toc-94f 视频地址: https://jspang.com/post/flutterDemo.htm ...
- 067——VUE中vue-router之使用transition设置酷炫的路由组件过渡动画效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [转]收集android上开源的酷炫的交互动画和视觉效果:Interactive-animation
原文链接:http://www.open-open.com/lib/view/open1411443332703.html 描述:收集android上开源的酷炫的交互动画和视觉效果. 1.交互篇 2. ...
- [转]收集android上开源的酷炫的交互动画和视觉效果
原文链接:http://www.open-open.com/lib/view/open1411443332703.html 描述:收集android上开源的酷炫的交互动画和视觉效果. 1.交互篇 2. ...
- 使用纯 CSS 实现超酷炫的粘性气泡效果
最近,在 CodePen 上看到这样一个非常有意思的效果: 这个效果的核心难点在于气泡的一种特殊融合效果. 其源代码在:CodePen Demo -- Goey footer,作者主要使用的是 SVG ...
- 纯CSS3写的10个不同的酷炫图片遮罩层效果【转】
这个是纯CSS3实现的的10个不同的酷炫图片遮罩层效果,可以欣赏一下 在线预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
- 纯CSS3写的10个不同的酷炫图片遮罩层效果
这个是纯CSS3实现的的10个不同的酷炫图片遮罩层效果,可以欣赏一下 在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1 ...
随机推荐
- [转载]Java 内存分配全面浅析
Java 内存分配全面浅析 2013-02-20 17:54:45 袭烽 阅读数 91353更多 分类专栏: java基础 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Ja ...
- Lua 学习之基础篇七<Lua Module,Package介绍>
Lua 之Module介绍 包管理库提供了从 Lua 中加载模块的基础库. 只有一个导出函数直接放在全局环境中: [require]. 所有其它的部分都导出在表 package 中. require ...
- linux基础知识和常用命令
1.修改主机名 切换到root,然后执行 vim /etc/sysconfig/network,进入其中,更改hostname即可.insert进入修改,esc+:,wq保存退出. 2.用户切换 普通 ...
- 【vue】vue-cli中 对于public文件夹的处理
pubcli和assets文件夹都是用来存储静态资源的,: [assets文件夹] 通过相对路径被引入,这类引用会被webpack处理: 比如: 会被编译成: 再比如: 会被编译成: [public文 ...
- BZOJ 1420 Discrete Root
思路:数学大汇总 提交:\(3\)次 错因:有一个\(j\)写成\(i\) 题解: 求:\(x^k \equiv a \mod p\) 我们先转化一下:求出\(p\)的原根\(g\) 然后我们用\(B ...
- 004_STM32程序移植之_SHTXX
1. 测试环境:STM32C8T6 2. 测试模块:DS1302时钟模块 3. 测试接口: SHTXX土壤温湿度: VCC------------------3.3V GND------------- ...
- Poj 2976 Dropping tests(01分数规划 牛顿迭代)
Dropping tests Time Limit: 1000MS Memory Limit: 65536K Description In a certain course, you take n t ...
- mysql 进程
--------------------查看mysql所有进程-----------show full processlist -------------------查看mysql 账号权限----- ...
- C#连接数据库时connectionStrings配置
<connectionStrings> <add name="ConnectionStringName" connectionString="Data ...
- c++ 数据类型长度
#include <iostream> using namespace std; int main() { cout << "char: " << ...