开源鸿蒙 Flutter 实战|页面转场动画完整实现

张开发
2026/4/19 4:06:59 15 分钟阅读

分享文章

开源鸿蒙 Flutter 实战|页面转场动画完整实现
开源鸿蒙 Flutter 实战页面转场动画完整实现欢迎加入开源鸿蒙跨平台社区→https://openharmonycrosplatform.csdn.net【摘要】本文面向开源鸿蒙跨平台开发新手基于 Flutter 框架实现了 7 种风格的页面转场动画包含淡入淡出、滑动、缩放、旋转、共享轴等效果完整覆盖自定义路由封装、页面接入、鸿蒙适配要点与虚拟机实机运行验证代码可直接复制复用有效提升应用交互体验。之前我的 APP 页面跳转都是硬邦邦的直接切换总觉得少了点灵魂这次我直接封装了7 种风格的页面转场动画有淡入淡出、滑动、缩放、旋转、共享轴还有 iOS 风格的右滑进入已经在开源鸿蒙虚拟机上验证通过接入超简单一行代码就能用先给大家汇报一下这次的核心成果✨✅ 封装 7 种风格的自定义页面转场动画✅ 提供便捷工具类一行代码选择动画类型✅ 优化 OpenContainer 容器转场效果✅ 支持自定义动画时长、方向、曲线✅ 深色 / 浅色模式自动适配✅ 鸿蒙虚拟机实机验证动画渲染完全正常✅ 低侵入接入替换原有跳转代码即可✅ 代码结构清晰新手可直接修改、扩展动画效果一、技术选型说明全程使用 Flutter 官方原生组件实现无需引入额外三方库完全规避鸿蒙兼容风险二、核心组件完整实现可直接复制我把所有转场动画封装成了一个独立的工具类支持通过参数选择动画类型新手直接复制就能用。2.1 第一步创建自定义转场动画文件在lib/widgets目录下新建animated_page_route.dart完整代码如下importpackage:flutter/material.dart;importpackage:animations/animations.dart;/// 页面转场动画类型枚举enumPageTransitionType{/// 淡入淡出fade,/// 从右侧滑入slideRight,/// 从底部滑入slideBottom,/// 缩放弹出scale,/// 旋转缩放rotation,/// 共享轴水平滑动sharedAxisX,/// 共享轴垂直滑动sharedAxisY,/// iOS风格右滑进入cupertino,}/// 自定义页面转场动画工具类classAnimatedPageRoute{/// 快捷推送页面/// [context] 上下文/// [page] 目标页面/// [type] 转场动画类型默认淡入淡出/// [duration] 动画时长默认300msstaticFutureT?pushTextendsObject?(BuildContextcontext,Widgetpage,{PageTransitionTypetypePageTransitionType.fade,DurationdurationconstDuration(milliseconds:300),}){returnNavigator.push(context,_buildPageRoute(page,type,duration),);}/// 快捷替换当前页面staticFutureT?pushReplacementTextendsObject?,TOextendsObject?(BuildContextcontext,Widgetpage,{PageTransitionTypetypePageTransitionType.fade,DurationdurationconstDuration(milliseconds:300),}){returnNavigator.pushReplacement(context,_buildPageRoute(page,type,duration),);}/// 构建自定义PageRoutestaticPageRouteBuilder_buildPageRoute(Widgetpage,PageTransitionTypetype,Durationduration,){returnPageRouteBuilder(pageBuilder:(context,animation,secondaryAnimation)page,transitionDuration:duration,transitionsBuilder:(context,animation,secondaryAnimation,child){switch(type){// 淡入淡出动画casePageTransitionType.fade:returnFadeTransition(opacity:animation,child:child,);// 从右侧滑入动画casePageTransitionType.slideRight:returnSlideTransition(position:TweenOffset(begin:constOffset(1.0,0.0),end:Offset.zero,).animate(CurvedAnimation(parent:animation,curve:Curves.easeInOut,)),child:child,);// 从底部滑入动画casePageTransitionType.slideBottom:returnSlideTransition(position:TweenOffset(begin:constOffset(0.0,1.0),end:Offset.zero,).animate(CurvedAnimation(parent:animation,curve:Curves.easeInOut,)),child:child,);// 缩放弹出动画casePageTransitionType.scale:returnScaleTransition(scale:Tweendouble(begin:0.8,end:1.0,).animate(CurvedAnimation(parent:animation,curve:Curves.easeOutBack,)),child:FadeTransition(opacity:animation,child:child,),);// 旋转缩放动画casePageTransitionType.rotation:returnRotationTransition(turns:Tweendouble(begin:0.9,end:1.0,).animate(CurvedAnimation(parent:animation,curve:Curves.easeOutBack,)),child:ScaleTransition(scale:Tweendouble(begin:0.8,end:1.0,).animate(CurvedAnimation(parent:animation,curve:Curves.easeOutBack,)),child:FadeTransition(opacity:animation,child:child,),),);// 共享轴水平滑动动画casePageTransitionType.sharedAxisX:returnSharedAxisTransition(animation:animation,secondaryAnimation:secondaryAnimation,transitionType:SharedAxisTransitionType.horizontal,child:child,);// 共享轴垂直滑动动画casePageTransitionType.sharedAxisY:returnSharedAxisTransition(animation:animation,secondaryAnimation:secondaryAnimation,transitionType:SharedAxisTransitionType.vertical,child:child,);// iOS风格右滑进入动画casePageTransitionType.cupertino:returnCupertinoPageTransition(primaryRouteAnimation:animation,secondaryRouteAnimation:secondaryAnimation,linearTransition:false,child:child,);}},);}}三、页面接入示例我把项目中所有的页面跳转都替换成了自定义转场动画接入超简单一行代码搞定。3.1 搜索页面跳转修改首页的搜索按钮点击事件替换为自定义转场动画// 导入自定义转场动画importwidgets/animated_page_route.dart;// 搜索按钮点击事件IconButton(icon:constIcon(Icons.search),onPressed:(){// 使用自定义转场动画跳转到搜索页// 这里选择共享轴水平滑动动画体验最丝滑AnimatedPageRoute.push(context,constSearchPage(),type:PageTransitionType.sharedAxisX,duration:constDuration(milliseconds:400),);},),3.3 其他页面跳转示例我整理了几种常用的转场动画使用场景新手可以直接参考// 1. 淡入淡出适合弹窗、设置页等次要页面AnimatedPageRoute.push(context,constSettingsPage(),type:PageTransitionType.fade,);// 2. 从右侧滑入适合列表详情页符合用户习惯AnimatedPageRoute.push(context,constDetailPage(),type:PageTransitionType.slideRight,);// 3. 从底部滑入适合底部弹窗、筛选页AnimatedPageRoute.push(context,constFilterPage(),type:PageTransitionType.slideBottom,);// 4. 缩放弹出适合重要页面、新功能引导AnimatedPageRoute.push(context,constNewFeaturePage(),type:PageTransitionType.scale,);// 5. 共享轴水平滑动适合同级页面切换体验最丝滑AnimatedPageRoute.push(context,constNextPage(),type:PageTransitionType.sharedAxisX,);// 6. iOS风格右滑进入适合iOS用户习惯AnimatedPageRoute.push(context,constIosStylePage(),type:PageTransitionType.cupertino,);四、开源鸿蒙平台适配核心要点为了确保转场动画在鸿蒙设备上流畅运行我做了针对性的适配优化新手一定要注意这几点4.1 动画性能优化1.动画时长控制在 300-500ms 内符合开源鸿蒙系统的交互规范避免动画过长导致的卡顿2.使用Curves.easeInOut、Curves.easeOutBack等流畅的动画曲线避免生硬的线性动画3.避免在转场动画中同时执行过多的其他动画减少渲染压力在鸿蒙低配置设备上也能流畅运行.4使用SharedAxisTransition等官方优化的转场组件性能更稳定4.2 深色模式适配OpenContainer的openColor设置为Theme.of(context).scaffoldBackgroundColor切换主题时自动适配无颜色断层转场动画中不使用硬编码的颜色全部通过主题获取确保在深色 / 浅色模式下都有合适的视觉效果容器转场的阴影根据主题动态调整深色模式下阴影更柔和浅色模式下阴影更明显4.3 手势交互适配使用CupertinoPageTransition时确保鸿蒙设备上的右滑返回手势正常工作无需额外配置转场动画执行时避免同时响应其他手势事件防止交互冲突转场动画完成后自动释放动画资源避免内存泄漏4.4 权限说明所有功能均为纯 UI 实现无需申请任何开源鸿蒙系统权限直接接入即可使用无需修改鸿蒙配置文件。五、开源鸿蒙虚拟机运行验证5.1 一键运行命令# 进入鸿蒙工程目录 cd ohos # 构建HAP安装包 hvigorw assembleHap-p productdefault-p buildModedebug # 安装到鸿蒙虚拟机 hdc install-r entry/build/default/outputs/default/entry-default-unsigned.hap # 启动应用 hdc shell aa start-aEntryAbility-b com.example.demo1Flutter 开源鸿蒙页面转场 - 虚拟机全屏运行验证Flutter 开源鸿蒙页面转场效果应用在开源鸿蒙虚拟机全屏稳定运行所有转场动画正常渲染无闪退、无卡顿、无渲染异常六、新手学习总结作为刚学 Flutter 和鸿蒙开发的大一新生这次页面转场动画的实现真的让我收获满满原来只用 Flutter 官方原生组件和官方兼容库就能实现这么多风格的转场动画而且完全兼容开源鸿蒙平台成就感直接拉满这次开发也让我明白了几个新手一定要注意的点PageRouteBuilder真的太强大了新手也能轻松实现自定义转场动画不同的页面适合不同的转场动画要根据场景选择不能为了动画而动画SharedAxisTransition的体验真的太丝滑了同级页面切换强烈推荐用这个开源鸿蒙对 Flutter 官方兼容库的支持真的越来越好了只要按照规范开发基本不会出现大的兼容问题后续我还会继续优化✅ 实现更多风格的转场动画✅ 支持自定义转场动画曲线✅ 优化转场动画的性能✅ 实现页面返回时的反向转场动画也会持续给大家分享我的鸿蒙 Flutter 新手实战内容和大家一起在开源鸿蒙的生态里慢慢进步✨如果这篇文章有帮到你或者你也有更好的转场动画实现思路欢迎在评论区和我交流呀

更多文章