HarmonyOS鸿蒙Next中Router和Navigation实现路由导航,分别采用什么方式实现共享元素转场动效?
HarmonyOS鸿蒙Next中Router和Navigation实现路由导航,分别采用什么方式实现共享元素转场动效?
Router的共享元素转场实现
通过组件的sharedTransition属性标记共享元素,并配置转场参数。需要满足以下条件:
- 两个页面中相同id的组件会被识别为共享元素
- 路由跳转时自动触发转场动画
实现示例
// 起始页
Image($r('app.media.image'))
.sharedTransition('sharedImage', { duration: 800, curve: Curve.Linear })
// 目标页
Image($r('app.media.image'))
.sharedTransition('sharedImage', { duration: 800, curve: Curve.Linear })
需在页面跳转时通过router.pushUrl触发,适用于简单页面切换场景。
Navigation的共享元素转场实现
使用geometryTransition属性结合animateTo动画闭包实现一镜到底效果:
- 绑定相同id的组件通过系统自动调整宽高、位置、透明度
- 需在动态变化时触发动画
实现示例
// 起始页组件
Column() {
Image($r('app.media.icon'))
.geometryTransition('1')
}
// 目标页组件
Column() {
Image($r('app.media.icon'))
.geometryTransition('1')
}
// 跳转时触发动画
animateTo({ duration: 350 }, () => {
this.isExpand = true // 控制状态变化
})
支持组件级动态转场,适用于复杂动画场景(如展开/折叠)。
建议
- 优先选Navigation:需要实现组件级精细动画控制、模态框内路由或一多场景时
- 使用Router场景:简单页面跳转且无复杂动效需求时
更多关于HarmonyOS鸿蒙Next中Router和Navigation实现路由导航,分别采用什么方式实现共享元素转场动效?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
Router的共享元素转场实现
使用组件级属性sharedTransition,通过相同的id标识两个页面中的共享元素,并支持路径动画、透明度等参数设置。
实现方式:
// 页面A中定义共享元素
Image().sharedTransition('imageId', { duration: 1000 })
// 页面B中定义相同id
Image().sharedTransition('imageId', { duration: 1000 })
仅在通过router.pushUrl或router.replaceUrl进行页面跳转时生效,需确保两页面共享元素的id一致
Navigation的共享元素转场实现
使用geometryTransition属性,结合NavDestination容器实现组件级共享元素动画,支持一镜到底的复杂转场效果。
实现方式:
// 父页面定义共享元素
Image().geometryTransition('imageId')
// 子页面(NavDestination)定义相同id
NavDestination() {
Image().geometryTransition('imageId')
}
建议以后用官方推荐的Navigation!
维度 | Router 路由导航(不推荐) | Navigation 导航 |
---|---|---|
适用场景 | 跨页面(非嵌套)跳转 | 应用内嵌套页面(导航栈管理)跳转 |
转场配置入口 | router.pushUrl 的 transition 参数 |
Navigation 组件的 transition 属性 |
共享元素关联方式 | 均通过 sharedTransition({ id: 'xxx' }) |
均通过 sharedTransition({ id: 'xxx' }) |
转场类型指定 | 需显式设置 RouterTransitionType.SharedElement |
自动支持(继承 Navigation 转场配置) |
如果可以得话 还是尽量用 Navigation
,router 都不推荐使用了
在HarmonyOS Next中,Router和Navigation实现共享元素转场动效的方式有所不同:
- Router方式:
- 通过PageTransitionEnter和PageTransitionExit接口实现
- 使用sharedTransition方法指定共享元素
- 需要在路由配置中定义转场动画参数
- 示例代码:
router.pushUrl({
url: 'pages/DetailPage',
params: {
sharedElement: 'image1'
}
})
- Navigation方式:
- 使用Navigation组件提供的sharedTransition属性
- 直接在组件上绑定共享元素ID
- 支持更细粒度的动效控制
- 示例代码:
Navigation.sharedTransition('image1').push('DetailPage')
两种方式都支持共享元素的平滑过渡,但Navigation方式更适用于组件化开发场景,而Router方式更适合传统的页面级路由。开发者可根据具体场景选择合适的方式。