HarmonyOS鸿蒙Next中Router和Navigation实现路由导航,分别采用什么方式实现共享元素转场动效?

HarmonyOS鸿蒙Next中Router和Navigation实现路由导航,分别采用什么方式实现共享元素转场动效?

6 回复

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.pushUrltransition 参数 Navigation 组件的 transition 属性
共享元素关联方式 均通过 sharedTransition({ id: 'xxx' }) 均通过 sharedTransition({ id: 'xxx' })
转场类型指定 需显式设置 RouterTransitionType.SharedElement 自动支持(继承 Navigation 转场配置)

如果可以得话 还是尽量用 Navigation ,router 都不推荐使用了

在HarmonyOS鸿蒙Next中:

  1. Router模块实现共享元素转场:通过设置sharedElementNames属性定义共享元素,在跳转目标页配置matchedSharedElements接收匹配元素,使用Router的pushUrl()方法传递参数。

  2. Navigation模块实现方式:通过Navigation的createSharedElementTransition()方法创建转场动画,在页面组件上添加sharedTransition属性,并设置sharedTransitionName匹配相同标识符。

两种方式均需在page_transition_config.json中配置共享元素样式参数。

在HarmonyOS Next中,Router和Navigation实现共享元素转场动效的方式有所不同:

  1. Router方式:
  • 通过PageTransitionEnter和PageTransitionExit接口实现
  • 使用sharedTransition方法指定共享元素
  • 需要在路由配置中定义转场动画参数
  • 示例代码:
router.pushUrl({
  url: 'pages/DetailPage',
  params: {
    sharedElement: 'image1'
  }
})
  1. Navigation方式:
  • 使用Navigation组件提供的sharedTransition属性
  • 直接在组件上绑定共享元素ID
  • 支持更细粒度的动效控制
  • 示例代码:
Navigation.sharedTransition('image1').push('DetailPage')

两种方式都支持共享元素的平滑过渡,但Navigation方式更适用于组件化开发场景,而Router方式更适合传统的页面级路由。开发者可根据具体场景选择合适的方式。

回到顶部