【HarmonyOS】【应用开发】动画-属性动画与显式动画

这篇具有很好参考价值的文章主要介绍了【HarmonyOS】【应用开发】动画-属性动画与显式动画。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、属性动画

(一)、定义

  官网对于属性动画的定义如下:

组件的某些通用属性变化时,可以通过属性动画实现渐变过渡效果,提升用户体验。支持的属性包括width、height、backgroundColor、opacity、scale、rotate、translate等

  个人理解:属性动画针对的是同一个组件的属性变化情况,如在同一个页面中触发了组件的属性变化,这个变化需要以过渡的方式体现,这就需要属性动画来承接这个过渡过程,不然变化就会显得十分突兀与生硬。因此,只要组件的指定属性有变化,那么这个变化就会通过属性动画来体现。


(二)、使用方式

  使用属性动画,通过animation属性来为每个组件定义该组件对应的属性动画,如下所示:

animation(
	value: {
		duration?: number, 
		tempo?: number, 
		curve?: string | Curve | ICurve, 
		delay?:number, 
		iterations: number, 
		playMode?: PlayMode, 
		onFinish?: () => void
	}
)

  其中的每个参数都会改变属性动画的展现情况,

  • duration:设置动画时长,默认值为1000ms,如果设置了浮点值则向下取整;
  • tempo:动画播放速度,默认值为1,数值越大,动画播放速度越快。值为0时,表示不存在动画;
  • curve:设置动画的播放曲线,作为小白我粗略地理解为动画不同阶段的播放快慢,可以通过Curve来指定动画曲线,如动画快速进入慢速退出,动画快速进入快速退出;
  • delay:设置动画延迟执行的时长,默认值为0;
  • iterations:设置播放次数,默认为1,设置为-1时表示无限次播放;
  • playMode:设置动画的播放模式,如动画正常播放,反向播放,也可以在奇偶次数进行不同的正反向播放;
  • onFinish:回调函数,在动画播放完成时出发。当iterations设置为-1时,动画效果无限循环不会停止,所以不会触发此回调;

(三)、使用案例

1、点击按钮变大(width/height)

  如果没有加属性动画,那么在点击按钮时就会很生硬地变动,如下所示:

Button('change size')
        .onClick(() => {
          if (this.flag) {
            this.widthSize = 150
            this.heightSize = 60
          } else {
            this.widthSize = 250
            this.heightSize = 100
          }
          this.flag = !this.flag
        })
        .margin(30)
        .width(this.widthSize)
        .height(this.heightSize)

  使用属性动画后,点击按钮后按钮变大产生了动画效果,更加顺滑:

Button('change size')
        .onClick(() => {
          if (this.flag) {
            this.widthSize = 150
            this.heightSize = 60
          } else {
            this.widthSize = 250
            this.heightSize = 100
          }
          this.flag = !this.flag
        })
        .margin(30)
        .width(this.widthSize)
        .height(this.heightSize)

  我们可以通过调整animation的属性来调整动画效果。


2、点击按钮调整背景色(backgroundColor)

  backgroundColor属性也可以通过属性动画进行调节,如下所示:

Button('change size')
        .onClick(() => {
          if (this.flag) {
            this.widthSize = 150
            this.heightSize = 60
            this.bgColor = Color.Blue
          } else {
            this.widthSize = 250
            this.heightSize = 100
            this.bgColor = Color.Black
          }
          this.flag = !this.flag
        })
        .margin(30)
        .backgroundColor(this.bgColor)
        .width(this.widthSize)
        .height(this.heightSize)
        .animation({
          duration: 500,
          curve: Curve.EaseOut,
          iterations: 1,
          playMode: PlayMode.Normal
        })

3、点击按钮旋转(rotate)

  rotate属性也可以根据属性动画进行变动,如下所示:

Button('change rotate angle')
        .onClick(() => {
          if(this.flag){
            this.rotateAngle = 90
          }
          else{
            this.rotateAngle = 180
          }
          this.flag = !this.flag
        })
        .margin(50)
        .rotate({ angle: this.rotateAngle })
        .animation({
          duration: 1200,
          curve: Curve.Friction,
          delay: 500,
          iterations: 1, // 设置-1表示动画无限循环
          playMode: PlayMode.Alternate
        })

4、动画结束时替换文字(onFinish)

  通过onFinish属性,在动画播放完成后替换文字:

