鸿蒙HarmonyOS实战-ArkUI动画(弹簧曲线动画)
前言
弹簧曲线动画是一种模拟弹簧运动的动画效果,通过改变弹簧的拉伸或压缩来表现不同的运动状态。以下是制作弹簧曲线动画的步骤:
- 创建一个弹簧的模型,可以使用圆形或者曲线来代表弹簧的形状。
- 将弹簧固定在一个点上,这个点可以是屏幕中心或其他位置。
- 定义一个目标位置,弹簧将会朝向这个位置进行拉伸或压缩。
- 使用动画技术,逐步改变弹簧的形状,使其逐渐接近目标位置。
- 在动画过程中,可以考虑添加一些物理效果,如惯性、摩擦力等,以增加动画的真实感。
- 循环播放动画,以实现不断的弹簧运动效果。
通过调整弹簧的属性和动画参数,可以制作出不同类型的弹簧曲线动画,如摆动、震动、弹跳等效果。可以使用编程语言或动画软件来实现弹簧曲线动画。
一、弹簧曲线动画
ArkUI提供了预置动画曲线,用于指定动画属性从起始值到终止值的变化规律,例如Linear、Ease、EaseIn等。此外,ArkUI还提供了由弹簧振子物理模型产生的弹簧曲线。通过使用弹簧曲线,开发者可以实现超过设定终止值的震荡效果,直至最终停止。弹簧曲线具有更强的互动性和可玩性,与其他曲线相比具有更强的动画效果。
弹簧曲线的接口包括两类,即springCurve和springMotion以及responsiveSpringMotion。这两种方式都可以生成弹簧曲线。
1.使用springCurve
springCurve的接口为:
springCurve(velocity: number, mass: number, stiffness: number, damping: number)
velocity:初速度是指物体在某一瞬间的速度,通常使用符号v0表示。
mass:弹簧系统的质量(m)是指整个弹簧系统的质量,包括弹簧本身的质量以及弹簧上的附加物体的质量。
stiffness:弹簧系统的刚度(k)是指弹簧的弹性系数,表示弹簧单位伸长或压缩时所产生的力的大小。刚度越大,弹簧的伸长或压缩程度对应的力就越大。
damping:阻尼(d)是指弹簧系统中存在的阻碍物体振动的阻力。阻尼可以分为无阻尼、欠阻尼和过阻尼三种情况。无阻尼情况下,弹簧系统会进行自由振动;欠阻尼情况下,弹簧系统会有振幅逐渐减小的振动;过阻尼情况下,弹簧系统会有更加缓慢的振动。
案例:
import curves from '@ohos.curves';
@Entry
@Component
struct SpringTest {
@State translateX: number = 0;
private jumpWithSpeed(speed: number) {
this.translateX = -1;
animateTo({ duration: 2000, curve: curves.springCurve(speed, 1, 1, 1.2) }, () => {
// 以指定初速度进行x方向的平移的弹簧动画
this.translateX = 0;
})
}
build() {
Column() {
Button("button")
.fontSize(14)
.width(100)
.height(50)
.margin(30)
.translate({ x: this.translateX })
Row({space:50}) {
Button("jump 50").fontSize(14)
.onClick(() => {
// 以初速度50的弹簧曲线进行平移
this.jumpWithSpeed(50);
})
Button("jump 200").fontSize(14)
.onClick(() => {
// 以初速度200的弹簧曲线进行平移
this.jumpWithSpeed(200);
})
}.margin(30)
}.height('100%').width('100%')
}
}

