Android属性动画 ValueAnimator
轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/zhaoyanjun6/article/details/118699073
本文出自【趙彥軍的博客】
文章目錄
- ValueAnimator
- 例子1: 透明度漸變
- 例子2:倒計(jì)時(shí)
ValueAnimator
Animator 是一個(gè)抽象類
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是整個(gè)屬性動(dòng)畫(huà)機(jī)制當(dāng)中最核心的一個(gè)類,屬性動(dòng)畫(huà)的運(yùn)行機(jī)制是通過(guò)不斷地對(duì)值進(jìn)行操作來(lái)實(shí)現(xiàn)的,而初始值和結(jié)束值之間的動(dòng)畫(huà)過(guò)渡就是由ValueAnimator這個(gè)類來(lái)負(fù)責(zé)計(jì)算的。它的內(nèi)部使用一種時(shí)間循環(huán)的機(jī)制來(lái)計(jì)算值與值之間的動(dòng)畫(huà)過(guò)渡,我們只需要將初始值和結(jié)束值提供給ValueAnimator,并且告訴它動(dòng)畫(huà)所需運(yùn)行的時(shí)長(zhǎng),那么ValueAnimator就會(huì)自動(dòng)幫我們完成從初始值平滑地過(guò)渡到結(jié)束值這樣的效果。除此之外,ValueAnimator還負(fù)責(zé)管理動(dòng)畫(huà)的播放次數(shù)、播放模式、以及對(duì)動(dòng)畫(huà)設(shè)置監(jiān)聽(tīng)器等,確實(shí)是一個(gè)非常重要的類。
但是ValueAnimator的用法卻一點(diǎn)都不復(fù)雜,我們先從最簡(jiǎn)單的功能看起吧,比如說(shuō)想要將一個(gè)值從0平滑過(guò)渡到1,時(shí)長(zhǎng)300毫秒,就可以這樣寫(xiě):
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setDuration(300); anim.start()怎么樣?很簡(jiǎn)單吧,調(diào)用ValueAnimator的ofFloat()方法就可以構(gòu)建出一個(gè)ValueAnimator的實(shí)例,ofFloat()方法當(dāng)中允許傳入多個(gè)float類型的參數(shù),這里傳入0和1就表示將值從0平滑過(guò)渡到1,然后調(diào)用ValueAnimator的setDuration()方法來(lái)設(shè)置動(dòng)畫(huà)運(yùn)行的時(shí)長(zhǎng),最后調(diào)用start()方法啟動(dòng)動(dòng)畫(huà)。
用法就是這么簡(jiǎn)單,現(xiàn)在如果你運(yùn)行一下上面的代碼,動(dòng)畫(huà)就會(huì)執(zhí)行了。可是這只是一個(gè)將值從0過(guò)渡到1的動(dòng)畫(huà),又看不到任何界面效果,我們?cè)鯓硬拍苤肋@個(gè)動(dòng)畫(huà)是不是已經(jīng)真正運(yùn)行了呢?這就需要借助監(jiān)聽(tīng)器來(lái)實(shí)現(xiàn)了,如下所示:
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f); anim.setDuration(300); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float currentValue = (float) animation.getAnimatedValue();Log.d("TAG", "cuurent value is " + currentValue);} }); anim.start();可以看到,這里我們通過(guò)addUpdateListener()方法來(lái)添加一個(gè)動(dòng)畫(huà)的監(jiān)聽(tīng)器,在動(dòng)畫(huà)執(zhí)行的過(guò)程中會(huì)不斷地進(jìn)行回調(diào),我們只需要在回調(diào)方法當(dāng)中將當(dāng)前的值取出并打印出來(lái),就可以知道動(dòng)畫(huà)有沒(méi)有真正運(yùn)行了。運(yùn)行上述代碼,控制臺(tái)打印如下所示:
從打印日志的值我們就可以看出,ValueAnimator確實(shí)已經(jīng)在正常工作了,值在300毫秒的時(shí)間內(nèi)從0平滑過(guò)渡到了1,而這個(gè)計(jì)算工作就是由ValueAnimator幫助我們完成的。另外ofFloat()方法當(dāng)中是可以傳入任意多個(gè)參數(shù)的,因此我們還可以構(gòu)建出更加復(fù)雜的動(dòng)畫(huà)邏輯,比如說(shuō)將一個(gè)值在5秒內(nèi)從0過(guò)渡到5,再過(guò)渡到3,再過(guò)渡到10,就可以這樣寫(xiě):
當(dāng)然也許你并不需要小數(shù)位數(shù)的動(dòng)畫(huà)過(guò)渡,可能你只是希望將一個(gè)整數(shù)值從0平滑地過(guò)渡到100,那么也很簡(jiǎn)單,只需要調(diào)用ValueAnimator的ofInt()方法就可以了,如下所示:
ValueAnimator anim = ValueAnimator.ofInt(0, 100);ValueAnimator當(dāng)中最常用的應(yīng)該就是ofFloat()和ofInt()這兩個(gè)方法了,另外還有一個(gè)ofObject()方法,我會(huì)在下篇文章進(jìn)行講解。
那么除此之外,我們還可以調(diào)用setStartDelay()方法來(lái)設(shè)置動(dòng)畫(huà)延遲播放的時(shí)間,調(diào)用setRepeatCount()和setRepeatMode()方法來(lái)設(shè)置動(dòng)畫(huà)循環(huán)播放的次數(shù)以及循環(huán)播放的模式,循環(huán)模式包括RESTART和REVERSE兩種,分別表示重新播放和倒序播放的意思。這些方法都很簡(jiǎn)單,我就不再進(jìn)行詳細(xì)講解了。
例子1: 透明度漸變
把View的 alpha值,從 1 -- 0.4
val progress: ValueAnimator = ValueAnimator.ofFloat(1f, 0.4f)progress.duration = 1000progress.addUpdateListener {val currentValue: Float = it.animatedValue as Floatview.alpha = currentValue } progress.start()例子2:倒計(jì)時(shí)
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 Intbutton.text = "$currentValue" } progress.start()總結(jié)
以上是生活随笔為你收集整理的Android属性动画 ValueAnimator的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android属性动画 Interpol
- 下一篇: Android属性动画 ObjectAn