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

news/2025/2/12 5:11:01/

文章目录

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





◯、Hero 动画简介



Hero Widget 动画效果 : Hero 通过动画从 源界面 运动到 目标界面 时 , 目标界面 透明度逐渐增加 , 淡入显示 ;


Hero 是界面的组成部分 , 在 源界面目标界面 都存在该组件 ;


Hero 动画涉及到的 API 较多 ;





一、创建 Hero 动画核心组件



Hero 动画 tag 标识 : Hero 动画作用的组件在两个界面中都存在 , 给这两个 Hero 组件都设置相同的标识 , 通过该标识可以标识两个 Hero 组件之间进行动画过渡 ;

该 Hero 动画组件封装内容 :

  • VoidCallback onTap : 从外部传入一个回调事件 , 这是点击组件后 , 回调的函数 ;
  • String imageUrl : 作为 Hero 动画的 tag 标识 , 同时也是图片的 url 网络地址 ;
  • double width : 用于约束 Hero 组件的宽度 ;

代码示例 : 这里定义核心组件 Hero 组件 , 传入 tag 标识 , 与 Hero 动画作用的组件 ;

/// Hero 组件 , 跳转前后两个页面都有该组件
class HeroWidget extends StatelessWidget{/// 构造方法const HeroWidget({Key key, this.imageUrl, this.width, this.onTap}) : super(key: key);/// Hero 动画之间关联的 ID , 通过该标识/// 标识两个 Hero 组件之间进行动画过渡/// 同时该字符串也是图片的 url 网络地址final String imageUrl;/// 点击后的回调事件final VoidCallback onTap;/// 宽度final double width;@overrideWidget build(BuildContext context) {return SizedBox(width: width,/// 这里定义核心组件 Hero 组件 , 传入 tag 标识 , 与 Hero 动画作用的组件child: Hero(tag: imageUrl, child: Material(color: Colors.transparent,/// 按钮child: InkWell(/// 按钮点击事件onTap: onTap,child: Image.network(imageUrl, fit: BoxFit.contain,),),),),);}
}




二、创建源页面



创建一个 StatelessWidget 组件作为源页面 , 其中封装 HeroWidget 组件 , 作为显示的核心组件 , 传入一个 VoidCallback 方法 , 在该方法中跳转到目的界面 ;