2.使用springMotion和responsiveSpringMotion
springMotion和responsiveSpringMotion的接口为:
springMotion(response?: number, dampingFraction?: number, overlapDuration?: number)
responsiveSpringMotion(response?: number, dampingFraction?: number, overlapDuration?: number)
response:弹簧自然振动周期是指在没有外力作用下,弹簧系统从一个极限位置到达另一个极限位置所需要的时间。它可以用公式T =2π√(m/k)来计算,其中T表示自然振动周期,m表示弹簧系统的质量,k表示弹簧的刚度。
dampingFraction:阻尼系数是指弹簧系统中阻尼的大小,用符号β表示。它可以分为三种情况:无阻尼(β = 0),欠阻尼(β < 2√(mk)),过阻尼(β > 2√(mk))。阻尼系数越大,弹簧系统的振动越快地衰减。
overlapDuration:弹性动画衔接时长是指在动画制作中,两个物体之间由于弹性作用而发生的变形或运动的过程中所需要的时间。这个时长可以通过调整动画的帧率和物体的弹性特性来控制,使得动画看起来更加流畅和自然。
import curves from '@ohos.curves';
@Entry
@Component
struct SpringMotionTest {
@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 })
.onTouch((event: TouchEvent) => {
if (event.type === TouchType.Move) {
// 跟手过程,使用responsiveSpringMotion曲线
animateTo({ curve: curves.responsiveSpringMotion() }, () => {
// 减去半径,以使球的中心运动到手指位置
this.positionX = event.touches[0].screenX - this.diameter / 2;
this.positionY = event.touches[0].screenY - this.diameter / 2;
console.info(`move, animateTo x:${this.positionX}, y:${this.positionY}`);
})
} else if (event.type === TouchType.Up) {
// 离手时,使用springMotion曲线
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%')
}
}

跟手过程推荐使用responsiveSpringMotion曲线,松手过程推荐使用springMotion曲线。跟手过程随着手的位置变化会被多次触发,所以会接连启动多次responsiveSpringMotion动画,松手时启动一次springMotion动画。
写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing,不定期分享原创知识。
- 更多鸿蒙最新技术知识点,请关注作者博客:https://t.doruo.cn/14DjR1rEY

鸿蒙HarmonyOS实战-ArkUI动画(弹簧曲线动画)的更多相关文章
- 关东升的《iOS实战:图形图像、动画和多媒体卷(Swift版)》上市了
关东升的<iOS实战:图形图像.动画和多媒体卷(Swift版)>上市了 承蒙广大读者的厚爱我的<iOS实战:图形图像.动画和多媒体卷(Swift版)>京东上市了,欢迎广大读者提 ...
- JS模拟CSS3动画-贝塞尔曲线
一.什么是贝塞尔曲线 1962年,法国工程师皮埃尔·贝塞尔(Pierre Bézier),贝塞尔曲线来为为解决汽车的主体的设计问题而发明了贝塞尔曲线.如今,贝赛尔曲线是计算机图形学中相当重要的一种曲线 ...
- Android动画之Tween动画实战
Android动画分为Tween动画和Frame动画,上一节通过一个实例介绍了Frame动画,本节将介绍Tween动画.Tween可以把对象进行缩小.放大.旋转和渐变等操作. Tween动画有 ...
- Android开发实战之补间动画和属性动画
说起动画,其实一点也不陌生,在使用一款app的时候为了优化用户体验,多多少少的,都会加入动画. 安卓中的动画,分为两大类:补间动画和属性动画.本篇博文会详细介绍总结这两大动画,希望本篇博文对你的学习和 ...
- iOS项目开发实战——制作视图的缩放动画
视图的大小应该是随时可控的.今天我们就来实现对一个View的缩放动画.该动画的实现与位移动画,透明度动画稍有不同. 详细实现例如以下: import UIKit class ScaleViewCont ...
- 【Flutter 实战】动画序列、共享动画、路由动画
老孟导读:此篇文章是 Flutter 动画系列文章第四篇,本文介绍动画序列.共享动画.路由动画. 动画序列 Flutter中组合动画使用Interval,Interval继承自Curve,用法如下: ...
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
- 背水一战 Windows 10 (15) - 动画: 缓动动画
[源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...
- 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画
原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画 ...
- ios基础动画、关键帧动画、动画组、转场动画等
概览 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌.在这里你可以看到iOS中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
随机推荐
- Vue前端项目架构梳理
撰写日期:2020-07-23 撰稿人:彭成刚 转载需经本人同意. Vue前端项目架构梳理 后期可以将TypeScript加入到项目来,对参数的数据类型进行更严格的校验. 现在主流就 Vue 和 Re ...
- C++标准库字符串流sstream
sstream与strstream 在C++有两种字符串流,一种在<strstream>中定义,另一种在<sstream>中定义,两者的区别如下: strstream里包含st ...
- 候捷-C++面向对象高级开发
目录 笔记参考 学习目标 complex类 构造函数 常量成员函数 参数传递 函数返回值 临时对象 友元 string类 三大函数 堆.栈与内存管理 扩展补充:类模板.函数模板及其他 继承.复合.委托 ...
- 视野修炼-技术周刊第73期 | AI 春联生成
欢迎来到第 73 期的[视野修炼 - 技术周刊],下面是本期的精选内容简介 强烈推荐 AI 春联 Vue 10周年啦! 开源工具&技术资讯 2024 你应该知道的几个CSS特性 Vite 5. ...
- Spring Boot学习日记7
学会了配置spring boot 导入各种组件 SpringBoot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值 将这些自动配置的类导入容器,自动配置类就会 ...
- SQLI-LABS(Less-11、12)
Less-11(POST-Error Based-Single Quotes-String) 打开Less-11的页面,可以看到一个登录框,需要输入用户名和密码,由本关名字可知SQL语句是单引号闭合. ...
- openlayers操作分享:如何从容的在vue中食用openlayers6
这篇文章,分享下我对openlayers的一些经验和理解,会夹杂大量搜索出来得文档,是我正式使用时可以实现的,废话不多说,我们从下载开始 一,openlayers安装且初始化地图 创建vue项目就省略 ...
- Redis(5)——亿级数据过滤和布隆过滤器
一.布隆过滤器简介 上一次 我们学会了使用 HyperLogLog 来对大数据进行一个估算,它非常有价值,可以解决很多精确度不高的统计需求.但是如果我们想知道某一个值是不是已经在 HyperLogLo ...
- 【Oracle】手动安装和卸载Oracle,这是最全的一篇了!!
写在前面 之前写过一篇在CentOS 7/8上安装Oracle的文章,按照我写的文章安装成功了,但是卸载Oracle时出现了问题.今天,我就整理一篇手动安装和卸载Oracle的文章吧.全文为实战型内容 ...
- Topshelf C# 开发 Windows 服务程序最简单的方式
Topshelf 官方网站: http://topshelf-project.com/ Topshelf 文档地址: https://topshelf.readthedocs.io/en/latest ...