鸿蒙系列--属性动画

一、定义

当组件的通用属性发生改变时而产生的属性渐变效果

说明:

        当组件的通用属性发生改变时,组件状态由初始状态逐渐变为结束状态的过程中,会创建多个连续的中间状态,逐帧播放后,就会形成动画

二、创建

给组件(如lmage、Button、 Column等)添加animation属性,并设置属性动画的参数

参数:

  • duration:动画时长,单位为毫秒,默认时长为1000毫秒
  • tempo:动画的播放速度,值越大动画播放越快,值越小播放越慢,为0时无动画效果,默认值:1
  • curve:动画变化曲线,默认曲线为线性,默认值是:Curve.Linear

名称

描述

Linear

表示动画从头到尾的速度都是相同的。

Ease

表示动画以低速开始,然后加快,在结束前变慢,CubicBezier(0.25, 0.1, 0.25, 1.0)。

EaseIn

表示动画以低速开始,CubicBezier(0.42, 0.0, 1.0, 1.0)。

EaseOut

表示动画以低速结束,CubicBezier(0.0, 0.0, 0.58, 1.0)。

EaseInOut

表示动画以低速开始和结束,CubicBezier(0.42, 0.0, 0.58, 1.0)。

FastOutSlowIn

标准曲线,cubic-bezier(0.4, 0.0, 0.2, 1.0)。

LinearOutSlowIn

减速曲线,cubic-bezier(0.0, 0.0, 0.2, 1.0)。

FastOutLinearIn

加速曲线,cubic-bezier(0.4, 0.0, 1.0, 1.0)。

ExtremeDeceleration

急缓曲线,cubic-bezier(0.0, 0.0, 0.0, 1.0)。

Sharp

锐利曲线,cubic-bezier(0.33, 0.0, 0.67, 1.0)。

Rhythm

节奏曲线,cubic-bezier(0.7, 0.0, 0.2, 1.0)。

Smooth

平滑曲线,cubic-bezier(0.4, 0.0, 0.4, 1.0)。

Friction

阻尼曲线,CubicBezier(0.2, 0.0, 0.2, 1.0)。

  • delay:延时播放时间,单位为毫秒,默认值:0,不延时播放
  • iterations:播放次数,默认值:1,设置为-1时表示无限次播放
  • playMode:设置动画播放模式,默认:播放完成后重头开始播放

名称

描述

Normal

动画按正常播放

Reverse

动画反向播放

Alternate

动画在奇数次(1、3、5...)正向播放,在偶数次(2、4、6...)反向播放

AlternateReverse

动画在奇数次(1、3、5...)反向播放,在偶数次(2、4、6...)正向播放

  • onFinish:动画播放结束时回调 

三、使用:

Image($r('app.media._icon'))   
   .animation({   
      duration: 1000,    
      tempo: 1.0,    
      delay: 0,    
      curve: Curve.Linear,    
      playMode: PlayMode.Normal,    
      iterations: 1  
   })

发现动画并未执行,原因可能如下:

  • 产生属性动画的属性需要在animation之前声明
  • 产生属性动画的属性变化时需触发UI状态更新
  • 产生属性动画的属性本身需满足一定的要求,并非任何属性都可以产生属性动画。目前支持的属性包括width、height、position、opacity、backgroundColor、scale、rotate、translate等

三、案例

旋转动画 rotate

@Entry
@Component
struct AnimPage {
  @State rotateAngle: number = 0

  build() {
    Row() {
      Column() {
        Button("开启旋转动画", { type: ButtonType.Capsule, stateEffect: true })
          .onClick(() => {
            this.rotateAngle = 360
          })

        Row({ space: 20 }) {
          //沿着X轴旋转
          Image($r('app.media.app_icon'))
            .width(80)
            .height(80)
            .rotate({ x: 1, y: 0, z: 0, angle: this.rotateAngle })
            .animation({
              duration: 2000,
              tempo: 1.0,
              delay: 0,
              curve: Curve.Linear,
              playMode: PlayMode.Normal,
              iterations: -1
            })

          //沿着Y轴旋转
          Image($r('app.media.app_icon'))
            .width(80)
            .height(80)
            .rotate({ x: 0, y: 1, z: 0, angle: this.rotateAngle })
            .animation({
              duration: 2000,
              tempo: 1.0,
              delay: 0,
              curve: Curve.Linear,
              playMode: PlayMode.Normal,
              iterations: -1
            })

          //沿着Z轴旋转
          Image($r('app.media.app_icon'))
            .width(80)
            .height(80)
            .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
            .animation({
              duration: 2000,
              tempo: 1.0,
              delay: 0,
              curve: Curve.Linear,
              playMode: PlayMode.Normal,
              iterations: -1
            })

          Image($r('app.media.app_icon'))
            .width(80)
            .height(80)
            .rotate({ x: 0, y: 0, z: 1, angle: this.rotateAngle })
            .animation({
              duration: 2000,
              tempo: 1.0,
              delay: 0,
              //低速开始,然后加快,在结束前变慢
              curve: Curve.Ease,
              //
              playMode: PlayMode.Reverse,
              iterations: -1
            })
        }
        .margin({ top: 20 })
        .padding({ left: 10 })
        .height("30%")
        .width("100%")
        .backgroundColor(Color.Red)

      }
      .width('100%')
    }
    .height('100%')
  }
}

