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
相关产品推荐
相关产品推荐

