目录

Navigation转场动画

Navigation存在默认转场动画,此外也提供了自定义转场和共享元素转场能力。

系统默认转场

系统提供了多种默认转场类型,可以通过NavDestination.systemTransition接口实现,具体示例请参考设置指定的NavDestination系统转场。

  • NavDestination的默认转场动画使用弹簧曲线,其时长与物理曲线参数有关,而且不同设备上的默认动画不同,因此默认转场动画时长不可控,不建议与业务耦合,若需要监听动画结束,建议使用自定义转场。
  • Dialog类型的NavDestination默认无转场动画;从API version 13开始,Dialog类型的NavDestination默认存在系统转场动画。

默认转场动画支持关闭,有两种方式:

自定义转场

Navigation提供了两种自定义转场接口:Navigation自定义转场、NavDestination自定义转场。

同时使用customNavContentTransition和customTransition时,customNavContentTransition优先级更高。

共享元素转场

NavDestination之间切换时可以通过geometryTransition实现共享元素转场,示例如下。配置了共享元素转场的页面,同时需要关闭系统默认的转场动画,否则默认动画会与共享元素动画叠加,导致效果异常。

  1. 为需要实现共享元素转场的组件添加geometryTransition属性,id参数必须在两个NavDestination之间保持一致。

    // 起始页配置共享元素id
    NavDestination() {
      Column() {
        // ...
        // 请将$r('app.media.startIcon')替换为实际资源文件
        Image($r('app.media.startIcon'))
          .geometryTransition('sharedId')
          .width(100)
          .height(100)
      }
    }.title('FromPage')
    // 目的页配置共享元素id
    NavDestination() {
      Column() {
        // 请将$r('app.media.startIcon')替换为实际资源文件
        Image($r('app.media.startIcon'))
          .geometryTransition('sharedId')
          .width(200)
          .height(200)
      }
    }
    .title('ToPage')
  2. 将页面路由的操作,放到animateTo动画闭包中,配置对应的动画参数以及关闭系统默认的转场。

    NavDestination() {
      Column() {
        // $r('app.string.ToPage')需要开发者替换为实际的资源文件,资源文件中的value值为“跳转到目的页”
    
        Button($r('app.string.ToPage'))
          .width('80%')
          .height(40)
          .margin(20)
          .onClick(() => {
            this.getUIContext()?.animateTo({ duration: 1000 }, () => {
              this.navPathStack.pushPath({ name: 'ToPage' }, false)
            });
          })
        // ...
      }
    }.title('FromPage')