Android 動(dòng)畫之屬性動(dòng)畫(一)

Android 動(dòng)畫之屬性動(dòng)畫(一)#


說到動(dòng)畫,先給大家一點(diǎn)概念。眾所周知,動(dòng)畫其實(shí)是很多幀的圖片以小于人類眼睛所能識(shí)別最小的時(shí)間間隔進(jìn)行播放,而Android里面的動(dòng)畫的原理就是通過一個(gè) 來管理一個(gè) ,通過這個(gè)類,可以持續(xù)地改變這個(gè)值,畫面本身與這個(gè) 相關(guān),于是就相當(dāng)于產(chǎn)生一幀一幀的畫面,從而形成動(dòng)畫。

什么是屬性動(dòng)畫(Property Animation),先來看看官方的解釋

The property animation system is a robust framework that allows you to animate almost anything. You can define an animation to change any object property over time, regardless of whether it draws to the screen or not. A property animation changes a property's (a field in an object) value over a specified length of time.

它是為了彌補(bǔ)補(bǔ)間動(dòng)畫(Tween Animation)的缺陷所引入的,比起補(bǔ)間動(dòng)畫的優(yōu)勢(shì)有

  1. 補(bǔ)間動(dòng)畫只能對(duì)view對(duì)象進(jìn)行操作,但是屬性動(dòng)畫可以對(duì)任何Object的任何屬性進(jìn)行操作,不管是看見還可是不可見
  2. 補(bǔ)間動(dòng)畫只提供了移動(dòng),縮放,旋轉(zhuǎn),淡入淡出這幾種動(dòng)畫,而補(bǔ)間動(dòng)畫則可以實(shí)現(xiàn)上述動(dòng)畫之外的更多效果
  3. 補(bǔ)間動(dòng)畫還有一個(gè)致命缺陷,就是它只是改變了View的顯示效果而已,而不會(huì)真正去改變View的屬性。什么意思呢?比如說,現(xiàn)在屏幕的左上角有一個(gè)按鈕,然后我們通過補(bǔ)間動(dòng)畫將它移動(dòng)到了屏幕的右下角,現(xiàn)在你可以去嘗試點(diǎn)擊一下這個(gè)按鈕,點(diǎn)擊事件是絕對(duì)不會(huì)觸發(fā)的,因?yàn)閷?shí)際上這個(gè)按鈕還是停留在屏幕的左上角,只不過補(bǔ)間動(dòng)畫將這個(gè)按鈕繪制到了屏幕的右下角而已,而屬性動(dòng)畫則是完全改變了view的屬性
  4. 但是,補(bǔ)間動(dòng)畫 的建立時(shí)間會(huì)比 屬性動(dòng)畫 動(dòng)畫要短,代碼量也會(huì)更少,當(dāng)補(bǔ)間動(dòng)畫可以滿足所需要的動(dòng)畫效果時(shí),首先使用補(bǔ)間動(dòng)畫!

The characteristics of an porperty animation##

在屬性動(dòng)畫里面,有如下特性:

  • Duration(動(dòng)畫運(yùn)行持續(xù)時(shí)間):默認(rèn)300ms
  • Time interpolation(時(shí)間內(nèi)插值):簡(jiǎn)單來說,想象一個(gè)值從0變到1,中間產(chǎn)生50個(gè)值,Time interpolation 就決定了產(chǎn)生的值是均勻的(0,0.2,0.4,0.6,..1)還是加速的(0,0.1,0.3,0.6,1)或者減速,或者拋物線等等
  • Repeat count and behavior(重復(fù)時(shí)間和行為):決定動(dòng)畫的效果重復(fù)幾次以及是否進(jìn)行逆過程,就是play back in reverse
  • Animator sets(動(dòng)畫集):你可以把幾個(gè)動(dòng)畫效果存放到一個(gè)集合中,進(jìn)行順序序播放或者延時(shí)等等
  • Frame refresh delay(幀更新頻率):決定動(dòng)畫幀更新的頻率,通常是10ms,具體取決于系統(tǒng)的運(yùn)行情況以及系統(tǒng)所提供的計(jì)時(shí)器