Button(this.btnText)
        .onClick(() => {
          if (this.flag) {
            this.widthSize = 150
            this.heightSize = 60
            this.bgColor = Color.Blue
            this.opa = 0.8
          } else {
            this.widthSize = 250
            this.heightSize = 100
            this.bgColor = Color.Black
            this.opa = 0.5
          }
          this.flag = !this.flag
        })
        .opacity(this.opa)
        .margin(30)
        .backgroundColor(this.bgColor)
        .width(this.widthSize)
        .height(this.heightSize)
        .animation({
          duration: 500,
          curve: Curve.EaseOut,
          iterations: 1,
          playMode: PlayMode.Normal,
          onFinish: () => {
            if(this.flag){
              this.btnText = "button clicked"
            }else{
              this.btnText = "button"
            }
          }
        })

  我们可以通过函数来替换onFinish属性对应的函数,如下所示:

private onBtnAnimationFinish(){
    if(this.flag){
      this.btnText = "button clicked"
    }else{
      this.btnText = "button"
    }
  }

  build() {
    Column() {
      Button(this.btnText)
        .onClick(() => {
          if (this.flag) {
            this.widthSize = 150
            this.heightSize = 60
            this.bgColor = Color.Blue
            this.opa = 0.8
          } else {
            this.widthSize = 250
            this.heightSize = 100
            this.bgColor = Color.Black
            this.opa = 0.5
          }
          this.flag = !this.flag
        })
        .opacity(this.opa)
        .margin(30)
        .backgroundColor(this.bgColor)
        .width(this.widthSize)
        .height(this.heightSize)
        .animation({
          duration: 500,
          curve: Curve.EaseOut,
          iterations: 1,
          playMode: PlayMode.Normal,
          onFinish: this.onBtnAnimationFinish
        })
    }.width('100%').margin({ top: 20 })
  }

二、显式动画

(一)、定义

  官网的定义如下:

提供全局animateTo显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。

  个人理解:animationTo其实与属性动画的效果是一样的,只是使用的方式不太一样,属性动画是在组件上直接使用的,而animationTo是在以全局函数的形式使用的,第二个参数为函数闭包,在该函数闭包中如果存在状态变量的变动,那么就是通过第一个参数对应的动画数据展示动画效果。

(二)、使用方式

animateTo(
	value: AnimateParam, 
	event: () => void
	): void

  animateTo以函数的形式出现,第二个参数为函数闭包,在该函数闭包中如果存在状态变量的变动,那么就是通过第一个参数对应的动画数据展示动画效果。

(三)、使用案例

  animateTo函数其实与属性动画效果是一致的,只不过使用方式不一样,可以针对指定的闭包函数效果来执行不同的动画效果。对于属性动画来说,只有一种动画变动效果,只要对应的属性存在变动,则会使用该动画进行过渡。而animateTo函数则可以针对一个组件进行多种动画效果展示,针对不同的闭包函数可以执行不同的动画效果。

  如下所示,我们针对flag的属性值,执行两种不同的闭包函数,调用两种不同的动画效果:

Button(this.btnText)
        .onClick(() => {
          if (this.flag) {
            animateTo({
              duration: 500,
              curve: Curve.EaseOut,
              iterations: 1,
              playMode: PlayMode.Normal,
              onFinish: this.onBtnAnimationFinish
            }, () =>{
              this.widthSize = 150
              this.heightSize = 60
              this.bgColor = Color.Blue
              this.opa = 0.8
            })
          } else {
            animateTo({
              duration: 500,
              curve: Curve.EaseOut,
              iterations: 1,
              playMode: PlayMode.Normal,
              onFinish: this.onBtnAnimationFinish
            }, () =>{
              this.widthSize = 250
              this.heightSize = 100
              this.bgColor = Color.Black
              this.opa = 0.5
            })
          }
          this.flag = !this.flag
        })
        .opacity(this.opa)
        .margin(30)
        .backgroundColor(this.bgColor)
        .width(this.widthSize)
        .height(this.heightSize)

Reference

属性动画-动画-组件参考(基于ArkTS的声明式开发范式)-ArkTS API参考-HarmonyOS应用开发文章来源地址https://www.toymoban.com/news/detail-781121.html

