You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lottie setProgress使用问题:如何实现动画平滑过渡至最大进度

解决Lottie点击后平滑过渡到最大进度的问题

这个问题我之前做Lottie动画时也踩过坑!你原来的代码逻辑看似是逐帧递增进度,但实际上Android主线程的UI更新是批量处理的——你的for循环在极短时间内就跑完了所有setProgress操作,系统会把这些操作合并,最后只渲染最终的进度值1.0,所以看起来是瞬间跳转,完全看不到中间的平滑过程。

正确的实现方式:用ValueAnimator做渐进式更新

Android的ValueAnimator就是专门用来处理这种数值平滑过渡的场景,它会自动帮你处理帧间的数值插值,并且在每一帧触发UI更新,完美适配你的需求。

具体代码如下:

// 先暂停当前的Lottie动画,记录当前进度
LottieAnimationView unclickedAnimation = ...;
unclickedAnimation.pauseAnimation();
float currentProgress = unclickedAnimation.getProgress();

// 创建数值动画,从当前进度平滑过渡到1.0
ValueAnimator progressAnimator = ValueAnimator.ofFloat(currentProgress, 1.0f);
// 设置动画时长,这里用300ms,你可以根据想要的平滑程度调整
progressAnimator.setDuration(300);
// 可选:添加插值器,让动画过渡更自然,比如先加速后减速
progressAnimator.setInterpolator(new AccelerateDecelerateInterpolator());

// 添加动画更新监听器,每帧更新Lottie的进度
progressAnimator.addUpdateListener(animation -> {
    float updatedProgress = (float) animation.getAnimatedValue();
    unclickedAnimation.setProgress(updatedProgress);
});

// 启动动画
progressAnimator.start();

额外说明

  • 如果你希望动画结束后保持在最大尺寸状态,不需要额外处理,因为setProgress(1.0f)本身就会让动画停在最后一帧。
  • 如果需要在动画结束后执行其他逻辑(比如隐藏按钮、触发后续操作),可以给ValueAnimator添加addListener,在onAnimationEnd方法里处理。

内容的提问来源于stack exchange,提问作者Lucas Heise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:02:04