提綱:文章寫了什麼?
- 什麼是屬性動畫?
- 屬性動畫相關接口及常用類
- ValueAnimator
- ObjectAnimator
- 估值器
- 差值器
屬性動畫,顧名思義就是:沿着一定的時間順序,通過改變View的屬性,從而得到的動畫的效果。引入屬性動畫最大的作用就是爲了“眼見爲實”,對於ViewAnimation,動畫的移動和縮放並沒有真正的改變控件的位置和熱區,而屬性動畫則可以做到這一點。
Interface:
Class:
這裏要着重記錄的是這幾個類:
- ValueAnimator 屬性動畫的核心類
- ObjectAnimator 繼承 ValueAnimator 對ValueAnimator進行了一層封裝
- AnimatorSet 可以同時運行一組動畫
- PropertyValuesHolder 他代表一個在動畫運行中需要過度到的值。
- TypeEvaluator 實現此接口的實例,將決定AnimatorUpdateListener接收到的值。
這裏有必要說明一下,上面對動畫的描述是“運行”,而不是“播放”。因爲屬性動畫的本質是在指定的時間內於指定的值之間過度。這就意味着他並不僅限於View控件。舉例來說,他可以是一個不斷運動的看不見的點,而你在需要的時候可以通過回調知道在某一時間點對應的值,從而進行canvas的繪製。
ValueAnimator
繼承自Animator:
常用的方法有:
用法如下:
// 空構造方法
ValueAnimator animator = new ValueAnimator();
// 創建一個實例 ,開始點0f,結束點位100f,期間經過50
ValueAnimator animator = ValueAnimator.ofFloat(0, 50 ,100);
// 創建一個實例 ,開始點0f,結束點位100
ValueAnimator animator = ValueAnimator.ofInt(0, 100);
//創建一個實例 ,開始點0,結束點位100,自定義返回的類型
ValueAnimator animator = ValueAnimator.ofObject(new TypeEvaluator() {
@Override
public Object evaluate(float fraction, Object startValue, Object endValue) {
// 這裏的三個值分別代表了:一個0~1的float, 開始點, 結束點
return new XXX()
}
} , 0 , 100);
ObjectAnimator
繼承自ValueAnimator:
設置動畫的方法有:
具體用法:
ObjectAnimator.ofFloat(view , rotationX , 0.0f , 360f)
.setDuration(2000)
.start();
估值器
定義及常見的估值器如下:
使用,PositionEvaluator() 是自定義的估值器:
ValueAnimator animator = ValueAnimator.ofObject(
new PositionEvaluator(),
createPoint(RADIUS, RADIUS),
createPoint(getWidth() - RADIUS, getHeight() - RADIUS));
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (PositionPoint) animation.getAnimatedValue();
invalidate();
}
});
插值器
在屬性動畫一章中,我們提到最多的就是動畫的時間概念,插值器就是對時間進行修改的東西,比如說你閒的蛋疼,走斑馬線的時候只踩白塊,這是線性的運動軌跡,而這時候突然在其中某些白塊中間又插入了幾個距離不相等的白塊,你的步伐就不一樣了,移動速度也收到了影響,這就是插值器所做的勾當。
Android 定義好的一些常用插值器:
AccelerateDecelerateInterpolator 慢 - 快- 慢
AccelerateInterpolator 慢 - 快
DecelerateInterpolator 快 - 慢
AnticipateInterpolator 開始的時候向後然後向前甩
AnticipateOvershootInterpolator 開始的時候向後然後向前甩一定值後返回最後的值
BounceInterpolator 動畫結束的時候彈起
CycleInterpolator 動畫循環播放特定的次數,速率改變沿着正弦曲線
LinearInterpolator 以常量速率改變
OvershootInterpolator 向前甩一定值後再回到原來位置
使用:
animation.setInterpolator(new DecelerateInterpolator());
參考致謝:
(1)、DOC
(2)、探索安卓中有意義的動畫!
(3)、 Android 動畫