HarmonyOS鸿蒙Next中animateTo为什么废弃了?有新增替代animateTo的方法吗?

HarmonyOS鸿蒙Next中animateTo为什么废弃了?有新增替代animateTo的方法吗?

onPageShow():void{
  animateTo ({
    duration: 2000,
    iterations: -1,
    curve:Curve.FastOutSlowIn
  }, () => {
    this.angleA = 360
  })
}

Column(){}
  .width(200)
  .height(200)
  .backgroundColor(Color.Pink)
  .rotate({
    x: 0,
    y: 1,
    z: 0,
    angle: this.angleA,
    centerX:100,
    centerY:100,
  })

Column(){}
  .width(150)
  .height(150)
  .backgroundColor(Color.Yellow)
  .rotate({angle: this.rotateAngle})
  .animation({
    duration: 1500,
    curve: Curve.Linear,
    iterations: -1  // 设置动画无限循环
  })
  .onClick(() => {
    this.rotateAngle = 360 - this.rotateAngle
    console.info('rotateAngle:', this.rotateAngle)
  })

更多关于HarmonyOS鸿蒙Next中animateTo为什么废弃了?有新增替代animateTo的方法吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

并没有被废弃,一次性讲清楚,只要跟UI相关的,目前华为对API接口进行了规范化归类,那就是需要通过 this.getUIContext() 进行获取

而动画的执行,本身就是跟UI相关的;

拓展:比如以下代码

showDialog 也是跟UI相关的,所有也需要通过 this.getUIContexgt 进行获取,例如:

这种例子很多,都是通过该对象进行获取,

更多关于HarmonyOS鸿蒙Next中animateTo为什么废弃了?有新增替代animateTo的方法吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


从API version 18开始废弃,建议使用UIContext中的animateTo替代。

从API version 10开始,可以通过使用UIContext中的animateTo来明确UI的执行上下文。

animateTo并未完全废弃把?是在API 12之后新增了animateToImmediately接口,他俩适用于不同场景。

原animateTo实现无限循环动画时,同步回调可能被错误纳入动画循环,需改用以下方式试试:

使用animateToImmediately

animateToImmediately({

  duration: 2000,
  iterations: -1,
  curve: Curve.FastOutSlowIn

}, () => {
  this.angleA = 360;
});

或者使用animation

Column()
  .rotate({ angle: this.angleA })
  .animation({
    duration: 1500,
    curve: Curve.Linear,
    iterations: -1 // 还是比较推荐这种方式实现循环动画
})

如果涉及组件插入/删除时,最好采用TransitionEffect与animateTo的组合:

// 结合组件转场动画
animateTo({
  duration: 350,
  curve: Curve.Friction
}, () => {
  this.isExpand = !this.isExpand; // 触发组件树变更
});

// 获取组件的UIContext实例 const uiContext = getUIContext(this); uiContext.animateTo({ duration: 1000 }, () => { this.rotateAngle = 90; // 触发属性变化动画 });

1.animateTo的使用方法更新是为了规范使用,明确上下文的规范问题

  1. 为了解决此类问题,ArkUI针对Stage模型推出了替代接口,以便满足开发者在多ArkUI实例场景下的诉求。可以通过获取UIContext调用对应的多实例替代接口,以解决多实例场景下调用点无法明确指认UI实例的问题。其中UIContext是ArkUI实例的上下文,它是由窗口创建的用于管理所有UI的对象,并且该对象由创建的窗口所持有和管理。

    所以现在出现了用上下文的方式来获取animateTo

  2. 使用方法如下:

this.uiContext?.animateTo({
    duration: 2000,
    curve: Curve.EaseOut,
    iterations: 3,
    playMode: PlayMode.Normal,
    onFinish: () => {
        console.info('play end');
    }
}, () => {
    this.widthSize = 150;
    this.heightSize = 60;
});
  1. 接口替代说明文档: 使用UI上下文接口操作界面(UIContext)-UI系统场景化能力-UI开发 (ArkTS声明式开发范式)-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

建议使用this.getUIContext()?.animateTo()

this.getUIContext()?.animateTo({
  duration: 2000,
  curve: Curve.EaseOut,
  iterations: 1,
  playMode: PlayMode.Normal,
  onFinish: () => {
    this.count--;
    if (this.count == 0 && !this.isToBottom) { // 组件只有在向下做完动画才会消失
      this.isShow = false;
    }
  }
}, () => {
  this.count++;
  if (this.isToBottom) {
    this.heightSize = 60;
  } else {
    this.heightSize = 100;
  }
  this.isToBottom = !this.isToBottom;
})

参考文档:显式动画 (animateTo)-动画-ArkTS组件-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

在HarmonyOS Next中,animateTo被废弃是因为其性能问题和API设计不够灵活。替代方案是使用新的动画API:PropertyAnimation和ExplicitAnimation。PropertyAnimation通过animator属性实现属性动画,ExplicitAnimation通过animation组件声明式定义动画。两者均支持easing曲线、delay等配置,性能更优且与ArkUI框架深度集成。具体可查看官方文档中"动画"章节的更新说明。

在HarmonyOS Next中,animateTo被废弃主要是为了统一动画API的设计范式。替代方案是使用新的.animation()方法,这是更符合声明式UI规范的实现方式。

从您提供的代码示例可以看出,新的.animation()方法已经可以完全替代animateTo的功能:

  1. 支持durationcurveiterations等参数
  2. 支持无限循环(iterations: -1)
  3. 通过状态变量驱动动画

主要区别在于:

  1. animation是链式调用而非独立函数
  2. 动画触发改为状态驱动而非命令式调用
  3. 更贴近ArkUI的声明式编程风格

建议将所有animateTo调用迁移到.animation()方式,这是HarmonyOS Next推荐的动画实现方案。

回到顶部