问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Flutter开发:Hero与HeroMode的使用

发布网友 发布时间:2024-10-08 01:39

我来回答

1个回答

热心网友 时间:2024-10-17 06:50

我们经常看到一些APP在从列表点击进入到详情时会有一个图片放大的渐变效果,不像是页面的跳转。给用户一种无缝切换的感觉。这种效果通常称为共享元素转换动画,那么它在Flutter中是如何实现呢?

其实Flutter中官方给我们提供了非常好用的控件:Hero。

Hero

中文网给出的定义是:Hero指的是可以在路由(页面)之间“飞行”的widget。将hero从一个路由飞到另一个路由。

hero动画代码应该具有以下结构:

1.定义一个起始herowidget,称为"源hero"。hero指定其图形表示(通常是图片)和识别标记,并且位于源路由定义的当前显示的widget树中。

2.定义一个结束的herowidget,称为"目标hero"。这位hero也指定了它的图形表示,以及与源hero相同的标记。重要的是两个herowidget都使用相同的标签创建,通常是代表底层数据的对象。为了获得最佳效果,hero应该有几乎相同的widget树。

3.创建一个包含目标hero的路由。目标路由定义了动画结束时的widget树。

4.通过导航器将目标路由入栈来触发动画。Navigator推送和弹出操作会为每对hero配对,并在源路由和目标路由中使用匹配的标签触发hero动画。

5.Flutter计算从起点到终点对hero界限进行动画处理的补间(生成每一帧大小和位置),并在叠加层中执行动画。

根据要求及定义就可以直接撸代码了,很简单:

首先是第一个界面:Widgetbuild(BuildContextcontext){returnScaffold(body:Center(child:Column(mainAxisSize:MainAxisSize.min,children:<Widget>[InkWell(onTap:(){Navigator.push(context,MaterialPageRoute(builder:(context){returnSecondHeroPage(tag:"tag",imageUrl:imageUrl,);}));},child:Hero(tag:"tag",child:Image.network(imageUrl,width:200,height:200,)),),Text("点击图片跳转")],),),);}第二个界面Widgetbuild(BuildContextcontext){returnScaffold(body:Column(children:<Widget>[InkWell(onTap:(){Navigator.of(context).pop();//这里pop后也是有动画的},child:Hero(tag:widget.tag,child:Image.network(widget.imageUrl,width:double.infinity,height:500,fit:BoxFit.fill,)),),Text("点击图片返回")],),);}HeroMode

有一些场景,比如单数的图片需要过渡动画,双数的不需要,那么如何处理呢,Flutter中也提供了解决办法就是HeroMode,给Hero嵌套HeroMode组件后可以通过设置enabled属性,当其值为false时,hero动画就会失效。

HeroMode(enabled:isNeedHero,child:Hero(tag:"tag",child:Image.network(imageUrl,width:200,height:200,)),)

注意这里的tag一定要和第一个界面Hero中的tag一致

总的来说,这个效果实现起来非常简单的,但是用到实际项目中呈现出的用户体验会非常好!

代码地址

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我的快递说好顺丰不到转ems的,结果中途自行中转韵达了,找售后售� 我用韵达发了一件东西,可后来他说发不到目的地,换了EMS,那样会加我运 ... 我淘宝上买件东西然后韵达快递送不到 自动转了EMS 要不要钱 那些工作对普通话等级有要求 房子拿钥匙需要多少交钱 6位数字的code条码不能扫描 ...然后用红色的对冲色进行对冲!出来后的确是咖啡色!接下来怎么样才能弄... 如何区别乳胶真假 toms鞋真假鉴定 快手新功能安心钱包有什么好处?如何提现? 使用FlutterNavigator2.0最舒服的姿势 ...最近卫生间这种小虫出来好几个,不知从哪出来的,地漏都有防臭... 永劫无间迦南英雄怎么获得_最受欢迎英雄迦南攻略 有限公司董事会人数一般是多少? 永劫无间武器招式与魂玉技能介绍介绍_永劫无间武器招式与魂玉技能介绍... 永劫无间迦南修行任务内容 迦南修行任务要怎么玩 《永劫无间》游戏中的长剑全招式的用法 永劫无间壁击技巧如何连 永劫无间壁击技巧有哪些 永劫无间壁击怎么打出来-壁击触发攻略 永劫无间天海天赋印记搭配推荐-天海天赋印记最优搭配 永劫无间特木尔印记御魂搭配推荐 永劫无间迦南天赋印记怎么点 迦南天赋加点攻略 永劫无间特木尔印记怎么搭配 沙男印记选择推荐 永劫无间迦南印记怎么配 天赋印记加点推荐 永劫无间印记带什么 油炸香芋丸子的做法和配方 "你问我这世界最远的地方在哪里?..."的原创作者是谁 你问我这世界最远的地方在哪里? 高考去学校住宿要装备什么日用品 流动的观察者模式 | Flutter 设计模式 Flutter获取的OverlayState来自哪里? 怎样超频才能使CPU稳定运行呢? 一个卫生间需要留几个地漏留到什么位置才合理 ...钱给我返回余额了,麦当劳又给我送来了。这算谁的,会找我追钱吗_百 ... 如何在VISTA系统下看应用程序使用的内存情况 为什么我的电脑PF会达到1.324GB有什么办法解决吗??? ...自动更新只剩下4KB了硬是不动了,重启也搞了,怎么进去的? 高手来看下我的svchost.exe进程是否有问题? 电脑用了两年,感觉电脑性能大不如重前了。我玩电脑也是5年了,非常注 ... ...怎么解?这几个月净跟水犯冲,家里新装修完卫生间防水做不好,老漏... 家里出现一种小虫,一头扁平一头尖尖,有壳多节,灰黑色,伸缩爬行,一厘米... 云顶之弈装备(诅咒刀成版本之子介绍_云顶之弈装备(诅咒刀成版本之子是... 挂到怎么造句 护航怎么造句 Officejet 7000 E809a Series 开机后电源灯闪5秒,然后4个墨盒灯挨个... 惠普officejet 7000 开关灯闪,蓝灯长亮是什么意思 做了包皮手术一年了还要每天洗澡的时候洗阴茎吗?还是两天一次好呢?洗的... 我把我的阴茎包皮掀开围绕着阴茎有一圈像小米大小的白色颗粒我每天都洗... 淋病和非淋哪个严重