概述


花瓣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动画相关推荐

  1. Flutter(十六)——Hero动画

    本文目录 前言 基本用法 实现原理 前言 在前面实践组件的开发中,我们做了一个登录的界面,里面有一个组件Hero,不知道大家是否记得?当时没有展开来说,是因为它属于动画的内容,本文就要重点讲解Hero ...

  2. vue 页面切换动画_Flutter Hero动画让你的APP页面切换充满动效 不一样的体验 不一样的细节处理...

    优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维. 本文章实现的Demo效果,如下图所示: class HeroHomePage extends State ...

  3. 【Flutter】Hero 动画 ( Hero 动画使用流程 | 创建 Hero 动画核心组件 | 创建源页面 | 创建目的页面 | 页面跳转 )

    文章目录 ◯.Hero 动画简介 一.创建 Hero 动画核心组件 二.创建源页面 三.创建目的页面 四.页面跳转 五.完整代码示例 六.相关资源 ◯.Hero 动画简介 Hero Widget 动画 ...

  4. 【Flutter】Hero 动画 ( Hero 实现径向动画 | Hero 组件 createRectTween 设置 )

    文章目录 ◯.Hero 构造函数 一.圆形方形组件 二.创建页面 1 的组件 ( Hero 组件 1 ) 三.创建页面 2 的组件 ( Hero 组件 2 ) 四.完整代码示例 五.相关资源 ◯.He ...

  5. Flutter Hero动画让你的APP页面切换充满动效 不一样的体验 不一样的细节处理

    优美的应用体验 来自于细节的处理,更源自于码农的自我要求与努力,当然也需要码农年轻灵活的思维. 本文章实现的Demo效果,如下图所示: 1 首先是页面的主体 在这里使用的是Scaffold脚手架来构建 ...

  6. 31、Flutter之Hero动画

    Flutter Hero动画 Hero指的是可以在路由(页面)之间"飞行"的widget. 使用Flutter的Hero widget创建hero动画. 将 hero从一个路由飞到 ...

  7. flutter 九宫格菜单_Flutter 九宫格及Hero动画

    class LXPhotosView extends StatefulWidget { //数据资源 final List list; //主轴间距 final double mainAxisPadd ...

  8. Flutter 自定义动画 — 数字递增动画和文字逐行逐字出现或消失动画

    系列文章 Flutter 旋转动画 - RotationTransition Flutter 平移动画 - 4种实现方式 Flutter 淡入淡出与逐渐出现动画 Flutter 尺寸缩放.形状.颜色. ...

  9. android hero动画,主动画 (Hero animations)

    主动画 (Hero animations) 你将会在这里学到: What you'll learn Hero 指的是在屏幕间飞跃的 widget. The hero refers to the wid ...

最新文章

  1. iOS 4.2 SDK安装
  2. Spring注解创建Bean的几种方式
  3. 软件开发项目云端All
  4. C结构体工具DirectStruct(综合示例二)
  5. PHPStorm使用指南
  6. apache工作模式
  7. intellij出现Initial job has not accepted any resources;
  8. 边缘检测robert原理_机器视觉尺寸检测基础
  9. UCSD本科数学计算机专业前景如何,2020年UCSD计算机工程排名真该小心来考查
  10. JAVA大数据-Week4-DAY3
  11. Eclipse : Android requires compiler compliance level 5.0 or 6.0.
  12. java 坦克大战暂停_java实现坦克大战游戏
  13. sqlite创建表格
  14. 无线路由器实现网络接入
  15. 用Java实现家庭收支记账软件
  16. Ueditor编辑器插入外链视频支持手机播放【iframe标签】
  17. c++自学笔记第五次
  18. 东北大学软件项目管理与过程改进复习提纲(2020)——第七章《项目成本管理》
  19. CC++编程环境搭建-四种常用开发工具(VSCode,Dev,CodeBlocks,Clion)
  20. php查询更新数据库数据类型,更新Update

热门文章

  1. 正本清源!!!!!!:HWDB1.1数据集.gnt转换成.png
  2. 2020上海ICPC现场赛 C Sum of Log
  3. 三分钟简单了解SaaS、PaaS、IaaS,别再企业上云时犯糊涂!
  4. android 手写签批_Android自定义实现手写签名功能
  5. 改善编程体验: IdeaVimExtension介绍 1
  6. 10.17——10.24ACM笔记
  7. 丢手帕问题 java_java入门小程序—17人游戏(丢手绢问题) | 学步园
  8. 转:前端 100 问:能搞懂80%的请把简历给我
  9. C++图书借阅信息管理系统
  10. 如果你爱上一个天枰座的女生。