位移动画 position

@Entry
@Component
struct AnimPage {
  @State xState: number = 0
  @State yState: number = 0

  build() {
    Row() {
      Column() {
        Row() {
          Text('位移动画')
            .width(200)
            .height(100)
            .fontColor(Color.Blue)
            .fontSize(30)
            .margin(100)
            .position({ x: this.xState, y: 0 })
            .animation({
              duration: 1000,
              tempo: 1.0,
              delay: 0,
              curve: Curve.Linear,
              playMode: PlayMode.Normal,
              iterations: 1,
              onFinish: () => {
                this.xState = 200
              }
            })

          Image($r('app.media.app_icon'))
            .width(80)
            .height(80)
            .position({ x: 0, y: this.yState })
            .animation({
              duration: 1000,
              tempo: 1.0,
              delay: 0,
              curve: Curve.Linear,
              playMode: PlayMode.Normal,
              iterations: 1,
              onFinish: () => {
                //在onFinish回调中重新设置了xState和yState,也可以实现永久播放的效果
                if (this.yState == 0) {
                  this.yState = 200
                } else {
                  this.yState = 0
                }
              }
            })
        }
        .height("30%")
        .width("100%")
        .backgroundColor(Color.Red)
      }
      .width('100%')
    }
    .height('100%')
  }
}

缩放动画 width、height

@Entry
@Component
struct AnimPage {
  @State widthSize: number = 250
  @State heightSize: number = 100
  @State flag: boolean = true

  build() {
    Row() {
      Column() {
        Button('缩放')
          .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({
            duration: 2000,
            curve: Curve.EaseOut,
            iterations: 3,
            playMode: PlayMode.Normal
          })

      }.width('100%')
      .height('30%')
      .backgroundColor(Color.Red)
    }
    .width('100%')
    .height('100%')
  }
}

透明度动画 opacity

@Entry
@Component
struct AnimPage {
  @State opacityAngle: number = 1

