鸿蒙系列--属性动画

一、定义

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

说明:

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

二、创建

给组件(如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 = 0build() {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 = 0build() {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 = truebuild() {Row() {Column() {Button('缩放').onClick(() => {if (this.flag) {this.widthSize = 150this.heightSize = 60} else {this.widthSize = 250this.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 = 1build() {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.mzph.cn/news/611198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCS模型(径流曲线法)概述

目录 1.介绍:2.计算公式:参考文献:小结: 1.介绍: SCS模型(径流曲线法)是由美国农业部水土保持局(Soil Conservation Service) 基于经验提出,最初用于预测在农业用地小型流域降雨所累…

【算法每日一练]-dfs (保姆级教程 篇9) #俄罗斯方块 #ABC Puzzle #lnc的工资

目录 今日知识点: 二维图形的状态压缩,存下所有的合法状态然后暴力遍历 dfs的优化剪枝 二项式定理 俄罗斯方块 ABC Puzzle lnc的工资 俄罗斯方块 322D 题意:在4*4方格中分别给出3个俄罗斯方块,问是否可以经过旋转&#xf…

C/C++动态内存管理

文章目录 前言1.C/C内存分布2.C语言中动态内存管理方式:malloc/calloc/realloc/free3.C内存管理方式3.1 new/delete操作内置类型3.2 new和delete操作自定义类型 4. operator new与operator delete函数4.1 operator new与operator delete函数 5. new和delete的实现原…

软件测试|MySQL BETWEEN AND:范围查询详解

简介 在MySQL数据库中,使用BETWEEN AND操作符可以进行范围查询,即根据某个字段的值在指定范围内进行检索数据。这个操作符非常有用,因为它可以让我们轻松地筛选出位于两个特定值之间的数据,而不需要使用复杂的条件语句。 BETWEE…

数据挖掘在制造业中的预测与优化应用

随着大数据时代的到来,数据挖掘技术在各行各业的应用日益广泛,尤其在制造业中,其对于提升生产效率、降低运营成本、优化供应链管理等方面发挥着不可替代的作用。本文将探讨数据挖掘在制造业中的预测与优化应用,通过深入剖析实际案…

如何选择最适合的采购付款 (P2P) 解决方案?

无论企业的业务流程执行得如何,流程中始终存在改进空间。更好的管理系统是获得更好结果的关键,尤其是当企业处于增长阶段时。强大的采购到付款(P2P)系统是加快采购流程,同时保持采购支出可见性的最有效方法之一。 什么…

尚硅谷vite+vue3 (尚医通)项目实战笔记

如何配置项目运行后自动打开? 在package.json 启动命令中添加 “dev”: “vite --open”, 如何配置src的别名? 利用node内置模块path设置一下在vite.config.ts 中的别名 import { defineConfig } from vite import vue from vitejs/plugin-vue import …

IPv6路由协议---IPv6动态路由(OSPFv3-4)

OSPFv3的链路状态通告LSA类型 链路状态通告是OSPFv3进行路由计算的关键依据,链路状态通告包含链路状态类型、链路状态ID、通告路由器三元组唯一地标识了一个LSA。 OSPFv3的LSA头仍然保持20字节,但是内容变化了。在LSA头中,OSPFv2的LS age、Advertising Router、LS Sequence…

Vue3技术解析(小册子)

随着 Vue 3 正式版本的发布,未来 Vue 3 将会成为前端的主流框架,这个毋庸置疑。Vue 3 在使用方面会兼容部分 Vue 2.x 的特性,比如 options API。 所以,究竟是要先学习 Vue 2 打好基础,还是直接学习 Vue 3 呢&#xff…

职场日常英语口语,成人英语培训学校,柯桥学英语推荐哪里

“玩手机”用英语怎么说?你的第一反应是不是:play the phone? 在英语中,play这个动词通常表示“玩耍、娱乐、操纵”等意思,而手机是一种工具,不是玩耍的对象。 换句话说,我们“玩手机”&#xf…

主食冻干哪款好?十大放心主食冻干名单推荐

作为养猫的人,我们都知道每天最担心的事情就是如何为心爱的猫咪选择一款高品质的猫粮。我们都希望为猫咪提供最好的营养,让它们健康快乐地成长。然而,近期的一些事件,如百利猫粮生虫和VE主食冻干掰开有虫,让我们不得不…

软件测试|Windows系统配置pytest+allure环境教程

前言 allure可以输出非常精美的测试报告,也可以和pytest进行完美结合,不仅可以渲染页面,还可以控制用例的执行。本文我们将介绍Windows系统中如何配置allure环境。 第一步:配置Java环境 因为allure的运行依赖于Java环境&#x…

Spring Security介绍

一、Spring Security: 1、简介:Spring Security 是一个非常流行和成功的 Java 应用开发框架。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。一般来说,Web 应用的安全性包括用户认证(A…

vue3引用类型和基础类型深度克隆

深度克隆失效的一个例子 import { cloneDeep } from "lodash"; import { ref } from "vue";const navArr ref(["recommend","hot","new", ]) const list1: any ref([]) const list2: any ref([]) const list3: any ref(…

如何设置电脑桌面提醒,电脑笔记软件哪个好?

对于大多数上班族来说,每天要完成的待办事项实在太多了,如果不能及时去处理,很容易因为各种因素导致忘记,从而给自己带来不少麻烦。所以,我们往往会借助一些提醒类的软件将各项任务逐一记录下来,然后设置上…

手持终端PDA定制厂家_5G安卓手持机设备/条形码扫描手持机PDA

手持终端PDA是一种功能强大的手持终端设备,具备一维码和二维码扫描功能,广泛应用于门票管理、零售、智能巡检、仓储物资管理、金融、快递等领域。 这款手持终端基于MT6877方案,搭载八核处理器(2xCortex-A78 2.4GHz 6xCortex-A55 2.0GHz)&…

高速PCB设计10大要点总结

学习高速PCB设计,掌握这10个知识点很重要! 在高速PCB设计的学习中,有很多的知识点需要大家去了解和掌握,比如常见的信号完整性、反射、串扰、电源噪声、滤波等。本文和大家分享10个和高速PCB设计相关的重要知识,希望对…

ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模进阶应用

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

最新GPT4、AI绘画、DALL-E3文生图模型教程,GPT语音对话使用,ChatFile文档对话总结

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,文档对话总结DALL-E3文生图,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和…

【轮式移动机器人课程笔记 5】运动学仿真

L5 运动学仿真 本节重点: 如何理解推导出的运动学模型 回顾:机器人运动学模型 正向(前向)运动学模型反向运动学模型 基于MatLab运动学仿真 本节重点,如何利用matlab对运动学进行仿真 5.1 回顾运动学模型 [ x ˙ y …