HarmonyOS Next如何基于HMRouter实现特定页面设置自定义转场?

阅读 491
1 个回答

可以自定义动画类并实现IHMAnimator接口中的effect方法,该方法会将页面进出场的效果对象enterHandle与exitHandle作为参数传入,可通过参数对象上的start、finish方法,设置对应效果的起止状态,支持设置的常用属性还有:

  • curve:设置动画速度曲线,支持通过Curve枚举传入值,默认Curve.EaseInOut。
  • duration:动画持续时长,单位ms。

start/finish方法参数说明如下:

  • translateOption:坐标位置,以屏幕左上角为原点,水平向右为x轴正方向,竖直向下为y轴正方向。百分比相对于屏幕宽度。例如希望从右侧进入可以设置translateOption.x从100%变到0。
  • scaleOption:页面缩放,可通过scaleOption.x、scaleOption.y单独设置横纵方向的缩放比例。
  • opacityOption:跳转页面的透明度。

以下代码示例表示入场时由屏幕底部以线性速度向屏幕顶部运动,入场动画持续时长为400ms。出场时从屏幕顶部以线性速度向屏幕底部运动,出场动画持续时长也为400ms。

@HMAnimator({ animatorName: 'CustomAnimator' })
export class CustomAnimator implements IHMAnimator {
  effect(enterHandle: HMAnimatorHandle, exitHandle: HMAnimatorHandle): void {
    // 入场动画
    enterHandle.start((translateOption: TranslateOption, scaleOption: ScaleOption,
      opacityOption: OpacityOption) => {
      translateOption.y = '100%'
      scaleOption.x = 0.7;
      opacityOption.opacity = 0.3;
    })
    enterHandle.finish((translateOption: TranslateOption, scaleOption: ScaleOption,
      opacityOption: OpacityOption) => {
      translateOption.y = '0'
      scaleOption.x = 1;
      opacityOption.opacity = 1;
    })
    enterHandle.duration = 400;
    enterHandle.curve = Curve.Linear;

    // 出场动画
    exitHandle.start((translateOption: TranslateOption, scaleOption: ScaleOption,
      opacityOption: OpacityOption) => {
      translateOption.y = '0'
      scaleOption.x = 1;
      opacityOption.opacity = 1;
    })
    exitHandle.finish((translateOption: TranslateOption, scaleOption: ScaleOption,
      opacityOption: OpacityOption) => {
      translateOption.y = '100%'
      scaleOption.x = 0.7;
      opacityOption.opacity = 0.3;
    })
    exitHandle.duration = 400;
    enterHandle.curve = Curve.Linear;
  }
}
//自定义动画定义完成后,其实例可以作为push/replace方法的animator参数进行传入。
HMRouterMgr.push({ pageUrl: 'ProductContent', animator: new CustomAnimator() })

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进