Rebound源码分析
让动画不再僵硬:Facebook Rebound Android动画库介绍一文中介绍了rebound这个库。
对于想体验一下rebound的效果,又懒得clone和编译代码的,这里提供一个demo apk。
今天看到了tumblr发布了基于rebound的Backboard,本想直接分析一下Backboard对rebound做了些什么,不过考虑到rebound还没有仔细分析过,所以这里做一下源码分析。
对外部来说,首先接触的就是SpringSystem
了,但在说它之前,先让我们看看Spring
是什么。
Spring
Spring通过可设置的摩擦力(Friction)和张力(tension)实现了胡克定律,通过代码模拟了物理场景:
private static class PhysicsState {
double position;
double velocity;
}
private final PhysicsState mCurrentState = new PhysicsState();
private final PhysicsState mPreviousState = new PhysicsState();
private final PhysicsState mTempState = new PhysicsState();
private double mStartValue;
private double mEndValue;
每个spring从mStartValue
到mEndValue
进行运动,内部维护了当前状态、前值状态,以及临时状态,每个状态由通过位置和速度来描述,而运动的推进逻辑则在
void advance(double realDeltaTime)
advance
方法中,SpringSystem会遍历由其管理的所有Spring实例,对它们进行advance
。
SpringListener
每个Spring
内部都维护着一个SpringListener
数组,这也是我们经常会需要去实现的一个接口:
public interface SpringListener {
void onSpringUpdate(Spring spring);
void onSpringAtRest(Spring spring);
void onSpringActivate(Spring spring);