Using a TypeEvaluator
如果你想對Android系統來說為未知的型態動畫,你可以透過TypeEvaluator介面建立自己的evaluator實現動畫。Android系統所知的型態為int、float或是顏色,由IntEvaluator、FloatEvaluator、ArgbEvaluator型態的evaluator支援。
在TypeEvaluator介面中只有一個方法去執行,那就是evaluate()方法,此方法允許你正在使用的animator在當前的動畫中回傳適合的動畫屬性值。FloatEvaluator類別的實現:
public class FloatEvaluator implements TypeEvaluator { public Object evaluate(float fraction, Object startValue, Object endValue) { float startFloat = ((Number) startValue).floatValue(); return startFloat + fraction * (((Number) endValue).floatValue() - startFloat); } }
Using Interpolators
Interpolator用來定義動畫中的數值該如何計算。例如,你可以指定整段動畫線性地播放,意旨在整段時間中動畫平均地移動;或者指定動畫為非線性地動畫,比如,加速或是減速在動畫的開始或是結尾。
動畫系董中的Interpolators都會接收來自Animator用來表示動畫經過的時間的分數值,Interpolator修改此分數值並符合針對Animator提供的動畫型態。Android系統提供一組普通的Interpolator都放在android.view.animation package,如果這些無法滿足需求,你可以實現TimeInterpolator介面建立自己的。
舉例,預設的AccelerateDecelerateInterpolator及LinearInterpolator如何計算interpolated分數值得比較如下。
AccelerateDecelerateInterpolator
public float getInterpolation(float input) { return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; }
LinearInterpolator
public float getInterpolation(float input) { return input; }
下表顯示一個動畫由這些interpolators計算的大約數值。
ms elapsed | Elapsed fraction/Interpolated fraction (Linear) | Interpolated fraction (Accelerate/Decelerate) |
---|---|---|
0 | 0 | 0 |
200 | .2 | .1 |
400 | .4 | .345 |
600 | .6 | .8 |
800 | .8 | .9 |
1000 | 1 | 1 |
如表顯示,LinearInterpolator以等速改變數值,每200毫秒改變0.2;AccelerateDeccelerateInterpolator在200毫秒到600毫秒間改變數值的速度比LinearInterpolator快,在600毫秒到1000毫秒間比LinearInterpolator慢。
沒有留言:
張貼留言