开源鸿蒙 Flutter 实战|页面转场动画完整实现
本文介绍了在开源鸿蒙平台上使用Flutter实现7种页面转场动画的方法。文章提供了完整的代码实现方案,包括淡入淡出、滑动、缩放、旋转、共享轴等动画效果,并展示了如何在鸿蒙虚拟机上验证这些动画效果。作者将这些动画封装成一个工具类,支持通过参数选择动画类型,开发者只需一行代码即可调用。文章还强调了该方案的技术优势:使用原生组件实现、低侵入式接入、支持自定义动画参数以及良好的鸿蒙兼容性。这些动画效果可以
🎬 开源鸿蒙 Flutter 实战|页面转场动画完整实现
欢迎加入开源鸿蒙跨平台社区→https://openharmonycrosplatform.csdn.net
【摘要】本文面向开源鸿蒙跨平台开发新手,基于 Flutter 框架实现了 7 种风格的页面转场动画,包含淡入淡出、滑动、缩放、旋转、共享轴等效果,完整覆盖自定义路由封装、页面接入、鸿蒙适配要点与虚拟机实机运行验证,代码可直接复制复用,有效提升应用交互体验。
之前我的 APP 页面跳转都是硬邦邦的直接切换,总觉得少了点灵魂!这次我直接封装了7 种风格的页面转场动画,有淡入淡出、滑动、缩放、旋转、共享轴,还有 iOS 风格的右滑进入,已经在开源鸿蒙虚拟机上验证通过,接入超简单,一行代码就能用!
先给大家汇报一下这次的核心成果✨:
✅ 封装 7 种风格的自定义页面转场动画
✅ 提供便捷工具类,一行代码选择动画类型
✅ 优化 OpenContainer 容器转场效果
✅ 支持自定义动画时长、方向、曲线
✅ 深色 / 浅色模式自动适配
✅ 鸿蒙虚拟机实机验证,动画渲染完全正常
✅ 低侵入接入,替换原有跳转代码即可
✅ 代码结构清晰,新手可直接修改、扩展动画效果
一、技术选型说明
全程使用 Flutter 官方原生组件实现,无需引入额外三方库,完全规避鸿蒙兼容风险:
二、核心组件完整实现(可直接复制)
我把所有转场动画封装成了一个独立的工具类,支持通过参数选择动画类型,新手直接复制就能用。
2.1 第一步:创建自定义转场动画文件
在lib/widgets目录下新建animated_page_route.dart,完整代码如下:
import 'package:flutter/material.dart';
import 'package:animations/animations.dart';
/// 页面转场动画类型枚举
enum PageTransitionType {
/// 淡入淡出
fade,
/// 从右侧滑入
slideRight,
/// 从底部滑入
slideBottom,
/// 缩放弹出
scale,
/// 旋转+缩放
rotation,
/// 共享轴水平滑动
sharedAxisX,
/// 共享轴垂直滑动
sharedAxisY,
/// iOS风格右滑进入
cupertino,
}
/// 自定义页面转场动画工具类
class AnimatedPageRoute {
/// 快捷推送页面
/// [context] 上下文
/// [page] 目标页面
/// [type] 转场动画类型,默认淡入淡出
/// [duration] 动画时长,默认300ms
static Future<T?> push<T extends Object?>(
BuildContext context,
Widget page, {
PageTransitionType type = PageTransitionType.fade,
Duration duration = const Duration(milliseconds: 300),
}) {
return Navigator.push(
context,
_buildPageRoute(page, type, duration),
);
}
/// 快捷替换当前页面
static Future<T?> pushReplacement<T extends Object?, TO extends Object?>(
BuildContext context,
Widget page, {
PageTransitionType type = PageTransitionType.fade,
Duration duration = const Duration(milliseconds: 300),
}) {
return Navigator.pushReplacement(
context,
_buildPageRoute(page, type, duration),
);
}
/// 构建自定义PageRoute
static PageRouteBuilder _buildPageRoute(
Widget page,
PageTransitionType type,
Duration duration,
) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => page,
transitionDuration: duration,
transitionsBuilder: (context, animation, secondaryAnimation, child) {
switch (type) {
// 淡入淡出动画
case PageTransitionType.fade:
return FadeTransition(
opacity: animation,
child: child,
);
// 从右侧滑入动画
case PageTransitionType.slideRight:
return SlideTransition(
position: Tween<Offset>(
begin: const Offset(1.0, 0.0),
end: Offset.zero,
).animate(CurvedAnimation(
parent: animation,
curve: Curves.easeInOut,
)),
child: child,
);
// 从底部滑入动画
case PageTransitionType.slideBottom:
return SlideTransition(
position: Tween<Offset>(
begin: const Offset(0.0, 1.0),
end: Offset.zero,
).animate(CurvedAnimation(
parent: animation,
curve: Curves.easeInOut,
)),
child: child,
);
// 缩放弹出动画
case PageTransitionType.scale:
return ScaleTransition(
scale: Tween<double>(
begin: 0.8,
end: 1.0,
).animate(CurvedAnimation(
parent: animation,
curve: Curves.easeOutBack,
)),
child: FadeTransition(
opacity: animation,
child: child,
),
);
// 旋转+缩放动画
case PageTransitionType.rotation:
return RotationTransition(
turns: Tween<double>(
begin: 0.9,
end: 1.0,
).animate(CurvedAnimation(
parent: animation,
curve: Curves.easeOutBack,
)),
child: ScaleTransition(
scale: Tween<double>(
begin: 0.8,
end: 1.0,
).animate(CurvedAnimation(
parent: animation,
curve: Curves.easeOutBack,
)),
child: FadeTransition(
opacity: animation,
child: child,
),
),
);
// 共享轴水平滑动动画
case PageTransitionType.sharedAxisX:
return SharedAxisTransition(
animation: animation,
secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.horizontal,
child: child,
);
// 共享轴垂直滑动动画
case PageTransitionType.sharedAxisY:
return SharedAxisTransition(
animation: animation,
secondaryAnimation: secondaryAnimation,
transitionType: SharedAxisTransitionType.vertical,
child: child,
);
// iOS风格右滑进入动画
case PageTransitionType.cupertino:
return CupertinoPageTransition(
primaryRouteAnimation: animation,
secondaryRouteAnimation: secondaryAnimation,
linearTransition: false,
child: child,
);
}
},
);
}
}
三、页面接入示例
我把项目中所有的页面跳转都替换成了自定义转场动画,接入超简单,一行代码搞定。
3.1 搜索页面跳转
修改首页的搜索按钮点击事件,替换为自定义转场动画:
// 导入自定义转场动画
import 'widgets/animated_page_route.dart';
// 搜索按钮点击事件
IconButton(
icon: const Icon(Icons.search),
onPressed: () {
// 使用自定义转场动画跳转到搜索页
// 这里选择共享轴水平滑动动画,体验最丝滑
AnimatedPageRoute.push(
context,
const SearchPage(),
type: PageTransitionType.sharedAxisX,
duration: const Duration(milliseconds: 400),
);
},
),
3.3 其他页面跳转示例
我整理了几种常用的转场动画使用场景,新手可以直接参考:
// 1. 淡入淡出:适合弹窗、设置页等次要页面
AnimatedPageRoute.push(
context,
const SettingsPage(),
type: PageTransitionType.fade,
);
// 2. 从右侧滑入:适合列表详情页,符合用户习惯
AnimatedPageRoute.push(
context,
const DetailPage(),
type: PageTransitionType.slideRight,
);
// 3. 从底部滑入:适合底部弹窗、筛选页
AnimatedPageRoute.push(
context,
const FilterPage(),
type: PageTransitionType.slideBottom,
);
// 4. 缩放弹出:适合重要页面、新功能引导
AnimatedPageRoute.push(
context,
const NewFeaturePage(),
type: PageTransitionType.scale,
);
// 5. 共享轴水平滑动:适合同级页面切换,体验最丝滑
AnimatedPageRoute.push(
context,
const NextPage(),
type: PageTransitionType.sharedAxisX,
);
// 6. iOS风格右滑进入:适合iOS用户习惯
AnimatedPageRoute.push(
context,
const IosStylePage(),
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 product=default -p buildMode=debug
# 安装到鸿蒙虚拟机
hdc install -r entry/build/default/outputs/default/entry-default-unsigned.hap
# 启动应用
hdc shell aa start -a EntryAbility -b com.example.demo1
Flutter 开源鸿蒙页面转场 - 虚拟机全屏运行验证
Flutter 开源鸿蒙页面转场
效果:应用在开源鸿蒙虚拟机全屏稳定运行,所有转场动画正常渲染,无闪退、无卡顿、无渲染异常
六、新手学习总结
作为刚学 Flutter 和鸿蒙开发的大一新生,这次页面转场动画的实现真的让我收获满满!原来只用 Flutter 官方原生组件和官方兼容库,就能实现这么多风格的转场动画,而且完全兼容开源鸿蒙平台,成就感直接拉满🥰
这次开发也让我明白了几个新手一定要注意的点:
PageRouteBuilder真的太强大了,新手也能轻松实现自定义转场动画
不同的页面适合不同的转场动画,要根据场景选择,不能为了动画而动画
SharedAxisTransition的体验真的太丝滑了,同级页面切换强烈推荐用这个
开源鸿蒙对 Flutter 官方兼容库的支持真的越来越好了,只要按照规范开发,基本不会出现大的兼容问题
后续我还会继续优化:
✅ 实现更多风格的转场动画
✅ 支持自定义转场动画曲线
✅ 优化转场动画的性能
✅ 实现页面返回时的反向转场动画
也会持续给大家分享我的鸿蒙 Flutter 新手实战内容,和大家一起在开源鸿蒙的生态里慢慢进步✨
如果这篇文章有帮到你,或者你也有更好的转场动画实现思路,欢迎在评论区和我交流呀!
更多推荐

所有评论(0)