How Property Animation Works##

記住以上的幾個(gè)特性后,接下來看看屬性動(dòng)畫是怎樣實(shí)現(xiàn)的:
下面是兩個(gè)簡(jiǎn)單的例子,對(duì)于一個(gè)假想的Object對(duì)它的 x(位移)的屬性進(jìn)行動(dòng)畫


 figure 1.Example of a linear animation

 figure 2.Example of a non-linear animation

上述兩個(gè)例子的動(dòng)畫效果是隨著時(shí)間的變化,x的值發(fā)生變化,并且每10ms更新一次 x 值,從而實(shí)現(xiàn)了,但是也可以看到兩個(gè)例子的區(qū)別是 例1 是勻速地進(jìn)行位移,而 例2 則是變速的進(jìn)行位移。也就是兩者的Time interpolation 是不一樣的。

創(chuàng)建一個(gè)動(dòng)畫需要?jiǎng)?chuàng)建一個(gè)ValueAnimator對(duì)象(當(dāng)然接下來你會(huì)知道還有其他的)來對(duì)被動(dòng)畫的對(duì)象進(jìn)行管理。它記錄著動(dòng)畫的進(jìn)程以及進(jìn)行動(dòng)畫的屬性的當(dāng)前值。一個(gè) ValueAnimator 封裝(encapsulate)如下幾個(gè)對(duì)象:

  • elapsed fraction :這是一個(gè)用于記錄動(dòng)畫進(jìn)程的參數(shù),值的變化范圍從0~1,0代表動(dòng)畫進(jìn)行到0%,1代表動(dòng)畫進(jìn)行到100%,它的變化情況取決于  Duration 以及動(dòng)畫進(jìn)行了多久
  • TimeInterpolator:這是一個(gè)內(nèi)插值管理器,利用 interpolated fraction 這個(gè)參數(shù)來管理 Time interpolation , 例1 中的 TimeInterpolator 就是一個(gè)線性的 Interpolator ,它的 Interpolator fraction 就會(huì)線性均勻地變化, 例2 就是一個(gè)先加速后減速的Interpolator,它的Interpolator fraction變化情況也是先加速后減速
  • TypeEvaluator:它和 TimeInterpolator 一樣,也是一個(gè)數(shù)值管理器,它的參數(shù)是就是所要進(jìn)行的動(dòng)畫的屬性值,例如上面例子中的 x ,而且注意到 x 是一個(gè)整數(shù)值,所以它的 TypeEvaluator 是一個(gè) IntEvaluator

Property Animation 的內(nèi)部是怎么運(yùn)行的呢,與上面提到的四個(gè)對(duì)象有著重大關(guān)聯(lián):

  1. 當(dāng) VulueAnimator 通過調(diào)用start()方法后,就會(huì)根據(jù) Duration 和當(dāng)前已經(jīng)運(yùn)行了多少時(shí)間去計(jì)算 elapsed fraction ,
  2. elapsed fraction 被計(jì)算出來后,就會(huì)去調(diào)用 TimeInterpolator ,然后 TimeInterpolator 就會(huì)相應(yīng)地計(jì)算出interpolated fraction ,不同類型的 TimeInterpolator 就會(huì)計(jì)算出不同的值。比如 例1 中,在10ms的時(shí)候, elapsed fraction = 0.25, interpolated fraction = 0.25 而在 例2 中, elapsed fraction = 0.25, interpolated fraction = 0.15
  3. interpolated fraction 計(jì)算完成后,就會(huì)調(diào)用 TypeEvaluator ,根據(jù) interpolated fraction 來計(jì)算出屬性值,比如上述兩個(gè)例子中 x = interpolated fraction * 40

API Overview##

(請(qǐng)?jiān)谧屑?xì)復(fù)習(xí)一下 How Property Animation Works 這一部分)
對(duì) Property Animation 有了一個(gè)初步了解之后,接下我們來看看屬性動(dòng)畫的一些常用的類和方法

