轉載請标明出處:http://blog.csdn.net/zhaoyanjun6/article/details/118699073
本文出自【趙彥軍的部落格】
文章目錄
- ValueAnimator
- 例子1: 透明度漸變
- 例子2:倒計時
ValueAnimator
Animator 是一個抽象類
public abstract class Animator implements Cloneable {
public void start() {
}
public void cancel() {
}
public void end() {
}
......
}
ValueAnimator
public class ValueAnimator extends Animator implements AnimationHandler.AnimationFrameCallback {
}
ValueAnimator
是整個屬性動畫機制當中最核心的一個類,屬性動畫的運作機制是通過不斷地對值進行操作來實作的,而初始值和結束值之間的動畫過渡就是由
ValueAnimator
這個類來負責計算的。它的内部使用一種時間循環的機制來計算值與值之間的動畫過渡,我們隻需要将初始值和結束值提供給
ValueAnimator
,并且告訴它動畫所需運作的時長,那麼
ValueAnimator
就會自動幫我們完成從初始值平滑地過渡到結束值這樣的效果。除此之外,
ValueAnimator
還負責管理動畫的播放次數、播放模式、以及對動畫設定監聽器等,确實是一個非常重要的類。
但是
ValueAnimator
的用法卻一點都不複雜,我們先從最簡單的功能看起吧,比如說想要将一個值從
0平滑過渡到1,時長300毫秒
,就可以這樣寫:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.start()
怎麼樣?很簡單吧,調用
ValueAnimator
的
ofFloat()
方法就可以建構出一個
ValueAnimator
的執行個體,
ofFloat()
方法當中允許傳入多個
float
類型的參數,這裡傳入0和1就表示将值從0平滑過渡到1,然後調用
ValueAnimator
的setDuration()方法來設定動畫運作的時長,最後調用
start()
方法啟動動畫。
用法就是這麼簡單,現在如果你運作一下上面的代碼,動畫就會執行了。可是這隻是一個将值從0過渡到1的動畫,又看不到任何界面效果,我們怎樣才能知道這個動畫是不是已經真正運作了呢?這就需要借助監聽器來實作了,如下所示:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(300);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float currentValue = (float) animation.getAnimatedValue();
Log.d("TAG", "cuurent value is " + currentValue);
}
});
anim.start();
可以看到,這裡我們通過addUpdateListener()方法來添加一個動畫的監聽器,在動畫執行的過程中會不斷地進行回調,我們隻需要在回調方法當中将目前的值取出并列印出來,就可以知道動畫有沒有真正運作了。運作上述代碼,控制台列印如下所示:

從列印日志的值我們就可以看出,ValueAnimator确實已經在正常工作了,值在300毫秒的時間内從0平滑過渡到了1,而這個計算工作就是由ValueAnimator幫助我們完成的。另外ofFloat()方法當中是可以傳入任意多個參數的,是以我們還可以建構出更加複雜的動畫邏輯,比如說将一個值在5秒内從0過渡到5,再過渡到3,再過渡到10,就可以這樣寫:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 5f, 3f, 10f);
anim.setDuration(5000);
anim.start();
當然也許你并不需要小數位數的動畫過渡,可能你隻是希望将一個整數值從0平滑地過渡到100,那麼也很簡單,隻需要調用ValueAnimator的ofInt()方法就可以了,如下所示:
ValueAnimator當中最常用的應該就是
ofFloat()
和
ofInt()
這兩個方法了,另外還有一個
ofObject()
方法,我會在下篇文章進行講解。
那麼除此之外,我們還可以調用
setStartDelay()
方法來設定動畫延遲播放的時間,調用
setRepeatCount()
和
setRepeatMode()
方法來設定動畫循環播放的次數以及循環播放的模式,循環模式包括
RESTART
和
REVERSE
兩種,分别表示重新播放和倒序播放的意思。這些方法都很簡單,我就不再進行詳細講解了。
例子1: 透明度漸變
把
View
的
alpha
值,從
1 -- 0.4
val progress: ValueAnimator = ValueAnimator.ofFloat(1f, 0.4f)
progress.duration = 1000
progress.addUpdateListener {
val currentValue: Float = it.animatedValue as Float
view.alpha = currentValue
}
progress.start()
例子2:倒計時
val progress: ValueAnimator = ValueAnimator.ofInt(60, 0)
progress.duration = 6000 //6秒
progress.startDelay = 500
progress.interpolator = LinearInterpolator()
progress.addUpdateListener {
val currentValue: Int = it.animatedValue as Int
button.text = "$currentValue"
}
progress.start()