HarmonyOS 鸿蒙Next Progress组件的宽高值不支持动画 定位原因及解决办法

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

HarmonyOS 鸿蒙Next Progress组件的宽高值不支持动画 定位原因及解决办法

项目中视频录制按钮使用的Progress组件,该组件上下移动时,需要动态修改Progress组件的宽高值,做出的实际效果很奇怪,
调试发现Progress组件的宽高值不支持动画,动画开始就直接使用了最终的宽高值,我们项目里面动画时间是300ms,动画时间调到6s可以清楚的看到Progress组件的宽高值不支持动画,请问有什么解决办法吗?

demo:

@Entry

@Component

struct Index {

  @State cameraTranslateY: number = 0

  @State cameraBtnSize: number = 65

  @State isTranslate: boolean = false // 是否已经向下平移

  aboutToAppear(): void {

  }

  clickEvent() {

    if (this.isTranslate) {

      animateTo({ duration: 6000, iterations: 1, playMode: PlayMode.Alternate }, () => {

        this.cameraTranslateY = 0

        this.cameraBtnSize = 65

      })

    } else {

      animateTo({ duration: 6000, iterations: 1, playMode: PlayMode.Alternate }, () => {

        this.cameraTranslateY = 100

        this.cameraBtnSize = 50

      })

    }

    this.isTranslate = !this.isTranslate

  }

  build() {

    RelativeContainer() {

      Text(‘点击Progress组件即可看到效果’)

        .alignRules({

          top: { anchor: ‘container’, align: VerticalAlign.Top },

          middle: { anchor: ‘container’, align: HorizontalAlign.Center }

        })

        .margin({ top: 60 })

      Row() {

        Progress({ value: 50, total: 100, type: ProgressType.Ring })

          .width(this.cameraBtnSize + 30)

          .aspectRatio(1)

          .color(’#FFA04F’)

          .backgroundColor(’#F3F3F3’)

          .style({ strokeWidth: 3 })

          .padding(15)

          .onClick(() => {

            this.clickEvent()

          })

      }

      .width(this.cameraBtnSize + 30)

      .aspectRatio(1)

      .alignRules({

        center: { anchor: ‘container’, align: VerticalAlign.Center },

        middle: { anchor: ‘container’, align: HorizontalAlign.Center }

      })

      .backgroundColor(Color.Grey)

      .translate({

        y: this.cameraTranslateY

      })

    }

    .width(‘100%’)

    .height(‘100%’)

    .backgroundColor(Color.White)

  }

}

2 回复

可以试下使用animator 实现:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-animator-V5

如:

import { Animator as animator, AnimatorResult } from '@kit.ArkUI';

@Entry

@Component

struct ProgressDemo {

@State cameraTranslateY: number = 0

@State cameraBtnSize: number = 65

@State isTranslate: boolean = false // 是否已经向下平移



private backAnimator: AnimatorResult | undefined = undefined

create() {

this.backAnimator = animator.create({// 建议使用 this.getUIContext.creatAnimator()接口

duration: 6000,

easing: "ease",

delay: 0,

fill: "forwards",

direction: "normal",

iterations: 1,

begin: 100,

end: 50

})

this.backAnimator.onFinish = ()=> {

console.info('backAnimator onfinish')

}

this.backAnimator.onRepeat = ()=> {

console.info('backAnimator repeat')

}

this.backAnimator.onCancel = ()=> {

console.info('backAnimator cancel')

}

this.backAnimator.onFrame = (value:number)=> {

this.cameraBtnSize = value

}

}

aboutToAppear(): void {

this.create()

}

clickEvent() {

if (this.isTranslate) {

animateTo({ duration: 6000, iterations: 1, playMode: PlayMode.Alternate }, () => {

this.cameraTranslateY = 0

this.cameraBtnSize = 65

})

} else {

animateTo({ duration: 6000, iterations: 1, playMode: PlayMode.Alternate }, () => {

this.cameraTranslateY = 100

this.cameraBtnSize = 50

})

}

this.isTranslate = !this.isTranslate

}

build() {

RelativeContainer() {

Text('点击Progress组件即可看到效果')

.alignRules({

top: { anchor: '__container__', align: VerticalAlign.Top },

middle: { anchor: '__container__', align: HorizontalAlign.Center }

})

.margin({ top: 60 })

Row() {

Progress({ value: 50, total: 100, type: ProgressType.Ring })

.width(this.cameraBtnSize + 30)

.aspectRatio(1)

.color('#FFA04F')

.backgroundColor('#F3F3F3')

.style({ strokeWidth: 3 })

.padding(15)

.onClick(() => {

// this.clickEvent()

this.isTranslate = !this.isTranslate

if (this.isTranslate) {

this.backAnimator?.play();

} else {

this.backAnimator?.reverse()

}

})

}

.width(this.cameraBtnSize + 30)

.aspectRatio(1)

.alignRules({

center: { anchor: '__container__', align: VerticalAlign.Center },

middle: { anchor: '__container__', align: HorizontalAlign.Center }

})

.backgroundColor(Color.Grey)

.translate({

y: this.cameraTranslateY

})



}

.width('100%')

.height('100%')

.backgroundColor(Color.White)

}

}

作为IT专家,对于HarmonyOS 鸿蒙Next Progress组件宽高值不支持动画的问题,以下是定位原因及解决办法:

定位原因

HarmonyOS鸿蒙Next的Progress组件,其宽高值不支持动画效果的原因,可能在于组件本身的属性设计。在HarmonyOS的UI框架中,部分组件的属性(如宽高)可能并未被设计为支持动画过渡效果。此外,如果组件的宽高是通过布局容器(如Row、Column等)的约束来确定的,那么直接对这些属性进行动画处理可能会受到限制。

解决办法

  1. 使用布局类动画:考虑使用布局类的动画效果,如通过改变布局容器的尺寸来间接影响Progress组件的尺寸。这可以通过动画框架(如animateTo)来实现,但需要注意动画的终点状态和目标效果。
  2. 自定义动画:如果标准动画效果无法满足需求,可以考虑通过自定义动画来实现。例如,使用Canvas或其他绘图工具在组件上绘制动画效果,但这需要较高的编程技巧。
  3. 更新组件版本:检查并更新HarmonyOS的开发工具和组件库到最新版本,以查看是否增加了对宽高动画的支持。

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

回到顶部