HarmonyOS 鸿蒙Next 用keyframeAnimateTo实现点赞的特效帧动画,如何避免出现不正常抖动

发布于 1周前 作者 ionicwang 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 用keyframeAnimateTo实现点赞的特效帧动画,如何避免出现不正常抖动

【问题现象】

用keyframeAnimateTo实现一个点赞的特效帧动画,图片在往上飘的时候,会出现左右抖动的现象。

【背景知识】

Curve

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; }

1 回复

在HarmonyOS鸿蒙系统中,使用keyframeAnimateTo实现点赞特效帧动画时,若遇到不正常抖动的问题,通常是由于动画帧之间的过渡处理不当或关键帧设置不合理所致。以下是一些可能的解决方案:

  1. 优化关键帧设置:确保动画的关键帧设置平滑且连贯,特别是动画的起始和结束帧,避免突兀的变化。

  2. 调整动画插值器:使用合适的插值器(如LinearInterpolatorDecelerateInterpolator等)来控制动画的速度曲线,使动画过渡更加自然。

  3. 检查动画属性:确保动画属性(如位置、缩放、旋转等)的变化是平滑且连续的,避免快速或大幅度的跳跃。

  4. 帧率控制:如果动画帧率较高,尝试降低帧率以减少计算负担和潜在的抖动。

  5. 资源优化:确保动画资源(如图片)质量适中,避免加载高分辨率资源导致的性能问题。

  6. 硬件加速:启用硬件加速,提高动画渲染性能,减少抖动现象。

如果上述方法仍无法解决抖动问题,可能是代码实现或系统兼容性问题。此时,建议检查代码逻辑是否有误,或尝试在不同的设备上进行测试,以确定问题来源。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。

回到顶部