class HeroAnimation extends StatelessWidget{@overrideWidget build(BuildContext context) {// 时间膨胀系数 , 用于降低动画运行速度timeDilation = 10.0;return MaterialApp(home: Scaffold(appBar: AppBar(title: Text("Hero 动画演示( 跳转前页面 )"),),body: Container(color: Colors.white,padding: EdgeInsets.all(20),alignment: Alignment.bottomRight,child: HeroWidget(imageUrl: "https://img-blog.csdnimg.cn/20210329101628636.jpg",width: 300,// 点击事件 , 这里点击该组件后 , 跳转到新页面onTap: (){},),),),);}
}




三、创建目的页面



创建目的界面 : 这里直接在代码中创建 , 该界面中也封装了 HeroWidget 组件 , 其 tag 与源界面 HeroWidget 组件相同 , 这样就可以保证这两个界面互相跳转时 , 能触发 Hero 动画 ;

MaterialPageRoute(builder: (context){/// 跳转到的新界面再此处定义return MaterialApp(home: Scaffold(appBar: AppBar(title: Text("Hero 动画演示( 跳转后页面 )"),),body: Container(color: Colors.white,padding: EdgeInsets.all(20),alignment: Alignment.topLeft,child: HeroWidget(imageUrl: "https://img-blog.csdnimg.cn/20210329101628636.jpg",width: 100,onTap: (){/// 退出当前界面Navigator.of(context).pop();},),),),);}
)




四、页面跳转



使用 Navigator 进行页面跳转 , 这个页面直接在方法中创建出来 ;

Navigator.of(context).push(MaterialPageRoute(builder: (context){/// 跳转到的新界面再此处定义return MaterialApp(home: Scaffold(),);})
);

如果出现页面跳转错误 , 参考 【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga ) 解决 ;





五、完整代码示例



完整代码示例 :

import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart' show timeDilation;void main() {runApp(MaterialApp(home: HeroAnimation(),));
}/// Hero 组件 , 跳转前后两个页面都有该组件
class HeroWidget extends StatelessWidget{/// 构造方法const HeroWidget({Key key, this.imageUrl, this.width, this.onTap}) : super(key: key);/// Hero 动画之间关联的 ID , 通过该标识/// 标识两个 Hero 组件之间进行动画过渡/// 同时该字符串也是图片的 url 网络地址final String imageUrl;/// 点击后的回调事件final VoidCallback onTap;/// 宽度final double width;@overrideWidget build(BuildContext context) {return SizedBox(width: width,/// 这里定义核心组件 Hero 组件 , 传入 tag 标识 , 与 Hero 动画作用的组件child: Hero(tag: imageUrl, child: Material(color: Colors.transparent,/// 按钮child: InkWell(/// 按钮点击事件onTap: onTap,child: Image.network(imageUrl, fit: BoxFit.contain,),),),),);}
}class HeroAnimation extends StatelessWidget{@overrideWidget build(BuildContext context) {// 时间膨胀系数 , 用于降低动画运行速度timeDilation = 10.0;return MaterialApp(home: Scaffold(appBar: AppBar(title: Text("Hero 动画演示( 跳转前页面 )"),),body: Container(color: Colors.white,padding: EdgeInsets.all(20),alignment: Alignment.bottomRight,child: HeroWidget(imageUrl: "https://img-blog.csdnimg.cn/20210329101628636.jpg",width: 300,// 点击事件 , 这里点击该组件后 , 跳转到新页面onTap: (){print("点击事件触发, 切换到新界面");Navigator.of(context).push(MaterialPageRoute(builder: (context){/// 跳转到的新界面再此处定义return MaterialApp(home: Scaffold(appBar: AppBar(title: Text("Hero 动画演示( 跳转后页面 )"),),body: Container(color: Colors.white,padding: EdgeInsets.all(20),alignment: Alignment.topLeft,child: HeroWidget(imageUrl: "https://img-blog.csdnimg.cn/20210329101628636.jpg",width: 100,onTap: (){/// 退出当前界面Navigator.of(context).pop();},),),),);}));},),),),);}
}

运行效果 :

在这里插入图片描述





六、相关资源



参考资料 :

  • Flutter 官网 : https://flutter.dev/
  • Flutter 插件下载地址 : https://pub.dev/packages
  • Flutter 开发文档 : https://flutter.cn/docs ( 强烈推荐 )
  • 官方 GitHub 地址 : https://github.com/flutter
  • Flutter 中文社区 : https://flutter.cn/
  • Flutter 实用教程 : https://flutter.cn/docs/cookbook
  • Flutter CodeLab : https://codelabs.flutter-io.cn/
  • Dart 中文文档 : https://dart.cn/
  • Dart 开发者官网 : https://api.dart.dev/
  • Flutter 中文网 : https://flutterchina.club/ , http://flutter.axuer.com/docs/
  • Flutter 相关问题 : https://flutterchina.club/faq/ ( 入门阶段推荐看一遍 )
  • GitHub 上的 Flutter 开源示例 : https://download.csdn.net/download/han1202012/15989510
  • Flutter 实战电子书 : https://book.flutterchina.club/chapter1/

重要的专题 :

  • Flutter 动画参考文档 : https://flutterchina.club/animations/

博客源码下载 :

  • GitHub 地址 : https://github.com/han1202012/flutter_animation ( 随博客进度一直更新 , 有可能没有本博客的源码 )

  • 博客源码快照 : https://download.csdn.net/download/han1202012/16188742 ( 本篇博客的源码快照 , 可以找到本博客的源码 )


http://www.ppmy.cn/news/142588.html

相关文章

31、Flutter之Hero动画

Flutter Hero动画 Hero指的是可以在路由(页面)之间“飞行”的widget。使用Flutter的Hero widget创建hero动画。将 hero从一个路由飞到另一个路由。将 hero 的形状从圆形转换为矩形,同时将其从一个路由飞到另一个路由的过程中进行动画处理。Flutter中的Hero widget实…

hero登录器服务器列表为空,Hero引擎登陆器配置图文教程

1.首先启动配置器,如图: 2.游戏列表格式,也就是登录器左边显示的游戏区,保存为文本文件,例如GameList.txt 以下是设置4个区时登录器显示的样子,此文件需要保存在你网站的空间中,如上图 按照如下格式设置好你的游戏区后,并且配置好后启动登录器效果如下图: [电信区] ServerName=…

习题Hero

(1)定义一个游戏中Hero 英雄的类,在该类中定义英雄的名字, 生命值和等级3 个属性,定义一个构造函数完成对生命值和等级的初始化,分别赋初值为100,1。同时实现名字的输入和英雄信息的输出。 &am…

《Flutter 控件大全》第五十二个:Hero

如果你对Flutter还有疑问或者技术方面的疑惑,欢迎加入Flutter交流群(微信:laomengit)。同时也欢迎关注我的Flutter公众号【老孟程序员】,公众号首发Flutter的相关内容。Flutter地址:http://laomengit.com 里面包含160多个组件的详细用法。Hero是我们常用的过渡动画,当用…

Hero

Theres a hero 有一位英雄 If you look inside your heart 如果你探寻你的内心 You dont have to be afraid 你不必担心害怕 Of what you are 自己是谁 Theres an answer 有一种答案 If you reach into your soul 如果你深入自己的灵魂 And the sorrow that you know 你所经历的…

SwiftUI中应用Hero动画(Hero Animation)时一些需要填的坑

功能需求 从SwiftUI 2.0开始(iOS 14.0),Apple提供了视图间更自然的变换动画,我们可以据此来实现所谓的Hero Animation,即“英雄动画”效果: 注意上面动画演示里顶部用户信息面板中,单个视图是如何无缝连接收起和展开两个操作的:大家可能认为是同一个视图从下方移动到上方…

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

主动画 (Hero animations) 你将会在这里学到: What you’ll learn Hero 指的是在屏幕间飞跃的 widget。 The hero refers to the widget that flies between screens. 用 Flutter’s Hero widget 创建 hero 动画。 Create a hero animation using Flutter’s Hero widget. 使 …

PMP课堂模拟题目及解析(第17期)

161. 项目发起人任命一位高级工程师到指导委员会,来帮助监督项目管理计划。该工程师经常不同意由项目团队制定的计划,并在提交批准之前对项目管理计划表达严重关切。项目经理应该怎么做? A. 通知项目发起人,该工程师延迟了规划过程…