鸿蒙动画开发06——打断动画

news2024/11/15 3:44:43

1、前 言

UI界面除了运行动画之外,还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时,UI界面应做到即时响应。

例如用户在应用启动过程中,上滑退出,那么启动动画应该立即过渡到退出动画,而不应该等启动动画完成后再退出,从而减少用户等待时间。打断动画演示如下:

另外,对于桌面翻页类从跟手到离手触发动画的场景,离手后动画的初始速度应承继手势速度,避免由于速度不接续导致停顿感的产生。

针对以上场景,系统已提供动画与动画、手势与动画之间的衔接能力(打断动画),保证各类场景下动画平稳光滑地过渡的同时,尽可能降低开发难度。

下面针对打断动画的主要场景做探讨。

2、基于属性变更的打断动画

基于属性变更的动画归属于“布局更新动画”,我们在之前的文章中有讨论布局更新动画的基本使用,详见👉🏻 鸿蒙动画开发01——布局更新动画。

假设对于某一可动画属性(width、height、position、scale等),存在正在运行的动画。当UI侧行为改变该属性终点值时,我们仅需在animateTo动画闭包中改变属性值或者改变animation接口作用的属性值,即可产生打断动画(立即终止正在运行动画的目标,同时基于当前状态立即动画转向新的值)。系统会自动衔接之前的动画和当前的动画,我们仅需要关注当前单次动画的实现。

一个打断动画效果如下(同时演示了不打断和打断的两个场景):

代码如下(核心代码在26、28和34行):

