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 鸿蒙Next 用keyframeAnimateTo实现点赞的特效帧动画,如何避免出现不正常抖动的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next 用keyframeAnimateTo实现点赞的特效帧动画,如何避免出现不正常抖动的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙系统中,使用keyframeAnimateTo实现点赞特效帧动画时,若遇到不正常抖动的问题,通常是由于动画帧之间的过渡处理不当或关键帧设置不合理所致。以下是一些可能的解决方案:
- 
优化关键帧设置:确保动画的关键帧设置平滑且连贯,特别是动画的起始和结束帧,避免突兀的变化。
 - 
调整动画插值器:使用合适的插值器(如
LinearInterpolator、DecelerateInterpolator等)来控制动画的速度曲线,使动画过渡更加自然。 - 
检查动画属性:确保动画属性(如位置、缩放、旋转等)的变化是平滑且连续的,避免快速或大幅度的跳跃。
 - 
帧率控制:如果动画帧率较高,尝试降低帧率以减少计算负担和潜在的抖动。
 - 
资源优化:确保动画资源(如图片)质量适中,避免加载高分辨率资源导致的性能问题。
 - 
硬件加速:启用硬件加速,提高动画渲染性能,减少抖动现象。
 
如果上述方法仍无法解决抖动问题,可能是代码实现或系统兼容性问题。此时,建议检查代码逻辑是否有误,或尝试在不同的设备上进行测试,以确定问题来源。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。
        
      
                  
                  
                  
