HarmonyOS 鸿蒙Next ComponentV2组件下 在promise.then中使用animateTo动画后没有过渡动画

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next ComponentV2组件下 在promise.then中使用animateTo动画后没有过渡动画

我分别使用了@ComponentV2和Component对官方的动画做修改

@ComponentV2中使用Promise.then的回调中使用动画没有过度效果  直接执行到了最终态

@Component中使用Promise.then的回调中使用动画是正常的

如下

@ComponentV2
export struct RefreshPullView {
@Local widthSize: number = 250
@Local heightSize: number = 100
@Local rotateAngle: number = 0
private flag: boolean = true

build() { Column() {

  Button('stop rotating')
    .margin(50)
    .rotate({
      x: 0,
      y: 0,
      z: 1,
      angle: this.rotateAngle
    })
    .onAppear(() => {
      new Promise<string>((resolve, reject) => {

        resolve('刷新失败');
      }).then(() => {
        // 组件出现时开始做动画
        // 建议使用this.getUIContext()?.animateTo()
        animateTo({
          duration: 1200,
          curve: Curve.Friction,
          delay: 500,
          iterations: -1, // 设置-1表示动画无限循环
          playMode: PlayMode.Alternate,
          expectedFrameRateRange: {
            min: 10,
            max: 120,
            expected: 60,
          }
        }, () => {
          this.rotateAngle = 90
        })
      })


    })
    .onClick(() => {
      // 建议使用this.getUIContext()?.animateTo()
      animateTo({ duration: 0 }, () => {
        // this.rotateAngle之前为90,在duration为0的动画中修改属性,可以停止该属性之前的动画,按新设置的属性显示
        this.rotateAngle = 0
      })
    })
}.width('100%').margin({ top: 5 })

} }

@Component如下

@Component
export struct RefreshPullView {
@State widthSize: number = 250
@State heightSize: number = 100
@State rotateAngle: number = 0
private flag: boolean = true

build() { Column() {

  Button('stop rotating')
    .margin(50)
    .rotate({
      x: 0,
      y: 0,
      z: 1,
      angle: this.rotateAngle
    })
    .onAppear(() => {
      new Promise<string>((resolve, reject) => {

        resolve('刷新失败');
      }).then(() => {
        // 组件出现时开始做动画
        // 建议使用this.getUIContext()?.animateTo()
        animateTo({
          duration: 1200,
          curve: Curve.Friction,
          delay: 500,
          iterations: -1, // 设置-1表示动画无限循环
          playMode: PlayMode.Alternate,
          expectedFrameRateRange: {
            min: 10,
            max: 120,
            expected: 60,
          }
        }, () => {
          this.rotateAngle = 90
        })
      })


    })
    .onClick(() => {
      // 建议使用this.getUIContext()?.animateTo()
      animateTo({ duration: 0 }, () => {
        // this.rotateAngle之前为90,在duration为0的动画中修改属性,可以停止该属性之前的动画,按新设置的属性显示
        this.rotateAngle = 0
      })
    })
}.width('100%').margin({ top: 5 })

} }

我用的是@ComponentV2
并且用uiContext调用animateTo也是没有效果

uiContext: UIContext | undefined = undefined;

aboutToAppear() { this.uiContext = this.getUIContext();

}


更多关于HarmonyOS 鸿蒙Next ComponentV2组件下 在promise.then中使用animateTo动画后没有过渡动画的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

目前验证发现V2属性在animate属性动画中的属性变化不能放在异步回调中执行,否则会在第一帧直接加载最终效果。建议去掉Promise包裹的异步实现,直接运行:

this.getUIContext().animateTo({
            duration: 1200,
            curve: Curve.Friction,
            delay: 500,
            iterations: -1, // 设置-1表示动画无限循环
            playMode: PlayMode.Alternate,
            expectedFrameRateRange: {
              min: 10,
              max: 120,
              expected: 60,
            }
          }, () => {
            this.rotateAngle =90
          })<button style="position: absolute; padding: 4px 8px 0px; cursor: pointer; top: 8px; right: 8px; font-size: 14px;">复制</button>

更多关于HarmonyOS 鸿蒙Next ComponentV2组件下 在promise.then中使用animateTo动画后没有过渡动画的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


如果可以 我也想去掉Promise包裹

您好,问题正在分析中

在HarmonyOS鸿蒙Next ComponentV2组件中,如果在promise.then中使用animateTo动画后发现没有过渡动画,可能是由于动画触发时机或Promise执行环境的问题。以下是一些可能的原因及处理方法:

  1. 动画触发时机promise.then是异步执行的,如果在DOM还未完全准备好的情况下触发动画,可能会导致动画无效。确保动画触发时,相关组件已渲染完成。

  2. 动画执行环境:在某些情况下,动画执行可能依赖于特定的UI线程或渲染状态。确保动画执行时,UI线程处于可操作状态。

  3. 动画参数检查:确认animateTo方法的参数是否正确,包括目标值、动画时长、缓动函数等。参数错误可能导致动画无效。

  4. 动画冲突:检查是否有其他动画或样式变更与animateTo冲突,导致动画被覆盖或取消。

  5. 组件状态:确保在调用animateTo时,组件的状态允许动画执行。例如,如果组件处于不可见或禁用状态,动画可能无法正确执行。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部