import { curves } from '@kit.ArkUI';class SetSlt{  isAnimation:boolean = true  set():void{    this.isAnimation = !this.isAnimation;  }}@Entry@Componentstruct AnimationToAnimationDemo {// 第一步:声明相关状态变量  @State SetAnimation: SetSlt = new SetSlt();  build() {    Column() {      Text('Harmony自习室')        .fontWeight(FontWeight.Bold)        .fontSize(12)        .fontColor(Color.White)        .textAlign(TextAlign.Center)        .borderRadius(10)        .backgroundColor(0xf56c6c)        .width(100)        .height(100)        // 第二步:将状态变量设置到相关可动画属性接口        .scale({ x: this.SetAnimation.isAnimation ? 2 : 1, y: this.SetAnimation.isAnimation ? 2 : 1 })        // 第四步:通过隐式动画接口开启隐式动画,动画终点值改变时,系统自动添加衔接动画        .animation({ curve: curves.springMotion(0.4, 0.8) })      Button('Click')        .margin({ top: 200 })        // 第三步:通过点击事件改变状态变量值,影响可动画属性值        .onClick(() => {          this.SetAnimation.set()        })    }    .width('100%')    .height('100%')    .justifyContent(FlexAlign.Center)  }}

3、手势跟随打断动画

使用滑动、捏合、旋转等手势的场景中,跟手过程中一般会触发属性的改变。离手后,这部分属性往往会继续发生变化,直到到达属性终点值。

离手阶段的属性变化初始速度应与离手前一刻的属性改变速度保持一致。如果离手后属性变化速度从0开始,就好像正在运行的汽车紧急刹车,造成观感上的骤变是用户和开发者都不希望看到的。

针对在TapGesture和动画之间进行衔接的场景(如列表滑动),可以在跟手阶段每一次更改组件属性时,都做成使用跟手弹簧曲线的属性动画。离手时再用离手弹簧曲线产生离手阶段的属性动画。

对于采用springMotion曲线的动画,离手阶段动画将自动继承跟手阶段动画的速度,并以跟手动画当前位置为起点,运动到指定的属性终点。在跟手过程中使用responsiveSpringMotion动画,在释放后状态打断后的运动使用springMotion动画。之前的文章中我们有讨论responsiveSpringMotion和springMotion动画,详见👉🏻 鸿蒙UI开发——使用动画曲线

我们实现一个小球,这个小球可以跟随我们的指尖,在我们指尖离开屏幕后,小球按照运动惯性自动回到起点(整个过程动画衔接非常顺畅)。

示例效果如下:

代码如下(关注22~37行代码):​​​​​​​

import { curves } from '@kit.ArkUI';@Entry@Componentstruct SpringMotionDemo {  // 第一步:声明相关状态变量  @State positionX: number = 100;  @State positionY: number = 100;  diameter: number = 50;  build() {    Column() {      Row() {        Circle({ width: this.diameter, height: this.diameter })          .fill(Color.Blue)          // 第二步:将状态变量设置到相关可动画属性接口          .position({ x: this.positionX, y: this.positionY })          // 第三步:在跟手过程改变状态变量值,并且采用responsiveSpringMotion动画运动到新的值          .onTouch((event?: TouchEvent) => {            if(event){              if (event.type === TouchType.Move) {                // 跟手过程,使用responsiveSpringMotion曲线                this.getUIContext()?.animateTo({ curve: curves.responsiveSpringMotion() }, () => {                  // 减去半径,以使球的中心运动到手指位置                  this.positionX = event.touches[0].windowX - this.diameter / 2;                  this.positionY = event.touches[0].windowY - this.diameter / 2;                  console.info(`move, animateTo x:${this.positionX}, y:${this.positionY}`);                })              } else if (event.type === TouchType.Up) {                // 第四步:在离手过程设定状态变量终点值,并且用springMotion动画运动到新的值,springMotion动画将继承跟手阶段的动画速度                this.getUIContext()?.animateTo({ curve: curves.springMotion() }, () => {                  this.positionX = 100;                  this.positionY = 100;                  console.info(`touchUp, animateTo x:100, y:100`);                })              }            }          })      }      .width("100%").height("80%")      .clip(true) // 如果球超出父组件范围,使球不可见      .backgroundColor(Color.Orange)      Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Start, justifyContent: FlexAlign.Center }) {        Text("拖动小球").fontSize(16)      }      .width("100%")      Row() {        Text('点击位置: [x: ' + Math.round(this.positionX) + ', y:' + Math.round(this.positionY) + ']').fontSize(16)      }      .padding(10)      .width("100%")    }.height('100%').width('100%')  }}

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

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

相关文章

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server :服务注册中心…

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM(Model-View-ViewModel)是一种架构模式,广泛应用于现代前端开发,尤其是在微软的WPF(Windows Presentation Foundation)应用程序中。它旨在通过将视图(UI)与业务逻辑(…

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION

SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐,可以是书籍,可以是运动,可以是工作,可以是山川湖海,唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

/// ts中的三斜线指令 | 前端

第一次看到注意到这行代码,不知道的还以为是注释呢,查了资料才知道这是typescript中的三斜线指令,那有什么作用呢? 1. 这行代码是TypeScript中的一个三斜线指令(Triple-Slash Directive),用于…

学习日记_20241110_聚类方法(K-Means)

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

SMA-BP基于黏菌算法优化BP神经网络时间序列预测

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

ssm103宠物领养系统+vue(论文+源码)_kaic

毕业设计(论文) 宠物领养系统的设计与实现 学生姓名: 二级学院: 班级名称: 指导教师: 年 月 日 录 摘 …

Elasticsearch如果集群出现节点故障,我应该如何快速定位问题?

当 Elasticsearch (ES) 集群发生故障时,快速定位问题源头非常重要。Elasticsearch 是一个分布式系统,故障可能由多种原因引起,涉及到硬件、配置、网络、集群本身的健康状况等多个层面。以下是一些定位问题的步骤和工具: 检查集群…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中,Service是一种抽象,定义了一组Pod的逻辑集合和访问这些Pod的策略。首先,我们需…

dbeaver 连接日常是数据库工具类似navicat

官网下载安装包 DBeaver Community | Free Universal Database Tool 登录mysql为例 字体调整 sql 美化,关键字大写 快捷键 执行 ctrlenter 单个语句执行 alt x 执行sql脚本 事务提交,默认自动,可以改成手动 创建数据库 新建表 添加主键 …

Chromium 中chrome.webRequest扩展接口定义c++

一、chrome.webRequest 注意 :从 Manifest V3 开始,"webRequestBlocking" 权限不再适用于大多数扩展程序。以 "declarativeNetRequest" 为例,它允许使用 declarativeNetRequest API。除了 "webRequestBlocking&quo…

【MySQL】数据库必备知识:全面整合表的约束与深度解析

前言:本节内容讲述表的约束的相关内容。 表的约束博主将会通过两篇文章进行讲解, 这是第一篇上半部分。 讲到了约束概念。 以及几种常见约束。下面友友们开始学习吧! ps:友友们使用了mysql就可以放心观看喽! 目录 表的约束概念 …

堆排序,学习笔记

目录 一、概念 二、堆排序的基本思路 三、堆排序的基本步骤 1. 构建初始堆: 2. 排序过程 四、示例 五、应用场景 1. 优先级队列相关场景 2. TopK 值问题 一、概念 堆排序是一种基于二叉堆数据结构的排序算法。二叉堆是一种完全二叉树,它分为两种…

分享 pdf 转 word 的免费平台

背景 找了很多 pdf 转 word 的平台都骗进去要会员,终于找到一个真正免费的,遂分享。 网址 PDF转Word转换器 - 100%免费市面上最优质的PDF转Word转换器 - 免费且易于使用。无附加水印 - 快速将PDF转成Word。https://smallpdf.com/cn/pdf-to-word

llama-cpp模型轻量化部署与量化

一、定义 定义配置环境遇到的问题,交互模式下模型一直输出,不会停止模型量化Qwen1.5-7B 案例demo 二、实现 定义 主要应用与cpu 上的部署框架。由c完成。配置环境 https://github.com/ggerganov/llama.cpp https://github.com/echonoshy/cgft-llm/blo…

2024最新版JavaScript逆向爬虫教程-------基础篇之Proxy与Reflect详解

目录 一、监听对象的操作二、Proxy基本使用2.1 创建空代理2.2 定义捕获器2.2.1 Proxy的set和get捕获器2.2.2 Proxy(handler)的13个捕获器 三、Reflect的作用3.1 Reflect的使用3.2 Reflect其余方法(9个)3.3 Proxy与Reflect中的receiver参数3.4 Reflect中的construct方法 ECMAScr…

Ceph层次架构分析

Ceph的层次结构可以从逻辑上自下向上分为以下几个层次: 一、基础存储系统RADOS层 功能:RADOS(Reliable Autonomic Distributed Object Store)是Ceph的底层存储系统,提供了分布式存储的核心功能。它是一个完整的对象存…