鸿蒙开发:了解显式动画animateTo

简介: 在实际的开发中,应该遵循规范,正确的使用属性动画animateTo,切莫在轮询中使用,否则就会造成本不属当前的动画进行执行,造成UI错误,还有一点需要注意,那就是直接使用animateTo可能导致实例不明确的问题,建议使用getUIContext获取UIContext实例,并使用animateTo调用绑定实例的animateTo。

前言


上篇文章,我们简单了解了属性动画,知道了属性动画有两种实现方式,一种是animation,另一种是animateTo,上篇的案例基本上也都是使用animation来实现的,其实在案例中,大家也都发现了,animation是组件的通用属性,也就是说是和组件进行绑定的,如果想让多个组件进行动画播放,那么就需要绑定多个组件。有没有一种方式,执行起来,可以适用于多个可动画属性配置相同动画参数的动画呢,答案是必须有的,这就是animateTo。

举一个很简单的案例,让两个组件,同时在X轴方向,平移100,用时1秒。

@Entry
@Component
struct Index {
  @State translateX: number = 0
  build() {
    RelativeContainer() {
      Text("1")
        .width(50)
        .height(50)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.Red)
        .translate({ x: this.translateX })
        .margin({ top: 100 })
        .id("view1")
        .alignRules({
          top: { anchor: "__container__", align: VerticalAlign.Top },
          middle: { anchor: "__container__", align: HorizontalAlign.Center }
        })
      Text("2")
        .width(50)
        .height(50)
        .textAlign(TextAlign.Center)
        .backgroundColor(Color.Red)
        .translate({ x: this.translateX })
        .margin({ top: 100 })
        .alignRules({
          top: { anchor: "view1", align: VerticalAlign.Top },
          middle: { anchor: "__container__", align: HorizontalAlign.Center }
        })
      Button("点击")
        .margin({ top: 10 })
        .onClick(() => {
          animateTo({ duration: 1000 }, () => {
            this.translateX = 100
          })
        })
        .alignRules({
          center: { anchor: "__container__", align: VerticalAlign.Center },
          middle: { anchor: "__container__", align: HorizontalAlign.Center }
        })
    }
    .height('100%')
    .width('100%')
  }
}

动画效果:



从上边的案例中我们可以看到,animateTo是一个全局实现属性动画的方式,它可以应用于多个组件之间,但是呢使用它,有两个需要注意的点,那就是不推荐在aboutToAppear、aboutToDisappear中调用动画;在aboutToAppear中,是因为自定义组件内的build还未执行,内部组件还未创建,动画时机过早,动画属性没有初值无法对组件产生动画;aboutToDisappear原因是,组件即将销毁,不能在aboutToDisappear里面做动画。


相关参数


通过源码,我们看到有两个参数,第一个参数是AnimateParam,用于控制动画执行的相关属性,比如延时,时间,速度等等,第二个参数是一个闭包回调函数,用于改变动画属性。


declare function animateTo(value: AnimateParam, event: () => void): void;


AnimateParam参数


名称

类型

是否必填

描述

duration

number

动画持续时间,单位为毫秒。默认值:1000

tempo

number

动画播放速度,值越大动画播放越快,值越小播放越慢,为0时无动画效果。默认值:1.0

curve

Curve| ICurve9+|string

动画曲线。默认值:Curve.EaseInOut

delay

number

动画延迟播放时间,单位为ms(毫秒),默认不延时播放。

默认值:0

iterations

number

动画播放次数。默认播放一次,设置为-1时表示无限次播放。设置为0时表示无动画效果。默认值:1

playMode

PlayMode

动画播放模式,默认播放完成后重头开始播放。

默认值:PlayMode.Normal

onFinish

() => void

动画播放完成回调。

finishCallbackType11+

FinishCallbackType

在动画中定义onFinish回调的类型。

默认值:FinishCallbackType.REMOVED

expectedFrameRateRange11+

ExpectedFrameRateRange

设置动画的期望帧率。

以上的每个参数,都可能在特定的情况下进行运用。

duration参数,不多说了,就是执行动画的总体时间,这个也是实际属性动画中最常见的一个属性;像tempo,delay,iterations,playMode,onFinish都是毕竟常见而且简单的属性,就不过多赘述了,我们重点概述下剩下的几个参数。

curve,动画执行的曲线,走的是贝塞尔曲线形式,可设置的类型比较多,默认值是Curve.EaseInOut,也就是动画以低速开始和结束,除此之外,还有Linear,表示动画从头到尾的速度都是相同的;Ease:表示动画以低速开始,然后加快,在结束前变慢;EaseIn:表示动画以低速开始;EaseOut:表示动画以低速结束;FastOutSlowIn:标准曲线,LinearOutSlowIn:减速曲线;FastOutLinearIn:加速曲线;ExtremeDeceleration:急缓曲线;Sharp:锐利曲线;Rhythm:节奏曲线;Smooth:平滑曲线;Friction:阻尼曲线。

