九天猎人 发表于 2024-12-28 15:32:15

鸿蒙5.0版开发:ArkTS组件-显式动画 (animateTo)

往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)



[*] 鸿蒙开发焦点知识点,看这篇文章就够了
[*] 最新版!鸿蒙HarmonyOS Next应用开发实战学习路线
[*] 鸿蒙HarmonyOS NEXT开发技能最全学习路线指南
[*] 鸿蒙应用开发实战项目,看这一篇文章就够了(部门项目附源码)
显式动画 (animateTo)

提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。同属性动画,布局类改变宽高的动画,内容都是直接到止境状态,比方文字、Canvas的内容等,假如要内容跟随宽高变化,可以利用renderFit属性配置。
   阐明:
从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
本模块功能依赖UI的实行上下文,不可在UI上下文不明确的地方利用。
卡片本领: 从API version 9开始,该接口支持在ArkTS卡片中利用。
从API version 10开始,可以通过利用UIContext中的animateTo来明确UI的实行上下文。
从API version 11开始,该接口支持在原子化服务中利用。
接口

animateTo(value: AnimateParam, event: () => void): void
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。
   阐明:


[*]在duration为0的动画闭包函数中改变属性,以实现停止该属性动画的效果。
[*]假如需要在组件出现时创建动画,可以参考示例1,在onAppear中实现动画的创建。
[*]不推荐在aboutToAppear、aboutToDisappear中调用动画。
[*]假如在aboutToAppear中调用动画,自界说组件内的build还未实行,内部组件还未创建,动画机会过早,动画属性没有初值无法对组件产生动画。
[*]实行aboutToDisappear时,组件即将烧毁,不能在aboutToDisappear内里做动画。
[*]也可以利用组件内转场,在组件出现和消散时做动画。
[*]组件内转场不支持的属性,可以参考示例2,利用animationTo实现组件消散动画效果。
参数:
参数类型是否必填描述valueAnimateParam是设置动画效果相干参数。event() => void是指定动效的闭包函数,在闭包函数中导致的状态变化系统会自动插入过渡动画。 AnimateParam对象阐明

名称类型是否必填描述durationnumber否动画持续时间,单元为毫秒。
默认值:1000
卡片本领: 从API version 9开始,该接口支持在ArkTS卡片中利用。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。
阐明:
- 在ArkTS卡片上最大动画持续时间为1000毫秒,若超出则固定为1000毫秒。
- 设置小于0的值时按0处置惩罚。
- 设置浮点型类型的值时,向下取整。比方,设置值为1.2,按照1处置惩罚。temponumber否动画播放速率,值越大动画播放越快,值越小播放越慢,为0时无动画效果。
默认值:1.0
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。
阐明:
当设置小于0的值时按值为1处置惩罚。curveCurve | ICurve9+ | string否动画曲线。
默认值:Curve.EaseInOut
卡片本领: 从API version 9开始,该接口支持在ArkTS卡片中利用。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。delaynumber否动画延迟播放时间,单元为ms(毫秒),默认不延时播放。
默认值:0
取值范围:(-∞, +∞)
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。
阐明:
- delay>=0为延迟播放,delay<0表示提前播放。对于delay<0的情况:当delay的绝对值小于现实动画时长,动画将在开始后第一帧直接运动到delay绝对值的时刻的状态;当delay的绝对值大于等于现实动画时长,动画将在开始后第一帧直接运动到止境状态。其中现实动画时长等于单次动画时长乘以动画播放次数。
- 设置浮点型类型的值时,向下取整。比方,设置值为1.2,按照1处置惩罚。iterationsnumber否动画播放次数。默认播放一次,设置为-1时表示无限次播放。设置为0时表示无动画效果。
默认值:1
取值范围:[-1, +∞)
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。playModePlayMode否动画播放模式,默认播放完成后重头开始播放。
默认值:PlayMode.Normal
卡片本领: 从API version 9开始,该接口支持在ArkTS卡片中利用。
相干利用约束请参考PlayMode阐明。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。onFinish() => void否动画播放完成回调。
卡片本领: 从API version 9开始,该接口支持在ArkTS卡片中利用。
原子化服务API: 从API version 11开始,该接口支持在原子化服务中利用。finishCallbackType11+FinishCallbackType否在动画中界说onFinish回调的类型。
默认值:FinishCallbackType.REMOVED
卡片本领: 从API version 11开始,该接口支持在ArkTS卡片中利用。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中利用。expectedFrameRateRange11+ExpectedFrameRateRange否设置动画的盼望帧率。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中利用。   PlayMode阐明:


[*]PlayMode推荐利用PlayMode.Normal和PlayMode.Alternate,此场景下动画的第一轮是正向播放的。如利用PlayMode.Reverse和PlayMode.AlternateReverse,则动画的第一轮是逆向播放的,在动画刚开始时会跳变到终止状态,然后逆向播放动画。
[*]利用PlayMode.Alternate或PlayMode.AlternateReverse时,开发者应包管动画终极状态和状态变量的取值一致,即应包管动画的最后一轮是正向播放的。利用PlayMode.Alternate时,iterations应为奇数。利用PlayMode.AlternateReverse时,iterations应为偶数。
[*]不推荐利用PlayMode.Reverse,此场景下不仅会导致动画刚开始就跳变到终止状态,也会导致动画终极状态和状态变量的取值差别。
FinishCallbackType11+

卡片本领: 从API version 11开始,该接口支持在ArkTS卡片中利用。
原子化服务API: 从API version 12开始,该接口支持在原子化服务中利用。
系统本领: SystemCapability.ArkUI.ArkUI.Full
名称描述REMOVED当整个动画竣事并立即删除时,将触发回调。LOGICALLY当动画在逻辑上处于降落状态,但可能仍处于其长尾状态时,将触发回调。 ExpectedFrameRateRange11+

原子化服务API: 从API version 12开始,该接口支持在原子化服务中利用。
名称类型阐明minnumber盼望的最小帧率。maxnumber盼望的最大帧率。expectednumber盼望的最优帧率。 示例1

   阐明:
直接利用animateTo可能导致实例不明确的标题,建议利用getUIContext获取UIContext实例,并利用animateTo调用绑定实例的animateTo。
在组件的onAppear中实举措画。
// xxx.ets
@Entry
@Component
struct AnimateToExample {
@State widthSize: number = 250
@State heightSize: number = 100
@State rotateAngle: number = 0
private flag: boolean = true

build() {
    Column() {
      Button('change size')
      .width(this.widthSize)
      .height(this.heightSize)
      .margin(30)
      .onClick(() => {
          if (this.flag) {
            // 建议使用this.getUIContext()?.animateTo()
            animateTo({
            duration: 2000,
            curve: Curve.EaseOut,
            iterations: 3,
            playMode: PlayMode.Normal,
            onFinish: () => {
                console.info('play end')
            }
            }, () => {
            this.widthSize = 150
            this.heightSize = 60
            })
          } else {
            // 建议使用this.getUIContext()?.animateTo()
            animateTo({}, () => {
            this.widthSize = 250
            this.heightSize = 100
            })
          }
          this.flag = !this.flag
      })
      Button('stop rotating')
      .margin(50)
      .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
      .onAppear(() => {
          // 组件出现时开始做动画
          // 建议使用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 })
}
}
https://i-blog.csdnimg.cn/direct/df80f745b21947f680cc4a781817039f.png
示例2

动画实行完后组件消散。
// xxx.ets
@Entry
@Component
struct AttrAnimationExample {
@State heightSize: number = 100;
@State isShow: boolean= true;
@State count: number= 0;
private isToBottom: boolean = true; // 向下

build() {
    Column() {
      if (this.isShow) {
      Column()
          .width(200)
          .height(this.heightSize)
          .backgroundColor('blue')
          .onClick(() => {
            // 建议使用this.getUIContext()?.animateTo()
            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;
            })
          })
      }
    }.width('100%').height('100%').margin({ top: 5 })
    .justifyContent(FlexAlign.End)
}
}

https://i-blog.csdnimg.cn/img_convert/46fb757ae8dd645911643ac0fdad0ba2.gif
https://i-blog.csdnimg.cn/direct/703087920c1e470298018f36136f0494.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 鸿蒙5.0版开发:ArkTS组件-显式动画 (animateTo)