如何用ArkUI实现一个加入购物车效果?
关键词:ArkUI的动效能力,动效开发,ArkUI动画
我们在购买商品时,往往习惯将商品先加入购物车,然后在购物车里确认后再下订单,这是一个典型的访问者模式。对于这个高频场景,增添一些动效可以增加app的趣味性。
效果展示
具体实现
加入购物车动画的具体实现用到了三个特性,分别是 属性动画 路径动画 弹簧动画。接下来,我们分别介绍这几个特性,以及给出实际开发中调参的建议。
属性动画
属性动画是指组件的某些通用属性变化时,可以通过属性动画实现渐变过渡效果,提升用户体验。
在示例中我们用到的属性如下:
缩放:
.scale(this.animate_scale? (
this.animate_path? {x:0.1,y:0.1,centerY:'50%'}:{x:0.2,y:0.2,centerY:'50%'}):{x:1,y:1,centerY:'100%'})
平移:
.translate(this.animate_path? {x:-80,y:100}:{x:0})
透明度:
.opacity(this.animate_path? 0.3: 1)
路径动画
路径动画可以设置组件进行位移动画时的运动路径。
通过设置path,可以改变运动的轨迹,path中支持使用start和end进行起点和终点的替代。
关于 motionPath 的可配置参数如下:
参数 | 说明 | 默认值 |
---|---|---|
path | 位移动画的运动路径,使用svg路径字符串。path中支持使用start和end进行起点和终点的替代,如:‘Mstart.x start.y L50 50 Lend.x end.y Z’,更多说明请参考绘制路径。 | - |
from | 运动路径的起点 | 0.0 |
to | 运动路径的终点 | 1.0 |
rotatable | 是否跟随路径进行旋转 | false |
在示例中我们设置的参数如下:
.motionPath({ path: 'Mstart.x start.y C -200 50, -150 200, end.x end.y', from: 0.0, to: 1.0, rotatable: false
})
上面的path使用了 'Mstart.x start.y C 380 -100, 50 -50, end.x end.y'
,这里M表示起始坐标,C表示三次贝塞尔曲线(C/c = curveto
三次贝塞尔曲线 三组坐标参数分别对应: x1 y1, x2 y2, x y)
弹簧动画
使用采用弹簧曲线的动画在达终点时动画速度为0,不会产生动画“戛然而止”的观感,导致影响用户体验。
弹簧的刚度和阻尼系数:
弹簧的刚度和阻尼系数是两个重要的参数,它们决定了弹簧的响
应和性能。弹簧的刚度是指其承受力的能力,它的值与弹簧材料、直
径、线径和材料厚度等因素有关。刚度的单位是牛顿/米(N/m)或磅/
英寸(1b/in)。
弹簧的阻尼系数是指它的阻尼特性,也就是弹簧在振动时阻尼能
力的大小。它的值与弹簧的几何形状、材料和工作条件等有关。阻尼
系数的单位是牛顿秒/米(N·s/m)或磅秒/英寸(lb·s/in)。
弹簧刚度和阻尼系数的关系:
弹簧的刚度和阻尼系数是密切相关的,因为它们都影响着弹簧的
振动特性。一般来说,弹簧的刚度越大,其振动频率越高,但阻尼系
数也越大。阻尼系数越大,振动幅度越小,但振动频率也会降低。
ArkUI提供了由弹簧振子物理模型产生的弹簧曲线。通过弹簧曲线,开发者可以设置超过设置的终止值,在终止值附近震荡,直至最终停下来的效果。弹簧曲线的动画效果比其他曲线具有更强的互动性、可玩性。弹簧动画
关于弹簧曲线可以使用的接口如下:
接口 | 说明 | 使用建议 |
---|---|---|
springMotion | 创建弹性动画,动画时长由曲线参数、属性变化值大小和弹簧初速度自动计算,开发者指定的动画时长不生效 | 立即停止当前动画,开始新动画 |
responsiveSpringMotion | 一般用于跟手做成动画的场景,离手时可用springMotion创建动画,此时离手阶段动画将自动继承跟手阶段动画速度,完成动画衔接 | 上一个动画还未结束时,可以提供过渡动画 |
interpolatingSpring | 曲线接口提供速度入参,且由于接口对应一条从0到1的阻尼弹簧曲线,实际动画值根据曲线进行插值计算 | 适合于需要指定初速度的动效场景 |
springCurve | 对于采用springCurve的动画,会将曲线的物理时长映射到指定的时长,相当于在时间轴上拉伸或压缩曲线,破坏曲线原本的物理规律 | 不建议开发者使用 |
因为我们要模拟一个购物车图标抖动的动效,需要一个比较大的起始速度,所以在示例中我们使用了 构造插值器弹簧曲线对象 interpolatingSpring ,又由于我们需要设置弹簧的震荡幅度,interpolatingSpring 正好能满足我们的需求,interpolatingSpring 的可调节参数如下:
参数名 | 说明 | 使用建议 |
---|---|---|
velocity | 初始速度。外部因素对弹性动效产生的影响参数,目的是保证对象从之前的运动状态平滑地过渡到弹性动效。该速度是归一化速度,其值等于动画开始时的实际速度除以动画属性改变值。 | 值越大,起始速度越快,建议从0开始调试 |
mass | 质量。弹性系统的受力对象,会对弹性系统产生惯性影响。质量越大,震荡的幅度越大,恢复到平衡位置的速度越慢。 | 一般用1 |
stiffness | 刚度。表示物体抵抗施加的力而形变的程度。刚度越大,抵抗变形的能力越强,恢复到平衡位置的速度越快。 | 建议从225开始调试,官网例子使用228时是过阻尼 ,刚度越大,动画时间越短 |
damping | 阻尼。用于描述系统在受到扰动后震荡及衰减的情形。阻尼越大,弹性运动的震荡次数越少、震荡幅度越小。 | 建议从30开始调试,这是临届阻尼的参数 |
在示例中我们设置的参数如下:
curves.interpolatingSpring(100, 1, 225, 10)
上面的参数分别代表初始速度100, 质量1, 剛度225, 阻尼10,开发者可以设置这些参数调整效果。建议从初始速度0,质量1,刚度225,阻尼30,开始调参,这是临届阻尼的参数。如果觉得曲线一开始太慢了,可以把初速度加大。
弹簧的阻尼系统是一个通用的物理系统,弹簧动画符合弹簧阻尼系统的运动规律,当弹力>阻力时加速度。
动画的衔接
由于加入购物车是一个连续动画,那么如何把上述这些动画衔接起来呢?
通过显示动画就可以做到。显示动画是指提供全局 animateTo
显式动画接口来指定由于闭包代码导致的状态变化插入过渡动效。
和属性动画不同,显示动画是开发者主动调用动画,通过函数驱动。
为了实现加入购物车🛒等一系列动效需求,我们在显示动画找到了一个接口:onFinish
,通过这个动画播放完成的回调,可以使我们在一个动画结束后修改某些属性进行下一个动画。
// 准备显示动画
this.animate_appear = !this.animate_appear// 用0.5秒实现动画缩小,曲线使用EaseOut,特点是开始快,结束慢
animateTo({ duration: 500, curve: Curve.EaseOut,onFinish: ()=> {// 用1秒实现动画曲线,曲线使用EaseIn,特点是开始慢,结束快animateTo({ duration: 1000, curve: Curve.EaseIn,onFinish: ()=> {// 动画结束,将参数复原,及时移除动画视图this.animate_appear = !this.animate_appearthis.animate_path = !this.animate_paththis.animate_scale = !this.animate_scale// 设置弹簧动画,初始速度100,质量1,刚度225,阻尼10,// 建议从初始速度0,质量1,刚度225,阻尼30,开始调参,这是临届阻尼的参数// 如果觉得曲线一开始太慢了,可以把初速度加大this.animate_spring = !this.animate_spring// interpolatingSpring的参数需要调试,通过调试找到自己想要的效果animateTo({ duration: 1, curve: curves.interpolatingSpring(100, 1, 225, 10), iterations:1,onFinish: ()=> {}}, () => {// 开始弹簧动画this.animate_spring = !this.animate_spring})}}, () => {// 开始路径动画this.animate_path = !this.animate_path})}}, () => {// 开始缩小动画this.animate_scale = !this.animate_scale
})
小结
通过显示动画驱动,再结合 属性动画 路径动画 弹簧动画 我们实现了加入购物车一系列动画效果。
总结
通过ArkUI推荐的动效接口,我们实现了多个动效场景。这些动效接口基本满足实现功能需求,相信之后的版本会带给我们更多惊喜。
相关文章:

如何用ArkUI实现一个加入购物车效果?
关键词:ArkUI的动效能力,动效开发,ArkUI动画 我们在购买商品时,往往习惯将商品先加入购物车,然后在购物车里确认后再下订单,这是一个典型的访问者模式。对于这个高频场景,增添一些动效可以增加a…...

ChatGLM GPT原理介绍
图解GPT 除了BERT以外,另一个预训练模型GPT也给NLP领域带来了不少轰动,本节也对GPT做一个详细的讲解。 OpenAI提出的GPT-2模型(https://openai.com/blog/better-language-models/) 能够写出连贯并且高质量的文章,比之前语言模型效果好很多。GPT-2是基于Transformer搭建的,相…...

2015年蓝桥杯省赛C/C++ A组 灾后重建题解(100分)
10. 灾后重建 Pear市一共有N(<50000)个居民点,居民点之间有M(<200000)条双向道路相连。这些居民点两两之间都可以通过双向道路到达。这种情况一直持续到最近,一次严重的地震毁坏了全部M条道路。 震后…...

Elasticsearch(四)深分页Scroll
一、前言 1.1、scroll与fromsize区别 ES对于fromsize的个数是有限制的,二者之和不能超过1w。当所请求的数据总量大于1w时,可用scroll来代替fromsize。 fromsize在ES查询数据的方式步骤如下: 1、先将用户指定的关键字进行分词;…...

JavaWeb后端开发 JWT令牌解析 登录校验 通用模板/SpringBoot整合
目录 实现思路 会话跟踪的三个方案--引出Jwt令牌技术 1.访问cookie的值,在同一会话的不同请求之间共享数据 2.session 3.现代普遍采用的令牌技术--JWT令牌 JWT令牌技术 第一步--生成令牌 1.引入依赖 2.生成令牌 第二步--校验令牌 第三步--登录下发令牌 需要解决的…...

Sparta工具用法描述之信息收集(漏洞分析)
声明:本文仅做学习与交流,任何用于非法用途、行为等造成他人损失的,责任自负。本文不承担任何法律责任。 Sparta是python GUI应用程序,它通过在扫描和枚举阶段协助渗透测试仪来简化网络基础结构渗透测试。 通过点击并单击工具箱并以方便的方式显示所有工具输出,它可以使测…...

Vue复选框批量删除示例
Vue复选框批量删除 通过使用v-model指令绑定单个复选框 例如<input type"checkbox" id"checkbox" v-model"checked"> 而本次我们要做的示例大致是这样的,首先可以增加内容,然后通过勾选来进行单独或者批量删除&…...

Docker自定义镜像
一、镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层结构,每一层称为一个Layer BaseImage层:包含基本的系统函数库、环境变量、文件系统其它:在BaseImage基础上添加依赖、安装程序、完成整个应用的…...

ardupilot的编译过程
环境 树莓派4b ubuntu20.04 git 2.25.1 python3.8.10 pixhawk2.4.8 下载源码 (已经配置好git环境和ssh) git clone --recurse-submodules gitgithub.com:ArduPilot/ardupilot.gitcd ardupilotgit status使用git status检查是否下载完整 如果不完整&a…...

Unity中Shader实现模板测试Stencil
文章目录 前言一、UI中的遮罩1、Mask ——> 模板测试2、RectMask2D ——> UNITY_UI_CLIP_RECT 二、模板缓冲区Stencil一般是和Pass平行的部分,Pass部分写的是颜色缓冲区Stencil:Comp(比较操作)Pass(模版缓冲区的更新) 三、实际使用1、在…...

多线程与并发
多线程与高并发 线程的创建方式1.继承Thread类 重写run方法2.实现Runnable接口 重写run方法3. 实现Callable 重写call方法,配合FutureTask 线程的使用1.线程的状态1.1. 传统操作系统层面5种状态1.2.Java中给线程准备的6种状态 2.线程的常用方法2.1 获取当前线程2.2 …...

手写call方法
Function.prototype.myCallfunction (context,args) {console.log(arguments)//context 表示call里面的第一个参数也就是需要改变this指向的那个对象。//this表示这个方法//把这个方法挂到需要改变指向的对象身上调用,相当于把this指向了这个对象身上,从…...

基于FPGA的图像直方图统计实现,包括tb测试文件和MATLAB辅助验证
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、图像数据传输 4.2、直方图统计算法 4.3、时序控制和电路设计 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescal…...

数据库:Hive转Presto(一)
本人因为工作原因,经常使用hive以及presto,一般是编写hive完成工作,服务器原因,presto会跑的更快一些,所以工作的时候会使用presto验证结果,所以就要频繁hive转presto,为了方便,我用…...

Responder
环境准备 操作系统:Kali Linux工具:responder,john,evil-winrm PS:输入以下命令解决靶场环境无法打开问题 #echo "<靶机IP> unika.htb">>/etc/hostsresponder工具 [Kali 官网] 手册地址:https://www.kali.org/tools/responder/ 摘要: This package c…...

基于下垂控制的并网逆变器控制MATLAB仿真模型
微❤关注“电气仔推送”获得资料(专享优惠) 主要模块: 建议使用MATLAB2021b及以上版本打开! 功率计算模块、下垂控制模块、电压电流双环控制模块、虚拟阻抗压降模块 扰动设置: 在0.5秒到2秒始端设置0.25Hz的电网频…...

android获取RAM、CPU频率、系统版本、CPU核数
参考链接: https://www.jianshu.com/p/76d68d13c475 https://github.com/matthewYang92/Themis 获取CPU频率、核数的逻辑,是通过文件操作实现的,Android是基于Linux系统的,所以该方式针对不同的手机都是可靠的操作方式。 RAM&am…...

微信小程序python+nodejs+php+springboot+vue 讲座预约系统
讲座预约管理系统的用户是系统最根本使用者,按需要分析系统包括用户:学生、管理员。 管理员通过后台的登录页面,选择管理员权限后进行登录,管理员的权限包括学生信息管理和文章公告管理。讲座公告管理,添加讲座公告信息…...

嵌入式开发笔记:STM32的外设GPIO知识学习
GPIO简介: • GPIO ( General Purpose Input Output )通用输入输出口 • 可配置为 8 种输入输出模式 • 引脚电平: 0V~3.3V ,部分引脚可容忍 5V (如舵机和驱动直流电机) • 输出模式下可控制端口…...

单片机论文参考:2、基于单片机的病床呼叫系统设计
任务要求 设计病床呼叫系统,使用3X8矩阵开关分别模拟医院病房与病床位数,当某开关按下时,系统显示呼叫的病房与病床、呼叫的时间。处理完毕可清除该呼叫显示记录。同时有数个病床呼叫时,可以循环呼叫记录显示。 摘要 病房呼叫系统…...

【C语言】结构体实现位段!位段有何作用?
本篇文章目录 1. 声明位段2. 位段的内存分配3. 位段的跨平台问题4.位段的应用5. 如何解决位段的跨平台问题? 1. 声明位段 位段的声明和结构是类似的,有两个不同: 位段的成员必须是 int、unsigned int 或 char。位段的成员名后边有一个冒号和…...

msvcp140为什么会丢失?msvcp140.dll丢失的解决方法
msvcp140.dll 是一个动态链接库文件,它包含了 C 运行时库的一些函数和类,例如全局对象、异常处理、内存管理、文件操作等。它是 Visual Studio 2015 及以上版本中的一部分,用于支持 C 应用程序的运行。如果 msvcp140.dll 丢失或损坏ÿ…...

Ingress Controller
什么是 Ingress Controller ? 在云原生生态中,通常来讲,入口控制器( Ingress Controller )是 Kubernetes 中的一个关键组件,用于管理入口资源对象。 Ingress 资源对象用于定义来自外网的 HTTP 和 HTTPS 规则,以控制进…...

离线安装 K3S
一、前言 简要记录一下离线环境下 K3S 的搭建,版本为 v1.23.17k3s1,使用外部数据库 MySQL 作元数据存储,禁用默认组件(coredns、servicelb、traefik、local-storage、metrics-server)并使用 Helm 单独安装(…...

Error系列-常见异常问题解决方案以及系统指令总结
前情提要 作为一名开发,日常工作中会遇到很多报错的情况,希望我的总结可以帮助到小伙伴们~日常工作中也会遇到需要部署项目或者登陆linux系统操作的情况,很多时候需要查找一些命令,于是我决定,要把我日常经常用到的一…...

c 各种例子
1. struct{ int code; float cost; }item,*ptrst; ptrst&item; prtst->code3451 // ptrst->codeitem.code(*ptrst).code 结构与union 的运算符相同,不同的是union 在同一时间内只能存储成员中的一种,其他的成员不真实。 2. c的修饰符声…...

Flowable主要子流程介绍
1. 内嵌子流程 (1)说明 内嵌子流程又叫嵌入式子流程,它是一个可以包含其它活动、分支、事件,等的活动。我们通常意义上说的子流程通常就是指的内嵌子流程,它表现为将一个流程(子流程)定…...

通过插件去除Kotlin混淆去除 @Metadata标记
在Kotlin中,Metadata是指描述Kotlin类的元数据。它包含了关于类的属性、函数、注解和其他信息的描述。Metadata的作用主要有以下几个方面: 反射:Metadata可以用于在运行时获取类的信息,包括类的名称、属性、函数等。通过反射&…...

【docker】容器跟宿主机、其他容器通信
说明 容器跟宿主机、其他容器通信的关键在于它们要在同一个网络,或者通过修改路由信息来可以让它们互相之间能够找得到对方的 IP。本文主要介绍让它们在同一个网络的方法。 Docker 自定义网络模式介绍 Docker容器可以通过自定义网络来与宿主机或其他容器进行通信…...

nginx重要配置参数
1、https配置证书 nginx配置https访问_LMD菜鸟先飞的博客-CSDN博客 2、同一个端口代理多个页面 nginx同一个地址端口代理多个页面_同一ip,端口,访问不同页面 nginx_LMD菜鸟先飞的博客-CSDN博客 3、nginx访问压缩数据,加快访问速度 #gzip模块设置gzip on; #开启g…...