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

打印 上一主题 下一主题

主题 963|帖子 963|积分 2889

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



  • 鸿蒙开发焦点知识点,看这篇文章就够了
  • 最新版!鸿蒙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中实举措画。
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct AnimateToExample {
  5.   @State widthSize: number = 250
  6.   @State heightSize: number = 100
  7.   @State rotateAngle: number = 0
  8.   private flag: boolean = true
  9.   build() {
  10.     Column() {
  11.       Button('change size')
  12.         .width(this.widthSize)
  13.         .height(this.heightSize)
  14.         .margin(30)
  15.         .onClick(() => {
  16.           if (this.flag) {
  17.             // 建议使用this.getUIContext()?.animateTo()
  18.             animateTo({
  19.               duration: 2000,
  20.               curve: Curve.EaseOut,
  21.               iterations: 3,
  22.               playMode: PlayMode.Normal,
  23.               onFinish: () => {
  24.                 console.info('play end')
  25.               }
  26.             }, () => {
  27.               this.widthSize = 150
  28.               this.heightSize = 60
  29.             })
  30.           } else {
  31.             // 建议使用this.getUIContext()?.animateTo()
  32.             animateTo({}, () => {
  33.               this.widthSize = 250
  34.               this.heightSize = 100
  35.             })
  36.           }
  37.           this.flag = !this.flag
  38.         })
  39.       Button('stop rotating')
  40.         .margin(50)
  41.         .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
  42.         .onAppear(() => {
  43.           // 组件出现时开始做动画
  44.           // 建议使用this.getUIContext()?.animateTo()
  45.           animateTo({
  46.             duration: 1200,
  47.             curve: Curve.Friction,
  48.             delay: 500,
  49.             iterations: -1, // 设置-1表示动画无限循环
  50.             playMode: PlayMode.Alternate,
  51.             expectedFrameRateRange: {
  52.               min: 10,
  53.               max: 120,
  54.               expected: 60,
  55.             }
  56.           }, () => {
  57.             this.rotateAngle = 90
  58.           })
  59.         })
  60.         .onClick(() => {
  61.           // 建议使用this.getUIContext()?.animateTo()
  62.           animateTo({ duration: 0 }, () => {
  63.             // this.rotateAngle之前为90,在duration为0的动画中修改属性,可以停止该属性之前的动画,按新设置的属性显示
  64.             this.rotateAngle = 0
  65.           })
  66.         })
  67.     }.width('100%').margin({ top: 5 })
  68.   }
  69. }
复制代码

示例2

动画实行完后组件消散。
  1. // xxx.ets
  2. @Entry
  3. @Component
  4. struct AttrAnimationExample {
  5.   @State heightSize: number = 100;
  6.   @State isShow: boolean= true;
  7.   @State count: number= 0;
  8.   private isToBottom: boolean = true; // 向下
  9.   build() {
  10.     Column() {
  11.       if (this.isShow) {
  12.         Column()
  13.           .width(200)
  14.           .height(this.heightSize)
  15.           .backgroundColor('blue')
  16.           .onClick(() => {
  17.             // 建议使用this.getUIContext()?.animateTo()
  18.             animateTo({
  19.               duration: 2000,
  20.               curve: Curve.EaseOut,
  21.               iterations: 1,
  22.               playMode: PlayMode.Normal,
  23.               onFinish: () => {
  24.                 this.count--;
  25.                 if (this.count == 0 && !this.isToBottom) { // 组件只有在向下做完动画才会消失
  26.                   this.isShow = false;
  27.                 }
  28.               }
  29.             }, () => {
  30.               this.count++;
  31.               if (this.isToBottom) {
  32.                 this.heightSize = 60;
  33.               } else {
  34.                 this.heightSize = 100;
  35.               }
  36.               this.isToBottom = !this.isToBottom;
  37.             })
  38.           })
  39.       }
  40.     }.width('100%').height('100%').margin({ top: 5 })
  41.     .justifyContent(FlexAlign.End)
  42.   }
  43. }
复制代码





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表