Flutter动画 4 - Hero动画
概述
花瓣App的转场动画,这么多年还是没变,还是图片转场动画.
网上有很多人实现过相关效果,先前骚栋18年在做iOS项目的时候,也实现的类似的效果,但是全程实现起来还是比较麻烦,需要自己来定义转场动画.在Flutter中也提供了相关效果的组件,那就是 Hero . 接下来我们就来看一下Hero组件实现这种转场动画效果,整体来说还是比较简单的.
Hero动画
首先看一下Hero的构建方法.
其中有两个参数是必须要传入的,一个是final Object tag;
,是两个路由需要实现Hero动画组件的唯一标识.另外一个就是final Widget child;
,是需要执行动画的具体视图组件,可以是个头像,图片,文字等等都是可以的.
const Hero({Key key,@required this.tag,this.createRectTween,this.flightShuttleBuilder,this.placeholderBuilder,this.transitionOnUserGestures = false,@required this.child,}) : assert(tag != null),assert(transitionOnUserGestures != null),assert(child != null),super(key: key);
接下来我们就以一个普通Container组件为例,看一下具有应该怎么实现Hero动画.
首先,我们先创建一个StatelessWidget - FlutterHeroAnimationFirstPage
,当做起始路由.在build构建方法中,我们创建一个Hero组件和一个用于点击跳转的Button组件.Hero组件定义Tag值为HeroAnimationTag
.代码如下所示,
@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Hero(tag: "HeroAnimationTag",child: Container(width: 100,height: 100,margin: EdgeInsets.only(bottom: 10),color: Colors.redAccent,),),FlatButton(onPressed: (){_startHeroAnimation(context);},child: Text("点击执行Hero动画",style: TextStyle(color: Colors.black38),),),],),),);}
对于路由调转方案,虽然使用其他路由形式也是可以的,但是这里我推荐使用 PageRouteBuilder + FadeTransition
两者配合使用,具体路由跳转方法_startHeroAnimation
代码如下所示.
void _startHeroAnimation(BuildContext context) {Navigator.push(context, PageRouteBuilder(pageBuilder: (BuildContext context, Animation animation,Animation secondaryAnimation) {return new FadeTransition(opacity: animation,child: FlutterHeroAnimationSecondPage(),);}));}
然后第二路由中的Widget就比较简单了. 在build构建方法中, 依然需要创建一个Hero组件,并且Tag值要与先前的保持一致.当然了,这里我也创建了一个Button,用于返回上一个路由.具体代码如下所示.
class FlutterHeroAnimationSecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.start,children: [Hero(tag: "HeroAnimationTag",child: Container(height: 100,margin: EdgeInsets.only(bottom: 10, left: 0, right: 0),color: Colors.redAccent,),),FlatButton(onPressed: () {Navigator.pop(context);},child: Text("点击返回",style: TextStyle(color: Colors.black38),),),],),),);}
}
Hero动画实现效果如下所示.
整体示例代码
整体代码实现比较简单,这里就不传Github了,直接贴出来了.具体如下所示.
class FlutterHeroAnimationFirstPage extends StatelessWidget {void _startHeroAnimation(BuildContext context) {Navigator.push(context, PageRouteBuilder(pageBuilder: (BuildContext context, Animation animation,Animation secondaryAnimation) {return new FadeTransition(opacity: animation,child: FlutterHeroAnimationSecondPage(),);}));}@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.center,children: [Hero(tag: "HeroAnimationTag",child: Container(width: 100,height: 100,margin: EdgeInsets.only(bottom: 10),color: Colors.redAccent,),),FlatButton(onPressed: (){_startHeroAnimation(context);},child: Text("点击执行Hero动画",style: TextStyle(color: Colors.black38),),),],),),);}
}class FlutterHeroAnimationSecondPage extends StatelessWidget {@overrideWidget build(BuildContext context) {return Scaffold(body: Center(child: Column(mainAxisAlignment: MainAxisAlignment.start,children: [Hero(tag: "HeroAnimationTag",child: Container(height: 100,margin: EdgeInsets.only(bottom: 10, left: 0, right: 0),color: Colors.redAccent,),),FlatButton(onPressed: () {Navigator.pop(context);},child: Text("点击返回",style: TextStyle(color: Colors.black38),),),],),),);}
}
结语
Hero动画实现过程比较简单,所有的工作都是由Flutter内部帮我们完成的,Flutter Framework知道新旧路由页中共享元素的位置和大小,所以根据这两个端点,在动画执行过程中求出过渡时的插值(中间态)即可.
欢迎持续关注骚栋,有任何问题欢迎联系骚栋.
Flutter动画 4 - Hero动画相关推荐
- Flutter(十六)——Hero动画
本文目录 前言 基本用法 实现原理 前言 在前面实践组件的开发中,我们做了一个登录的界面,里面有一个组件Hero,不知道大家是否记得?当时没有展开来说,是因为它属于动画的内容,本文就要重点讲解Hero ...
- vue 页面切换动画_Flutter Hero动画让你的APP页面切换充满动效 不一样的体验 不一样的细节处理...
优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维. 本文章实现的Demo效果,如下图所示: class HeroHomePage extends State ...
- 【Flutter】Hero 动画 ( Hero 动画使用流程 | 创建 Hero 动画核心组件 | 创建源页面 | 创建目的页面 | 页面跳转 )
文章目录 ◯.Hero 动画简介 一.创建 Hero 动画核心组件 二.创建源页面 三.创建目的页面 四.页面跳转 五.完整代码示例 六.相关资源 ◯.Hero 动画简介 Hero Widget 动画 ...
- 【Flutter】Hero 动画 ( Hero 实现径向动画 | Hero 组件 createRectTween 设置 )
文章目录 ◯.Hero 构造函数 一.圆形方形组件 二.创建页面 1 的组件 ( Hero 组件 1 ) 三.创建页面 2 的组件 ( Hero 组件 2 ) 四.完整代码示例 五.相关资源 ◯.He ...
- Flutter Hero动画让你的APP页面切换充满动效 不一样的体验 不一样的细节处理
优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维. 本文章实现的Demo效果,如下图所示: 1 首先是页面的主体 在这里使用的是Scaffold脚手架来构建 ...
- 31、Flutter之Hero动画
Flutter Hero动画 Hero指的是可以在路由(页面)之间"飞行"的widget. 使用Flutter的Hero widget创建hero动画. 将 hero从一个路由飞到 ...
- flutter 九宫格菜单_Flutter 九宫格及Hero动画
class LXPhotosView extends StatefulWidget { //数据资源 final List list; //主轴间距 final double mainAxisPadd ...
- Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画
系列文章 Flutter 旋转动画 - RotationTransition Flutter 平移动画 - 4种实现方式 Flutter 淡入淡出与逐渐出现动画 Flutter 尺寸缩放.形状.颜色. ...
- android hero动画,主动画 (Hero animations)
主动画 (Hero animations) 你将会在这里学到: What you'll learn Hero 指的是在屏幕间飞跃的 widget. The hero refers to the wid ...
最新文章
- iOS 4.2 SDK安装
- Spring注解创建Bean的几种方式
- 软件开发项目云端All
- C结构体工具DirectStruct(综合示例二)
- PHPStorm使用指南
- apache工作模式
- intellij出现Initial job has not accepted any resources;
- 边缘检测robert原理_机器视觉尺寸检测基础
- UCSD本科数学计算机专业前景如何,2020年UCSD计算机工程排名真该小心来考查
- JAVA大数据-Week4-DAY3
- Eclipse : Android requires compiler compliance level 5.0 or 6.0.
- java 坦克大战暂停_java实现坦克大战游戏
- sqlite创建表格
- 无线路由器实现网络接入
- 用Java实现家庭收支记账软件
- Ueditor编辑器插入外链视频支持手机播放【iframe标签】
- c++自学笔记第五次
- 东北大学软件项目管理与过程改进复习提纲(2020)——第七章《项目成本管理》
- CC++编程环境搭建-四种常用开发工具(VSCode,Dev,CodeBlocks,Clion)
- php查询更新数据库数据类型,更新Update
热门文章
- 正本清源!!!!!!:HWDB1.1数据集.gnt转换成.png
- 2020上海ICPC现场赛 C Sum of Log
- 三分钟简单了解SaaS、PaaS、IaaS,别再企业上云时犯糊涂!
- android 手写签批_Android自定义实现手写签名功能
- 改善编程体验: IdeaVimExtension介绍 1
- 10.17——10.24ACM笔记
- 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园
- 转:前端 100 问:能搞懂80%的请把简历给我
- C++图书借阅信息管理系统
- 如果你爱上一个天枰座的女生。