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

如何在Rebound(Facebook弹簧库)中监听弹簧动画结束并设置回调?

解决Rebound弹簧动画结束监听的问题

别担心,我马上帮你搞定这个监听弹簧动画结束的问题~

你之前遇到的问题,核心是用错了回调方法:onSpringActivate这个方法是当弹簧从静止状态开始运动的时候触发的,这时候弹簧还在朝着目标值移动,根本还没到结束状态,所以你在里面判断currentValue == endValue当然不会有效果啦!

正确的监听方式:用onSpringAtRest

Rebound的SimpleSpringListener里专门有一个onSpringAtRest方法,它会在弹簧完全静止(也就是动画彻底结束)的时候被调用,这才是你需要的回调!

来看修正后的代码:

mySpring.addListener(new SimpleSpringListener() {
    @Override
    public void onSpringAtRest(Spring spring) {
        super.onSpringAtRest(spring);
        // 这里就是动画结束的时机啦
        Log.d("Spring State", "动画结束!当前值: " + spring.getCurrentValue());
        
        // 执行你需要的后续操作:比如修改圆形颜色、记录关键日志等
        // 注意:因为弹簧值是浮点型,直接用==比较可能有精度问题,建议用差值判断
        if (Math.abs(spring.getCurrentValue() - OPEN) < 0.001) {
            Log.d("Spring State", "已切换到打开状态");
            // 这里写打开后的逻辑,比如更改按钮颜色
            // mCircleView.setBackgroundColor(Color.GREEN);
        } else if (Math.abs(spring.getCurrentValue() - CLOSED) < 0.001) {
            Log.d("Spring State", "已切换到关闭状态");
            // 这里写关闭后的逻辑
            // mCircleView.setBackgroundColor(Color.RED);
        }
    }
});

额外小贴士:浮点值比较的坑

Rebound的弹簧值是浮点类型,由于动画的计算精度问题,弹簧的最终值可能不会完全等于你设置的OPEN或CLOSED常量,而是会非常接近。所以直接用==判断很容易出错,最好用Math.abs(当前值 - 目标值) < 极小值的方式来判断是否到达目标状态。

备选方案:在onSpringUpdate中检测

如果你需要在动画过程中实时监听状态,也可以在onSpringUpdate方法里检查弹簧是否静止:

@Override
public void onSpringUpdate(Spring spring) {
    // 实时获取弹簧值,用于更新UI等操作
    float currentValue = spring.getCurrentValue();
    // 检查是否已经静止(动画结束)
    if (spring.isAtRest()) {
        Log.d("Spring State", "动画结束(通过实时更新检测)");
        // 执行后续逻辑
    }
}

这样修改后,你就能准确捕捉到弹簧动画结束的时机,顺利执行后续的关键操作啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:32:03