Navigation存在默认转场动画,此外也提供了自定义转场和共享元素转场能力。
系统提供了多种默认转场类型,可以通过NavDestination.systemTransition接口实现,具体示例请参考设置指定的NavDestination系统转场。
默认转场动画支持关闭,有两种方式:
全局关闭。
Navigation可以通过NavPathStack提供的disableAnimation接口,关闭或打开当前Navigation的所有转场动画。
pageStack: NavPathStack = new NavPathStack();
aboutToAppear(): void {
this.pageStack.disableAnimation(true);
} 单次关闭。
NavPathStack中提供的pushPath、pop、replacePath等接口可以设置animated参数,该参数用于设置是否有转场动画。需要单次关闭转场动画,可以将animated置为false,设置后不影响下次转场动画。
Navigation提供了两种自定义转场接口:Navigation自定义转场、NavDestination自定义转场。
Navigation自定义转场动画由customNavContentTransition事件提供,适用于控制Navigation内所有页面的场景,统一转场动画效果。步骤如下,具体示例代码请参考设置可交互转场动画。
NavDestination支持自定义转场动画,适用于控制单个页面的转场效果。通过设置customTransition属性即可实现单个页面的自定义转场效果。步骤如下,示例代码请参考设置NavDestination自定义转场。
NavDestination之间切换时可以通过geometryTransition实现共享元素转场,示例如下。配置了共享元素转场的页面,同时需要关闭系统默认的转场动画,否则默认动画会与共享元素动画叠加,导致效果异常。
为需要实现共享元素转场的组件添加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') 将页面路由的操作,放到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')