每一個人都有必定的理想,這種理想決定着他的努力和判斷的方向。就在這個意義上,我歷來不把安逸和快樂看做生活目的的自己——這種倫理基礎,我叫它豬欄的理想。——愛因斯坦html
若是你們想看更多關於Android基礎夯實系列博文,請移步到個人博客:
Ryane's Blogandroid
Property Animation(屬性動畫)是一個很是強大的框架,它容許你讓任何對象都實現動畫效果。 由於無論一個對象是否出現屏幕中,你均可以隨時去改變它的屬性,而屬性動畫正是經過在某個時間點改變對象的屬性實現動畫效果的。Property Animation是在Android 3.0(API 11)以後推出的,以其具備高擴展性,解決了一些View Animation所不能解決的問題,因此,對於Android開發者來講,Property Animation是一個很是重要的知識點。git
本文主要對ValueAnimator作介紹,若是你們有興趣,能夠繼續閱讀本動畫系列其餘相關文章,做者也在不斷更新完善相關內容,但願你們能夠指出有誤之處。github
Android基礎夯實--重溫動畫(一)之Tween Animationapi
Android基礎夯實--重溫動畫(二)之Frame Animation架構
Android基礎夯實--重溫動畫(四)之屬性動畫 ValueAnimator詳解框架
因爲Tween Animation(補間動畫)只能實現簡單的四種的動畫(alpha、scale、rotate、translate),要想實現比較複雜的動畫就難以知足需求,而Frame Animation只是改變了View對象繪製的背景,而沒有改變View對象自己。因此當咱們想使用View Animation實現一些特殊的動畫效果時,就比較困難了。例如,當咱們想改變一個控件的背景顏色時,視圖動畫並不能實現;當咱們想設置一個按鈕在位置轉換以後,仍然保持點擊事件,視圖動畫也不能實現。在這個背景之下,屬性動畫應運而生。ide
說了這麼多,那麼視圖動畫和屬性動畫到底有什麼區別呢?動畫
首先,在直觀上,屬性動畫是區別於視圖動畫的:ui
(1) 時間不同: 視圖動畫是從API LEVEL 1就引入了;而屬性動畫是從API LEVEL 11以後才引入。
(2) 名字不同: 視圖動畫的Tween Animation命名爲xxxAnimation、Frame Animation命名爲AnimationDrawable;而屬性動畫,則命名爲xxxAnimator。
(3) 包名不同: 視圖動畫的Tween Animation在包android.view.animation下,而Property Animation在包android.animation中。
其次,從根本上,咱們能夠總結出視圖動畫和屬性動畫的兩個主要區別:
(1) 視圖動畫只能改變View的位置或者視覺效果,並不能改變其屬性。例如:使用Tween Animation對Button實現位移變換後位置改變,可是點擊Button最後停留位置時,並不能響應點擊事件。怎麼理解呢,舉個例子:
由上圖可知,咱們給TextView設置了點擊事件,當咱們分別使用Tween Animation和Property Animation移動TextView時,當使用Tween Animation位移TextView後,它的點擊事件無效,當使用Property Animation移動TextView後,它的點擊事件仍然有效。因而可知,視圖動畫並不能改變View的屬性,而屬性動畫能夠。
(2) 視圖動畫做用對象只限製爲View,而屬性動畫做用對象不限爲View,而是任何對象。例如:屬性動畫能夠改變顏色值而視圖動畫作不到。一樣舉個例子:
由上圖能夠看到,當咱們須要對一個對象的顏色值進行改變時,視圖動畫並不能實現這個效果,上圖是經過屬性動畫來實現的,由此能夠推測出,視圖動畫只能對View起做用,而屬性動畫做用的不僅是View,而是對象。
雖然Property Animation的優勢要多於View Animation,可是View Animaiton可讓咱們花更少的時間和更少的代碼去實現,因此若是View Animation已經足以知足咱們的平常須要,那麼咱們就不必使用Property Animation了,固然,若是咱們都涉及到的話,同時使用View Animation和Property Animation多是更有效的辦法。
若是你想了解更權威的解釋,能夠查看官方文檔:Property Animation。
本文主要對Property Animation作介紹,若是你們有興趣,能夠繼續閱讀本動畫系列其餘相關文章:
Android基礎夯實--重溫動畫(一)之Tween Animation
Android基礎夯實--重溫動畫(二)之Frame Animation
在講述具體Property Animation相關API以前,我想先給你們講一下屬性動畫是如何工做的。下面經過一個例子,這是Android開發指南上面的一個例子,我以爲很是好理解,這裏就搬過來了。
首先,咱們來看一個例子。以下圖描述的是一個對象在它的x方向上進行水平運動的動畫(規定右方向爲正軸),固然咱們能夠對應成手機屏幕上的位置。這個動畫的時長爲40ms,對象在x正方向運動了40個像素,在每一個10ms內,這個對象就往x正方向運動10個像素,在第40ms時,這個動畫停在了x方向上的40像素,這是一個水平勻速運動的例子。
固然,咱們也能夠給動畫定義一個具備不勻速插值器(Interpolation),是它運動過程爲不勻速。
以下圖也是一個對象的運動過程,可是它並非勻速運動,而是開始加速,在結束前減速。這個對象仍然是在40秒內運動了40個像素的距離,可是這個過程是不勻速的,它從開始到中間位置進行了加速運動,在中間位置到結束位置則進行了減速運動。
從上面兩個例子能夠看到,當咱們想要一個對象實現必定的動畫效果時,咱們能夠經過對應的圖,還有相關的數據,和相關數據伴隨時間的變化來描述該動畫過程,可是咱們的屬性動畫的內部是如何像咱們這樣來描述自身的變化過程的呢?以ValueAnimator爲例,咱們來看一下屬性動畫的重要組成部分,以下圖所示。
ValueAnimator是屬性動畫最基礎的一個類(咱們暫且不深究它,反正它能幫助咱們實現圖2的先加速後減速的過程)。首先它在內部封裝了很是重要的兩個接口,第一個就是TimeInterpolator,另外一個是TypeEvaluator。你們在內心必須先有個概念,在全部的屬性動畫裏面,都擁有這兩個東西。
TimeInterpolator是什麼呢?很是簡單,就是咱們上面所說的插值器,簡單來講就是描述對象加速度的一個東西,再簡單一點來講就是描述速度變化的一個東西。
TypeEvaluator又是什麼呢?你們能夠理解爲求值器,它是根據上面的插值器來計算對象屬性具體值的這麼一個東西。
ValueAnimator在執行以前,首先會把時間分爲百分數,由0~1,如上圖動畫過程爲40ms,那麼在10ms時,時間因子爲0.25,在40ms時,時間因子爲1。
在計算完時間因子以後,ValueAnimator會調用TimeInterpolator來進行計算插值因子,在圖2對應爲速度,對應10ms時的速度咱們知道會比20ms時的速度會低;而圖1中,每個時刻的速度都同樣,因此TimeInterpolator大概是作這麼一件事情。
在TimeInterpolator計算完了以後,那麼咱們的TypeEvaluator就要起做用了,由於上圖對應的是對象的位置變化,因此TypeEvaluator爲IntEvaluator。這個TypeEvaluator主要是根據TimeInterpolator提供的插值因子(速度),還有startPropertyValue(開始時間)和endPropertyValue(結束時間),計算出某個時刻的屬性值(位移),如圖2,假如t=10ms時刻,TimeInterpolator給咱們返回值爲0.15,那麼這時在x方向上的位移爲0.15 * (40 - 0) = 6。
而這種計算過程在動畫執行時間(duration)內是不斷重複的,由於ValueAnimator有一個叫作AnimatorUpdateListener的監聽器,它會跟蹤動畫的每個時刻,因此咱們能夠在裏面進行不斷的計算,經過getAnimatedValue()來獲取最新值,直到動畫結束。
一個屬性動畫的執行過程大概如上,相信你們已經對屬性動畫有了基本的瞭解,那麼咱們下面根據API來對屬性動畫進行詳細講解。
前面咱們說到,屬性動畫機制全部相關的類都位於android.animation包之下,因此你們有須要能夠到官方文檔中進行查閱。下面幾個表格是屬性動畫中經常使用的類,首先給你們大概介紹。
表格1. Animators
Class | Description |
---|---|
ValueAnimator | 針對值變化的Animator。 |
ObjectAnimator | 針對Object變化的Animator。 |
AnimatorSet | 運行一組Animator的集合。 |
Animator類做爲屬性動畫的基類,它是一個抽象類,它提供了實現動畫的基本架構,可是咱們不能直接使用它,由於它只是提供了最基本的的實現動畫的方法,只有讓它的子類繼承它並進行相應擴展以後,咱們纔會使用它實現動畫。在屬性動畫中,Animator包括了ValueAnimator、ObjectAnimator和AnimatorSet三個子類,咱們分別來介紹一下這三個類。
表格2. Evaluators
Class | Description |
---|---|
TypeEvaluator | 求值器接口,全部求值器必須實現該接口。 |
IntEvaluator | 計算Int類型的求值器。 |
FloatEvaluator | 計算Float類型的求值器。 |
ArgbEvaluator | 計算顏色值類型的求值器。 |
API中爲咱們提供了求值器的接口TypeEvaluator,固然還要它的實現類,例如IntEvaluator、FloatEvaluator、ArgbEvaluator、 IntArrayEvaluator、FloatArrayEvaluator等,它們都是根據fraction因子來計算出對應的屬性值,固然咱們也能夠自定義本身的Evaluator。
表格3. Interpolators
Class | Description |
---|---|
TimeInterpolator | Animator的插值器接口。 |
TimeInterpolator做爲屬性動畫的插值器接口,咱們都知道在View Animation中有不少插值器,例如AccelerateDecelerateInterpolator(先後減速,中間加速)、AccelerateInterpolator(先慢後加速)等插值器,在屬性動畫中咱們一樣可使用這些插值器,這裏就不詳細列出來了,不瞭解的同窗能夠看我以前的文章:Android基礎夯實--重溫動畫(一)之Tween Animation。固然,咱們也能夠自定義本身的Interpolator。
因爲文章篇幅過長,不利於你們閱讀,因此這篇文章首先給你們介紹屬性動畫這個概念,相信經過例子和文字的介紹,你們也已經對屬性動畫有所瞭解,那麼接下來,我就會給你們詳細講解屬性動畫中的每個知識點,固然,也會分多篇文章進行分析,若是你已經準備好,請繼續閱讀Android基礎夯實--重溫動畫(四)之屬性動畫 ValueAnimator詳解。