概述
屬性動畫是谷歌在android3.0(API level 11)時候給我們帶來了屬性動畫,真正意義上帶來了”動畫“,以前的幀動畫也就4中效果的組合(旋轉、淡入淡出、放大縮小、平移),而且只是表面的動畫,最經典的比如,把一個button按鈕移動到另一個位置,然后去點擊,一點反應都沒有,但是點擊原來空白位置仍然有點擊事件觸發前一篇博客就提到這個問題(傳動動畫)。而屬性動畫徹徹底底解決這個問題。屬性動畫分為valueAnimator和ObjectAnimator兩大類,這里簡單總結下valueAnimator,畢竟基礎不牢地動山搖。
使用
- 創建實例
int end = etInput.getText().toString().equals("") ? 0 : Integer.valueOf(etInput.getText().toString());final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, end);
可以使用ofInt
,ofFloat
,ofArgb
,復雜的有還有倆個ofObject
,ofPropertyValuesHolder
?
- 添加監聽?
主要分為倆大類?
(1)addUpdateListener
監聽值的變化通過getAnimatedValue()
就可以獲取當前變化的值
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int curValue = (int) valueAnimator.getAnimatedValue();tvShow.setText(String.valueOf(curValue));}});
(2)監聽動畫狀態變化?
主要分為start,end,cancel,repeat
//增加監聽器valueAnimator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animation) {Log.d("xsf", "animation start");}@Overridepublic void onAnimationEnd(Animator animation) {Log.d("xsf", "animation end");}@Overridepublic void onAnimationCancel(Animator animation) {Log.d("xsf", "animation cancel");}@Overridepublic void onAnimationRepeat(Animator animation) {Log.d("xsf", "animation repeat");}});
有時候我們僅僅需要對其中一個狀態進行監聽,這時可以使用AnimatorListenerAdapter()
//增加指定的監聽器valueAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {Log.d("xsf", "animation end");}
ofObject
ofInt和ofFloat傳遞整形和浮點型數值,ofArgb傳遞顏色數值,若是有自定義類型則可以使用ofObjetc
public static ValueAnimator ofObject(TypeEvaluator evaluator, Object... values);
這里需要自定義的Evaluator和Object類型的可變長參數。由于object是自己定義的,因此從當前動畫執行進度到下次對應值的過稱系統并不會知道,因此需要實現TypeEvaluator
接口demo中valueOfObjActivity
有個小例子
ofPropertyValuesHolder()
通常可以用來同時變化一個View的多個屬性,可以使用這個方法,這個目前沒有深入研究,基本用法如下
PropertyValuesHolder valuesHolder = PropertyValuesHolder.ofFloat('translationX', 0.0f, 300.0f);
PropertyValuesHolder valuesHolder1 = PropertyValuesHolder.ofFloat('scaleX', 1.0f, 1.5f);
PropertyValuesHolder valuesHolder2 = PropertyValuesHolder.ofFloat('rotationX', 0.0f, 90.0f, 0.0F);
PropertyValuesHolder valuesHolder3 = PropertyValuesHolder.ofFloat('alpha', 1.0f, 0.3f, 1.0F);ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(imageView, valuesHolder, valuesHolder1, valuesHolder2, valuesHolder3);objectAnimator.setDuration(2000).start()
可以參考?
http://www.cnblogs.com/mengdd/archive/2013/09/06/3305698.html?
http://www.admin10000.com/document/4926.html
插值器
可以參考我以前的一篇博文http://blog.csdn.net/xsf50717/article/details/50472341
其他
- setDuration()、getAnimatedValue()、start()
-
setRepeatCount()、setRepeatMode()、cancel()?
其中setRepeatCount(int value)用于設置動畫循環次數,設置為0表示不循環,設置為ValueAnimation.INFINITE表示無限循環。 setRepeatMode(int value)用于設置循環模式,取值為ValueAnimation.RESTART時,表示正序重新開始,當取值為ValueAnimation.REVERSE表示倒序重新開始。 -
setStartDelay(long startDelay)、clone()?
第一個非常容易理解,就是設置多久后動畫才開始。clone表示復制出來一個完全一樣的新的ValueAnimator實例出來
例子
輸入一個數字,然后從0到數字逐漸增大的示例?
demo傳送門
轉載:http://blog.csdn.net/xsf50717/article/details/51153480