? ? ? ?對(duì)rebound的阻尼效果很感興趣秧饮,但是有些時(shí)候并不想引用整個(gè)的rebound庫。只想利用它計(jì)算各個(gè)時(shí)間點(diǎn)對(duì)應(yīng)的值,即提取出對(duì)應(yīng)的算法索烹,封裝成類似Scroller的形式。也就是這里的SpringCalculator類括饶,只是Spring稍稍改了一點(diǎn)點(diǎn)冯乘,具體項(xiàng)目:https://github.com/fornana/Animation。
? ? ? ?看代碼的過程中蛤奥,有些地方感覺可以注意一下蒲每,主要是這么幾點(diǎn):
? ? ? ? ? ? ? 1、動(dòng)畫刷新的問題
? ? ? ? ? ? ? 2喻括、rebound所用到的數(shù)值分析方法
一邀杏、SpringCalculator類
? ? ? ?對(duì)Spring稍微改了點(diǎn),使用方法如下:
SpringCalculator springCalculator = new SpringCalculator();
springCalculator.setConfig(tension,friction);
springCalculator.start(startValue,endValue);
? ? ? 然后不斷調(diào)用springCalculator.advance(deltaTime)唬血,并調(diào)用springCalculator.getCurrentValue()來變化對(duì)象望蜡。效果圖如下,其中SpringCurveView可以縮放拖動(dòng)拷恨。
二脖律、android動(dòng)畫刷新
? ? ? ?在實(shí)際項(xiàng)目開發(fā)過程中,有時(shí)候自定義View里的某些動(dòng)畫使用frame animation或者是value animator都不是那么合適腕侄。這個(gè)時(shí)候就需要自己不斷的觸發(fā)callback小泉,然后在callback中更新對(duì)象芦疏。觸發(fā)callback的間隔必須合適,如果太大就會(huì)卡頓微姊,就是丟幀的那種效果酸茴。rebound中根據(jù)android4.1之前與之后做了不同處理。
? ? ? ?android4.1之前兢交,使用Handler薪捍,在callback中立刻觸發(fā)下一次的callback。
? ? ? ?android4.1之后配喳,則使用ChoreoGrapher酪穿,通過設(shè)置FrameCallback,在下一幀繪制時(shí)間到的時(shí)候才繪制晴裹。
? ? ? ValueAnimator也是通過ChoreoGrapher來更新的被济。以后需要自己寫動(dòng)畫可以借鑒一下這里。
三涧团、rebound里的數(shù)值分析方法
? ? ? ?rebound的效果是模擬彈簧振子的阻尼振動(dòng)溉潭,根據(jù)牛頓運(yùn)動(dòng)定律,可以用如下微分方程表示:
? ? ? ?rebound實(shí)際上就是解這個(gè)二階的常微分方程少欺。Spring注釋里面提到RK4喳瓣,即四階龍格-庫塔方法。詳細(xì)參考數(shù)值分析赞别,李慶揚(yáng)版畏陕,第9章,龍格-庫塔方法仿滔。這一章提到的是用RK4來解決一階的微分方程惠毁。這里是二階的,所以要轉(zhuǎn)成一階微分方程組崎页,然后使用RK4來解決鞠绰。微分方程組如下:
然后再套用數(shù)值分析(李慶揚(yáng)版)里面的公式即可,Spring的advance()方法和書里講的一樣的飒焦。