Animator類###

  • ValueAnimatorValueAnimator 最主要的類,它用來計(jì)算 屬性動(dòng)畫 的屬性值,它包含了計(jì)算屬性值的所有核心函數(shù),動(dòng)畫的信息比如是否重復(fù),監(jiān)聽器信息等等。對(duì)于實(shí)現(xiàn)一個(gè)動(dòng)畫有兩部分,第一部分是計(jì)算屬性值,第二部分是把這些值設(shè)置到你要進(jìn)行的動(dòng)畫的屬性或者對(duì)象中。而 ValueAnimator 只負(fù)責(zé)實(shí)現(xiàn)第一部分,所以必須為 ValueAnimator 設(shè)置一個(gè)監(jiān)聽器,每當(dāng)屬性值有改變時(shí),進(jìn)行你需要的操作
  • ObjectAnimatorValueAnimator 的一個(gè)子類。上面說到,ValueAnimator 需要自己手動(dòng)為對(duì)象設(shè)置值,而 ObjectAnimator 則可以包含這一部分,可以指定你的目標(biāo)對(duì)象,在大部分情況下,我們都是使用 ObjectAnimator 來進(jìn)行 屬性動(dòng)畫
  • AnimatorSet:它提供一個(gè)機(jī)制來管理多個(gè)動(dòng)畫,比如現(xiàn)在有一個(gè)位移動(dòng)畫和縮放動(dòng)畫,它可以為把這兩個(gè)動(dòng)畫歸為一組,來管理他們的播放次序以及播發(fā)時(shí)間等等

Evaluator類###

Evaluator 告訴 Animator 如何去計(jì)算給定的屬性值。它根據(jù) Animator 給定的數(shù)據(jù)來計(jì)算得出屬性值,常用的 Evaluator 有如下

  • IntEvaluator: 系統(tǒng)默認(rèn)的 Evaluator ,用于計(jì)算 Int 類型的屬性值
  • FloatEvaluator:系統(tǒng)默認(rèn)的 Evaluator ,用于計(jì)算 Float 類型的屬性值
  • ArgbEvaluator:系統(tǒng)默認(rèn)的的 Evaluator,用于計(jì)算color類型的屬性值,并且這個(gè)color是以16進(jìn)制數(shù)表示的
  • TypeEvaluator:系統(tǒng)提供的一個(gè) Evaluator 接口,用于實(shí)現(xiàn)自定義的Evaluator

Interpolators類###

Time Interpolators 其實(shí)是一個(gè)時(shí)間的函數(shù),根據(jù)時(shí)間,計(jì)算出 interpolated fraction ,不同的 Time Interpolators 決定了不同函數(shù),比如說它可以是線性的,那么在動(dòng)畫播放的這段時(shí)間里,他是均勻變化的,它也可以是非線性的,比如說動(dòng)畫可以先加速后減速,下面列出一些系統(tǒng)默認(rèn)的 Time Interpolators

  • AccelerateDecelerateInterpolator :先加速后減速的 Time Interpolators
  • AccelerateInterpolator :緩慢開始然后加速的 Time Interpolators
  • AnticipateInterpolator :先往后在往前的 Time Interpolators
  • AnticipateOvershootInterpolator :先往后再往前,超過目標(biāo)值后再回來的 Time Interpolators
  • BounceInterpolator :到達(dá)目標(biāo)值后會(huì)反彈的 Time Interpolators
  • CycleInterpolator :循壞的 Time Interpolators
  • DecelerateInterpolator :減速的 Time Interpolators
  • LinearInterpolator :線性的 Time Interpolators
  • OvershootInterpolator :超過目標(biāo)之后在回來的 Time Interpolators
  • TimeInterpolatorTime Interpolators 的一個(gè)接口,繼承他可以重寫自定義的 Time Interpolators
大概了解了Property Animation的基礎(chǔ)知識(shí),下一篇將介紹如何具體使用屬性動(dòng)畫
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容