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

