鸿蒙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中如何使用图层精简非交互式绘图,如何通过核心动画创建基础动画.关键帧动画 ...
随机推荐
- [VueJsDev] 其他知识 - NestJS 学习内容
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html NestJS 学习内容 NestJS 学习总结 Step. ...
- 用python进行二进制bin文件合并
一 基本概念 bin文件合并是嵌入式中常用的,这里给一个实例. 二 实例分析 import os import argparse import hashlib offset1 = 0x0010000 ...
- 三维模型OBJ格式轻量化顶点压缩主要技术方法分析
三维模型OBJ格式轻量化顶点压缩主要技术方法分析 三维模型的OBJ格式轻量化中,顶点压缩是一项重要的技术方法,用于减小模型文件的大小.以下是关于三维模型OBJ格式轻量化顶点压缩的主要技术方法的分析: ...
- 【LeetCode刷题】69. x 的平方根
69.x的平方根(点击跳转LeetCode) 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去 ...
- 记录--你还在傻傻的npm run serve吗?快来尝尝这个!
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 大家在日常开发中应该经常会有需要切换不同环境地址的情况.当一个项目代码切换环境地址时,vue-cli没有能够感知文件的变化,所以代理 ...
- rnacos 版本更新为 v0.1.4
rnacos是一个用 rust重新实现的nacos. 周一发布 rnacos 后,有收到部分对2.0版本兼容问题的反馈. 主要是nacos2.0版本的注册心跳与1.0不同,rnacos之前没对2.0版 ...
- LOTO示波器的变长存储深度和分段存储
LOTO示波器的变长存储深度和分段存储 经常有客户咨询和不理解LOTO示波器的存储深度为什么是变长的,也表示对LOTO示波器的分段存储功能不理解,本文对LOTO示波器的存储机制做一次完整的梳理,帮助我 ...
- 分享一个项目:go `file_line`,在编译器得到源码行号,减少运行期runtime消耗
作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 file_line https://github.com/ ...
- 【论文项目复现1】漏洞检测项目复现_VulDeeLocator
复现环境 Ubuntu 20.04 CPU: 32G GPU: 11G 2080ti Source2slice: clang-6.0 + llvm + dg (dg: https://github.c ...
- Java split 分割字符串避坑
使用split进行字符串分割时需要注意2点 1.特殊字符作为分隔符时需要使用\\进行转义(如\\ -> \\\\; | -> \\| ) 特殊字符 .$|()[{^?*+\\ 例如对&qu ...