  build() {
    Row() {
      Column() {
        Button('透明度')
          .onClick(() => {
            this.opacityAngle = 0
          })
          .margin(50)
          .opacity(this.opacityAngle)
          .animation({
            duration: 2000,
            curve: Curve.Friction,
            delay: 500,
            iterations: -1, // 设置-1表示动画无限循环
            playMode: PlayMode.Alternate
          })

      }.width('100%')
      .height('30%')
      .backgroundColor(Color.Red)
    }
    .width('100%')
    .height('100%')
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/307710.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智能时代:自然语言生成SQL与知识图谱问答实战

语义解析 前言语义解析的应用场景总结概论语义解析和大模型的关系延伸阅读 前言 语义解析技术可以提高人机交互的效率和准确性,在自然语言处理、数据分析、智能客服、智能家居等领域都有广泛的应用前景。特别是在大数据时代,语义解析能够帮助企业更快速…

k8s的node亲和性和pod亲和性和反亲和性 污点 cordon drain

node亲和性和pod亲和性和反亲和性 污点 cordon drain 集群调度: schedule的调度算法 预算策略 过滤出合适的节点 优先策略 选择部署的节点 nodeName:硬匹配,不走调度策略,node01 nodeSelector:根据节点的标签选择,会走调度的算法 只…

Mac M1 Parallels CentOS7.9 Deploy Docker + Rancher + K8S(HA+More Master)

一、准备虚拟机资源 虚拟机清单 机器名称IP地址角色rancher10.211.55.200管理K8S集群k8svip10.211.55.199K8S VIPmaster0110.211.55.201K8S集群主节点master0210.211.55.202K8S集群主节点master0310.211.55.203K8S集群主节点node0110.211.55.211K8S集群从节点node0210.211.55…

ChatGPT扩展系列之网易数帆ChatBI

在当今数字化快速发展的时代,数据已经成为业务经营与管理决策的核心驱要素。无论是跨国大企业还是新兴创业公司,正确、迅速地洞察数据已经变得至关重要。然而,传统的BI工具往往对用户有一定的技术门槛,需要熟练的操作技能和复杂的查询语句,这使得大部分的企业员工难以深入…

Hadoop分布式文件系统(二)

目录 一、Hadoop 1、文件系统 1.1、文件系统定义 1.2、传统常见的文件系统 1.3、文件系统中的重要概念 1.4、海量数据存储遇到的问题 1.5、分布式存储系统的核心属性及功能含义 2、HDFS 2.1、HDFS简介 2.2、HDFS设计目标 2.3、HDFS应用场景 2.4、HDFS重要特性 2.4…

C++与Typescript的区别

目录 一、C类模板和函数模板 1.类模板 2.函数模板 二,Typescript 的泛型声明 1.泛型函数 2.泛型类 为什么C和Typescript语言中主张模板和泛型 一、C类模板和函数模板 在C中,类模板和函数模板允许你为多种数据类型编写通用的代码。这就像每个人都有…

PSoc62™开发板之PWM呼吸灯

实验目的 利用PWM动态调节输出功率达到控制LED呼吸变化的效果 实验准备 PSoc62™开发板(开发板已经板载LED) 板载资源 板载有多少pwm 创建工程例程,在libraries/HAL_Drivers/drv_pwm.h中查看BSP支持的pwm数量及对应的GPIO,可…

自动修复vcruntime140.dll丢失的解决办法,快速解决dll文件问题

在使用电脑时也会有不少用户都遇到vcruntime140.dll丢失的情况,那么有什么办法可以解决vcruntime140.dll丢失呢?今天将给大家分享一些关于vcruntime140.dll丢失的解决办法,从自动修复和手动修复两个方向给大家分析希望能够帮助到大家。 一.vc…

基于 Validator 类实现 ParamValidator,用于校验函数参数

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器,从编码到发布全过程》 2、相关回顾 使用 TypeV…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票创建后端实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

系列四十六、idea中安装Tomcat7插件

一、idea中安装Tomcat7插件 1.1、描述 学习SpringMVC开发时,代码写完之后,一般会配置一个外置的Tomcat用于启动容器,其实还可以通过插件的方式进行启动,这样就不用再配置外部的Tomcat了,具体怎么配置的呢?…

Spring Cloud + Vue前后端分离-第11章 用户管理与登录

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第11章 用户管理与登录 11-1 增加用户管理功能 用户表设计与基本代码生成 1.用户管理与登录:用户表设计与基本代码生成 all.sql generatorConfig.xml Server…

网络编程套接字(Socket)

文章目录 1 重点知识2 预备知识2.1 理解源IP地址和目的IP地址2.2 认识端口号2.3 理解 "端口号" 和 "进程ID"2.4 理解源端口号和目的端口号2.5 认识TCP协议2.6 认识UDP协议2.7 网络字节序 3 socket编程接口3.1 socket 常见API3.2 sockaddr结构 4 简单的UDP网…

安卓(雷电)模拟器清除屏幕密码

1、设置磁盘可写 启动模拟器,然后在模拟器的设置界面,设置磁盘共享为可写入,重启模拟器,如下图: 2、找到模拟器目录 返回桌面,右键模拟器图标,打开文件所在目录,如下图&#xff1a…

应用在植物生长照明中的LED照明灯珠

植物照明是指利用LED植物照明灯来促进植物生长。植物照明一般采用LED植物生长灯,是一种以LED(发光二极管)为发光体,满足植物光合作用所需光照条件的人造光源。LED植物生长灯对植物的生长有很大的好处,能促进壮根、助长…

IPV6学习记录

IPV6的意义 从广义上来看IPV6协议包含的内容很多: IPV6地址的生成与分配 IPV6的报头的功能内容 IPV4网络兼容IPV6的方案 ICMPv6的功能(融合了arp和IGMP功能) IPV6的路由方式 ipv6的诞生除了由于ipv4的地址枯竭外,很大程度上也是因为ipv4多年的发展产生了很多…

Redis 内存淘汰策略有哪些?过期数据如何删除?

Redis 在面试中出现的概率非常大,毕竟后端项目如果用到分布式缓存的话,一般用的都是 Redis。目前,还没有出现一个能够取代 Redis 的分布式缓存解决方案。 这篇文章中,我会分享几道 Redis 内存管理相关的问题,都很常见…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑤

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷5 目录 需要竞赛软件包环境以及备赛资源可私信博主!!! 2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷5 模块一 …

【中国联通协办】第六届下一代数据驱动网络国际学术会议(NGDN 2024)

第六届下一代数据驱动网络国际学术会议(NGDN 2024) The Sixth International Conference on Next Generation Data-driven Networks 基于前几届在英国埃克塞特 (ISPA 2020) 、中国沈阳 (TrustCom 2021) 和中国武汉(IEEETrustCom-2022)成功举办的经验&a…

TF-IDF(Term Frequency-Inverse Document Frequency)算法详解

目录 概述 术语解释 词频(Term Frequency) 文档频率(Document Frequency) 倒排文档频率(Inverse Document Frequency) 计算(Computation) 代码语法 代码展示 安装相关包 测…