天天看點

Android屬性動畫 ValueAnimatorValueAnimator例子1: 透明度漸變例子2:倒計時

轉載請标明出處: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()方法來添加一個動畫的監聽器,在動畫執行的過程中會不斷地進行回調,我們隻需要在回調方法當中将目前的值取出并列印出來,就可以知道動畫有沒有真正運作了。運作上述代碼,控制台列印如下所示:

Android屬性動畫 ValueAnimatorValueAnimator例子1: 透明度漸變例子2:倒計時

從列印日志的值我們就可以看出,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()
           
Android屬性動畫 ValueAnimatorValueAnimator例子1: 透明度漸變例子2:倒計時

例子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()
           
Android屬性動畫 ValueAnimatorValueAnimator例子1: 透明度漸變例子2:倒計時