对rebound的阻尼效果很感兴趣,但是有些时候并不想引用整个的rebound库。只想利用它计算各个时间点对应的值,即提取出对应的算法,封装成类似Scroller的形式。也就是这里的SpringCalculator类,只是Spring稍稍改了一点点,具体项目:https://github.com/fornana/Animation。
看代码的过程中,有些地方感觉可以注意一下,主要是这么几点:
1、动画刷新的问题
2、rebound所用到的数值分析方法
一、SpringCalculator类
对Spring稍微改了点,使用方法如下:
SpringCalculator springCalculator = new SpringCalculator();
springCalculator.setConfig(tension,friction);
springCalculator.start(startValue,endValue);
然后不断调用springCalculator.advance(deltaTime),并调用springCalculator.getCurrentValue()来变化对象。效果图如下,其中SpringCurveView可以缩放拖动。
二、android动画刷新
在实际项目开发过程中,有时候自定义View里的某些动画使用frame animation或者是value animator都不是那么合适。这个时候就需要自己不断的触发callback,然后在callback中更新对象。触发callback的间隔必须合适,如果太大就会卡顿,就是丢帧的那种效果。rebound中根据android4.1之前与之后做了不同处理。
android4.1之前,使用Handler,在callback中立刻触发下一次的callback。
android4.1之后,则使用ChoreoGrapher,通过设置FrameCallback,在下一帧绘制时间到的时候才绘制。
ValueAnimator也是通过ChoreoGrapher来更新的。以后需要自己写动画可以借鉴一下这里。
三、rebound里的数值分析方法
rebound的效果是模拟弹簧振子的阻尼振动,根据牛顿运动定律,可以用如下微分方程表示:
rebound实际上就是解这个二阶的常微分方程。Spring注释里面提到RK4,即四阶龙格-库塔方法。详细参考数值分析,李庆扬版,第9章,龙格-库塔方法。这一章提到的是用RK4来解决一阶的微分方程。这里是二阶的,所以要转成一阶微分方程组,然后使用RK4来解决。微分方程组如下:
然后再套用数值分析(李庆扬版)里面的公式即可,Spring的advance()方法和书里讲的一样的。