到了这里,关于【HarmonyOS】【应用开发】动画-属性动画与显式动画的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HarmonyOS】HarmonyOS应用开发者高级认证题库

    注:HarmonyOS应用开发者高级认证考试50道题,答对40及格,此题库有部分不清楚的选项,欢迎补充 1、HarmonyOS应用可以兼容OpenHarmony生态 正确(True) 2、云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用 错误(False) 3、Ability是系统调度应用的最小单

    2024年02月03日
    浏览(44)
  • 鸿蒙HarmonyOS应用开发初体验

    最近华为发布mt60新机火了,作为一名移动开发程序员,对鸿蒙系统开发移动端就很感兴趣了。 开发工具:HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 下载完后按默认安装就可以了,界面跟AS很类似,之前我jdk环境配置就不在配置了,不懂的可以百度下很多教程。 这是基

    2024年02月09日
    浏览(35)
  • 鸿蒙应用开发尝鲜:初识HarmonyOS

    来源:华为官方网站 : https://developer.huawei.com/ 相信大家对鸿蒙应用开发也不在陌生,很多身处互联网行业或者不了解的人们现在也一定都听说过华为鸿蒙.这里我将不再说废话,直接步入正题 HarmonyOS应用开发采用的是ArkTS语言,ArkTS是在TypeScript(简称TS)基础上的拓展,而TS又是JavaScrip

    2024年02月02日
    浏览(50)
  • HarmonyOS应用开发-低代码开发登录页面(超详细)

    本篇文章我来手把手教大家做一个HarmonyOS 应用的登录页面,逐步讲解,非常细致,百分百能学会,并提供全部源码。页面使用 DevEco Studio 的低代码开发。 通过本文的实践经验,我想告诉大家, HarmonyOS 应用开发其实并不难,只要了解具体的开发流程和开发思想,大家都可以很

    2024年02月03日
    浏览(34)
  • 【鸿蒙开发】HarmonyOS应用开发者基础认证题库

    华为开发者学堂   1、考试需实名认证,请在考前于个人主页→个人信息→基本信息→进行实名认证,否则考试通过无法获取专业证书; 2、每个帐号每月有3次考试机会,次月重置考试次数。做题过程中请认真对待,避免考试次数浪费; 3、考试时长为1小时,请合理分配做题

    2024年03月09日
    浏览(75)
  • UI开发布局-HarmonyOS应用UI开发布局

    UI页面的构建不用再像Android开发过程中在.xml文件中书写,可直接在页面上使用声明式UI的方式按照布局进行排列,构建应用的页面。 如下代码使用Row、Column构建一个页面布局,在页面布局中添加组件Text、Button,共同构成页面: 在实际开发的过程中,按照如下流程进行页面的

    2024年04月13日
    浏览(51)
  • 【HarmonyOS】HarmonyOS应用开发者高级认证96分

    判断题 云函数打包完成后,需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用 错 在column和Row容器组件中,aligntems用于设置子组件在主轴方向上的对齐格式,justifycontent用于设置子组件在交叉轴方向上的对齐格式 错 首选项preferences是以Key-Value形式存储数据,其中

    2024年02月05日
    浏览(36)
  • 【HarmonyOS】鸿蒙应用开发基础认证题目

    【HarmonyOS】鸿蒙应用开发基础认证题目; 随着鸿蒙系统的不断发展,前不久,华为宣布了重磅消息,HarmonyOS next 开发者版本会在明年(2024)开放,并不再支持Android应用!这也意味着,移动端开发者今后又多了一个适配平台,也到了必须学的时候了。 目前已知一线大厂均已开

    2024年02月04日
    浏览(124)
  • HarmonyOS应用开发-闪屏启动页

            这是鸿蒙开发者网站的一个应用《溪村小镇》示例代码,把闪屏启动页单拿出来,分析一下代码。 一、先上效果图 这是应用打开时的一个启动页,启动页会根据三个时间段(白天、傍晚、晚上)来分别展示溪村小镇不同的景色。 二、实现方法: 1.在pages页面下新

    2024年02月05日
    浏览(26)
  • 鸿蒙HarmonyOS应用开发能找到工作么?_harmony os 应用开发前景

    四、如何学习鸿蒙HarmonyOS应用开发技术? 为了能够帮助大家快速掌握鸿蒙(Harmony NEXT)应用开发技术知识。 首先得是开发语言 ArkTS,这个尤为重要,然后就是ArkUI声明式UI开发、Stage模型、网络/数据库管理、分布式应用开发、进程间通信与线程间通信技术、OpenHarmony多媒体技

    2024年04月27日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包