HarmonyOS 鸿蒙Next 用keyframeAnimateTo实现点赞的特效帧动画,如何避免出现不正常抖动
HarmonyOS 鸿蒙Next 用keyframeAnimateTo实现点赞的特效帧动画,如何避免出现不正常抖动
【问题现象】
用keyframeAnimateTo实现一个点赞的特效帧动画,图片在往上飘的时候,会出现左右抖动的现象。
【背景知识】
【定位思路】
点赞的特效可以通过keyframeAnimateTo实现。
- 通过设置帧数,插值曲线,以及在event里面设置自定义的效果来实现动画效果。
- 点赞效果,通过在event里面动态改变图片的透明度,矩阵,以及轴和y轴的位置来实现让点赞的图片像炊烟一样上飘的特效。
示例代码如下:
// 用list来设定点赞图片的运动轨迹
{
// 该段关键帧动画的持续时间,单位为毫秒。 取值范围:[0, +∞)
duration: 1,
// 指定在该关键帧时刻状态的闭包函数,即在该关键帧时刻要达到的状态。
event:
() => {
this.scaleArray[index] = 0;
this.opacityArray[index] = 0;
this.offYArray[index] = 0;
this.offXArray[index] = 0;
}
}
,
{
duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
event:
() => {
this.scaleArray[index] = 0.3;
this.opacityArray[index] = 0.5;
this.offYArray[index] = -15;
let xArray = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
this.offXArray[index] = xArray;
}
}
,
{
duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
event:
() => {
this.scaleArray[index] = 0.5;
this.opacityArray[index] = 0.8;
this.offYArray[index] = -30;
let xArray = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
this.offXArray[index] = xArray;
}
}
动画效果的Curve效果默认为EaseInOut,查询文档发现,curve的动画效果一共有以下几种:
名称 |
描述 |
---|---|
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 |
标准曲线,CubicBezier(0.4, 0.0, 0.2, 1.0)。 |
LinearOutSlowIn |
减速曲线,CubicBezier(0.0, 0.0, 0.2, 1.0)。 |
FastOutLinearIn |
加速曲线,CubicBezier(0.4, 0.0, 1.0, 1.0)。 |
ExtremeDeceleration |
急缓曲线,CubicBezier(0.0, 0.0, 0.0, 1.0)。 |
Sharp |
锐利曲线,CubicBezier(0.33, 0.0, 0.67, 1.0)。 |
Rhythm |
节奏曲线,CubicBezier(0.7, 0.0, 0.2, 1.0)。 |
Smooth |
平滑曲线,CubicBezier(0.4, 0.0, 0.4, 1.0)。 |
Friction |
阻尼曲线,CubicBezier(0.2, 0.0, 0.2, 1.0)。 |
其中Linear为匀速运动,所以不会出现抖动,而其余动画效果则会出现各种曲线和速度变化,从而出现抖动的效果。
【解决方案】
修改Curve值,把Curve值改成Linear,就可以消除抖动效果。
示例代码如下:
// 表示动画从头到尾的速度都是相同的
const cur = Curve.Linear;
{
duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
curve:
cur,
event:
() => {
this.scaleArray[index] = 0.3;
this.opacityArray[index] = 0.5;
this.offYArray[index] = -15;
let xArray = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
this.offXArray[index] = xArray;
}
}
核心代码如下:
const cur = Curve.Linear;
/**
* 点赞动画
* 0, 1.18, 0.86, 1
*/
clickAnimation() {
if (!this.uiContext) {
return;
}
let index = getRandomInt(0, NUMBER_OF_ITEMS);
index = index >= NUMBER_OF_ITEMS ? 0 : index;
while (this.flag[index] === true) {
index = getRandomInt(0, NUMBER_OF_ITEMS);
index = index >= NUMBER_OF_ITEMS ? 0 : index;
}
this.flag[index] = true;
this.uiContext.keyframeAnimateTo({
iterations: 1, onFinish: () => {
this.flag[index] = false;
}
}, [
{
duration: 1,
curve: cur,
event: () => {
this.scaleArray[index] = 0;
this.opacityArray[index] = 0;
this.offYArray[index] = 0;
this.offXArray[index] = 0;
}
},
{
duration: getRandomInt(MIN_ANM_DURATION, MAX_ANM_DURATION),
// 动画效果
curve: cur,
event: () => {
this.scaleArray[index] = 0.3;
this.opacityArray[index] = 0.5;
this.offYArray[index] = -15;
let xArray = getRandomInt(MIN_OFFSET_X, MAX_OFFSET_X);
this.offXArray[index] = xArray;
}
}
])
}
function getRandomInt(min: number, max: number): number {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
在HarmonyOS鸿蒙系统中,使用keyframeAnimateTo
实现点赞特效帧动画时,若遇到不正常抖动的问题,通常是由于动画帧之间的过渡处理不当或关键帧设置不合理所致。以下是一些可能的解决方案:
-
优化关键帧设置:确保动画的关键帧设置平滑且连贯,特别是动画的起始和结束帧,避免突兀的变化。
-
调整动画插值器:使用合适的插值器(如
LinearInterpolator
、DecelerateInterpolator
等)来控制动画的速度曲线,使动画过渡更加自然。 -
检查动画属性:确保动画属性(如位置、缩放、旋转等)的变化是平滑且连续的,避免快速或大幅度的跳跃。
-
帧率控制:如果动画帧率较高,尝试降低帧率以减少计算负担和潜在的抖动。
-
资源优化:确保动画资源(如图片)质量适中,避免加载高分辨率资源导致的性能问题。
-
硬件加速:启用硬件加速,提高动画渲染性能,减少抖动现象。
如果上述方法仍无法解决抖动问题,可能是代码实现或系统兼容性问题。此时,建议检查代码逻辑是否有误,或尝试在不同的设备上进行测试,以确定问题来源。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。