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

如何实现类火车制动效果的进度条平滑填充动画?

嘿,我懂你想要的那种「先猛冲一段、再慢悠悠收尾」的火车式进度条动画效果!你当前用的是单一的加速插值器,要实现这种分段变速的效果,我们可以用两种直观的方案来搞定,下面给你详细拆解:

方案一:用AnimatorSet拆分两段动画(最易调整)

这个思路最直接——把动画拆成「快速填充到指定节点」和「减速完成剩余进度」两个独立阶段,再按顺序执行:

// 先定义两个关键节点,你可以根据需求随便改
int midProgress = 70; // 快速阶段的结束进度(比如先冲到70%)
int finalProgress = 100; // 最终完成进度

// 第一阶段:快速冲至中间节点,用线性/加速插值器+短时长
ObjectAnimator fastStage = ObjectAnimator.ofInt(pbOption, "progress", 0, midProgress);
fastStage.setDuration(350); // 快速阶段的时长,数值越小冲得越快
fastStage.setInterpolator(new LinearInterpolator()); // 匀速冲刺,想更猛就换AccelerateInterpolator(1.5f)

// 第二阶段:减速完成剩余进度,用减速插值器+长时长
ObjectAnimator slowStage = ObjectAnimator.ofInt(pbOption, "progress", midProgress, finalProgress);
slowStage.setDuration(900); // 减速阶段的时长,数值越大收尾越慢
slowStage.setInterpolator(new DecelerateInterpolator(2f)); // 参数越大,减速感越明显

// 组合两个动画,按顺序播放
AnimatorSet animSet = new AnimatorSet();
animSet.playSequentially(fastStage, slowStage);
animSet.start();

调整小贴士:

  • 改midProgress可以切换快速阶段的结束节点,比如改成60%或80%
  • 调整两个阶段的setDuration值,能精准控制快慢节奏的比例
  • 如果想要第一阶段更有「爆发力」,把第一阶段的插值器换成new AccelerateInterpolator(1.8f)就行
方案二:用自定义PathInterpolator实现顺滑单段动画

不想拆成两段的话,也可以用PathInterpolator自定义一条速度曲线,模拟先快后慢的自然过渡:

// 创建一个路径,定义动画的速度变化逻辑
Path speedPath = new Path();
speedPath.moveTo(0f, 0f); // 动画起点:时间0%,进度0%
speedPath.lineTo(0.3f, 0.7f); // 前30%的时间完成70%的进度(快速阶段)
// 用三阶贝塞尔曲线实现顺滑的减速收尾,避免生硬分段
speedPath.cubicTo(0.3f, 0.7f, 0.65f, 0.88f, 1f, 1f);

// 用自定义路径生成插值器
PathInterpolator customInterpolator = new PathInterpolator(speedPath);

// 套用你原来的动画框架,替换插值器即可
ObjectAnimator animation = ObjectAnimator.ofInt(pbOption, "progress", 0, percent);
animation.setDuration(1250);
animation.setInterpolator(customInterpolator);
animation.start();

进阶玩法:

你可以拖动贝塞尔曲线的控制点(cubicTo里的中间两个参数),微调减速阶段的顺滑度,直到调出最符合你预期的「火车进站」感。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:50:41