playMode,可以设置动画播放模式,目前提供的有四种播放模式,默认是Normal也就是正向播放,Reverse是反向播放,Alternate毕竟好玩,可以让动画在奇数次(1、3、5...)正向播放,在偶数次(2、4、6...)反向播放;AlternateReverse是和Alternate相反的,动画在奇数次(1、3、5...)反向播放,在偶数次(2、4、6...)正向播放。

在Api11之后的版本,又增加了两个属性,分别是finishCallbackType和expectedFrameRateRange,前者可以定义动画结束时回调的类型,后者可以设置动画执行的帧率,帧率包括,最大,最小和最优,可以根据需求进行设置。

相关总结


在实际的开发中,应该遵循规范,正确的使用属性动画animateTo,切莫在轮询中使用,否则就会造成本不属当前的动画进行执行,造成UI错误,还有一点需要注意,那就是直接使用animateTo可能导致实例不明确的问题,建议使用getUIContext获取UIContext实例,并使用animateTo调用绑定实例的animateTo。

相关文章
|
1天前
|
存储 人工智能 JavaScript
Harmony OS开发-ArkTS语言速成二
本文介绍了ArkTS基础语法,包括三种基本数据类型(string、number、boolean)和变量的使用。重点讲解了let、const和var的区别,涵盖作用域、变量提升、重新赋值及初始化等方面。期待与你共同进步!
61 47
Harmony OS开发-ArkTS语言速成二
|
3天前
|
索引
鸿蒙开发:自定义一个股票代码选择键盘
金融类的软件,特别是股票基金类的应用,在查找股票的时候,都会有一个区别于正常键盘的键盘,也就是股票代码键盘,和普通键盘的区别就是,除了常见的数字之外,也有一些常见的股票代码前缀按钮,方便在查找股票的时候,更加方便的进行检索。
鸿蒙开发:自定义一个股票代码选择键盘
|
3天前
鸿蒙开发:自定义一个英文键盘
实现方式呢,有很多种,目前采用了比较简单的一种,如果大家采用网格Grid组件实现方式,也是可以的,但是需要考虑每行的边距以及数据,还有最后两行的格子占位问题。
鸿蒙开发:自定义一个英文键盘
|
2天前
|
前端开发 API 数据库
鸿蒙开发:异步并发操作
在结合async/await进行使用的时候,有一点需要注意,await关键字必须结合async,这两个是搭配使用的,缺一不可,同步风格在使用的时候,如何获取到错误呢,毕竟没有catch方法,其实,我们可以自己创建try/catch来捕获异常。
鸿蒙开发:异步并发操作
|
2天前
|
API
鸿蒙开发:实现popup弹窗
目前提供了两种方式实现popup弹窗,主推系统实现的方式,几乎能满足我们常见的所有场景,当然了,文章毕竟有限,尽量还是以官网为主。
鸿蒙开发:实现popup弹窗
|
3天前
鸿蒙开发:自定义一个车牌字母键盘
车牌字母键盘和一般的键盘还有很大区别的,大家可以发现,键盘上是少一个字母的,因为I字母具有混淆性,所以这个字母是不在车牌键盘内的。
鸿蒙开发:自定义一个车牌字母键盘
|
3天前
|
机器学习/深度学习 API 语音技术
鸿蒙开发:文本合成语音
在鸿蒙当中,如何实现根据指定的文本进行合成语音合成播放呢,其实也是非常的简单,因为鸿蒙当中也有textToSpeech。
|
3天前
|
存储 前端开发 关系型数据库
鸿蒙开发:实现键值数据库存储
对于数据量比较的小的,我们直接选择轻量级的用户首选项方式即可,而对于数据量比较大的情况下,直接可以使用数据库,而对于相对来说,比较大的数据,我们就可以使用键值型数据库方式
|
2天前
|
开发框架 物联网 API
HarmonyOS开发:串行通信开发详解
在电子设备和智能系统的设计中,数据通信是连接各个组件和设备的核心,串行通信作为一种基础且广泛应用的数据传输方式,因其简单、高效和成本效益高而被广泛采用。HarmonyOS作为一个全场景智能终端操作系统,不仅支持多种设备和场景,还提供了强大的开发框架和API,使得开发者能够轻松实现串行通信功能。随着技术的不断进步,串行通信技术也在不断发展。在HarmonyOS中,串行通信的开发不仅涉及到基本的数据发送和接收,还包括设备配置、错误处理和性能优化等多个方面。那么本文就来深入探讨在HarmonyOS中如何开发串行通信应用,包括串行通信的基础知识、HarmonyOS提供的API、开发步骤和实际代码示例
16 2
|
2天前
鸿蒙语言开发 几十套鸿蒙ArkTs app毕业设计及课程作业
鸿蒙语言开发 几十套鸿蒙ArkTs app毕业设计及课程作业
13 1

热门文章

最新文章