HarmonyOS 鸿蒙Next ComponentV2组件下 在promise.then中使用animateTo动画后没有过渡动画
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 = truebuild() { 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 export struct RefreshPullView { @State widthSize: number = 250 @State heightSize: number = 100 @State rotateAngle: number = 0 private flag: boolean = truebuild() { 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
目前验证发现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执行环境的问题。以下是一些可能的原因及处理方法:
-
动画触发时机:
promise.then
是异步执行的,如果在DOM还未完全准备好的情况下触发动画,可能会导致动画无效。确保动画触发时,相关组件已渲染完成。 -
动画执行环境:在某些情况下,动画执行可能依赖于特定的UI线程或渲染状态。确保动画执行时,UI线程处于可操作状态。
-
动画参数检查:确认
animateTo
方法的参数是否正确,包括目标值、动画时长、缓动函数等。参数错误可能导致动画无效。 -
动画冲突:检查是否有其他动画或样式变更与
animateTo
冲突,导致动画被覆盖或取消。 -
组件状态:确保在调用
animateTo
时,组件的状态允许动画执行。例如,如果组件处于不可见或禁用状态,动画可能无法正确执行。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。