Android動畫之三:Property Animation(上)

來源:互聯網
上載者:User

Android動畫之三:Property Animation(上)

來完成這個Android動畫系列,之前寫了View Animation和Drawable Animation,接下來講解三種動畫中的最後一種,Property Animation,這也是Android動畫中最強大的一部分,同時也是相對最複雜的一部分。

Property Animation與Value Animation的區別

Property Animation翻譯為屬性動畫,從Android3.0開始引入,相比與View Animation,官方更推薦開發人員使用Property Animation。以下先講解View Animation和Property Animation的區別:

1,View Animation只能對介面上可見的組件進行修改,而Property Animation除此之外還能修改一些不是介面上可見的組件,比如修改一個float類型的值。(剛開始我看到這點也覺得奇怪,不過確實它就是如此,後面會講解怎麼應用它到介面動畫中)

2,View Animation通過動畫效果改變一個組件時,其實只是在螢幕上另一個地方繪製,而組件的響應位置還是沒改變,比如一個在螢幕左側的按鈕,通過View Animation移動到右側,雖然在螢幕上看到按鈕到了右側了,但是你還是需要點擊左側原來的位置,按鈕才會響應。

3,Proerty Animation能修改很多View Animation不能修改的View控制項的屬性,比如背景顏色。

接下來主要講解Property Animation的用法,包含了ValueAnimator,ObjectAnimator和AnimatorSet.

 

ValueAnimator
先看如下代碼
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);animation.setDuration(1000);animation.start();animation.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {System.out.println(onAnimationUpdate = + animation.getAnimatedValue());//可以在這裡更新UI}});

從這個例子看以看出,讓一個浮點數進行Property Animator的變化,有什麼作用呢?你只需要使用addUpdateListener,然後再監聽的onAnimationUpdate中,使用getAnimatedValue()擷取更新值,然後你將該值使用於UI,並重新整理介面。這樣一來,浮點型的Property Animator的與介面動畫效果就聯絡起來了。
上面的onAnimationUpdate與動畫更新周期有關,每個周期調用一次。預設周期是10ms,但是其實這個得看系統的繁忙程度。
ValueAnimator除了可以作用於浮點型,也可以作用於整型。
ObjectAnimator
再來看看ObjectAnimator,t它使ValueAnimator的子類,ValueAnimator需要我們監聽onAnimationUpdate來將變化的值應用於某個UI屬性。而ObjectAnimation的不同之處在於,它能自動將變化的值應用於某個UI屬性。比如下面這個例子。
ObjectAnimator anim = ObjectAnimator.ofFloat(foo, alpha, 0f, 1f);anim.setDuration(1000);anim.start()

以上ObjectAnimator.ofFloat的四個參數,分別是作用的對象,以及作用的屬性,起始值,目標值。其中作用的屬性,必須在作用的對象中有一個setter方法。用ObjectAnimator,會自動將更新值應用於構造方法中聲明的屬性。
使用ObjectAnimator時需要注意以下幾點:
1,當你想使用ObjectAnimator更新某個對象的某個屬性,需要有一個該屬性的setter方法,比如上面的“alpha”,則在foo對象所屬的類中,需要有setAlpha方法,系統使用該方法將最新的變化值應用於UI屬性。當使用ObjectAnimator改變某個屬性,而且沒有該屬性的setter方法,則你可以這樣做:
1),如果你有許可權修改代碼,則直接為該屬性添加一個setter方法 2),使用一個封裝類,在該類中為該屬性增加一個setter方法,然後再方法中將接收到的值應用於該屬性。 3),使用ValueAnimator。
2,如果在構造ObjectAnimator時,只提供了目標值,而沒有起始值,則除了需要為屬性提供setter方法,還需要提供getter方法。

再看下面一個小例子,使用ObjectAnimator改變字型顏色
ObjectAnimator colorAnim = ObjectAnimator.ofInt(tv, textColor,0xff008271, Color.RED);colorAnim.setDuration(4000);colorAnim.setEvaluator(new ArgbEvaluator());colorAnim.setRepeatCount(100);colorAnim.start();


注意兩個問題,第一個是,顏色值必須寫成0xff008271這種,而不能寫成只有6位的十六進位的顏色值。第二個是,這裡需要設定TypeEvaluator,否則顏色變化將是一閃一閃的。從這裡可以發現,TypeEvaluator的作用就是計算動畫每次漸層的值,控制漸層效果,而ArgbEvaluator就是系統提供來處理顏色值變化的。後面會講解怎麼自訂TypeEvaluator。

AnimatorSet
使用AnimatorSet,能讓多個動畫同時進行,或者以前後順序進行,也可以指定某個動畫延遲某段時間後進行。可以看看官網給出的例子
AnimatorSet bouncer = new AnimatorSet();bouncer.play(bounceAnim).before(squashAnim1);bouncer.play(squashAnim1).with(squashAnim2);bouncer.play(squashAnim1).with(stretchAnim1);bouncer.play(squashAnim1).with(stretchAnim2);bouncer.play(bounceBackAnim).after(stretchAnim2);ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, alpha, 1f, 0f);fadeAnim.setDuration(250);AnimatorSet animatorSet = new AnimatorSet();animatorSet.play(bouncer).before(fadeAnim);animatorSet.start();


關於動畫的前後順序,主要with,before,after三個方法,with,表示同時進行,before和after表示前後關係。從上面代碼很容易發現,AnimatorSet中可以包含多個ObjectAnimator,而且可以包含AnimatorSet。

Animation Listeners
動畫的Listener主要是在動畫的一些關鍵時刻做一些操作,比如開始,結束,每一幀的重新整理,重複等等時刻。動畫主要有連個Listener,Animator.AnimatorListener以及ValueAnimator.AnimatorUpdateListener
Animator.AnimatorListener

主要提供了以下回調方法 onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel() 動畫取消時會回調該方法,也會回調onAnimationEnd() 該Listener提供這麼多未實現的方法,如果你只需要實現其中一個方法,但是你只要繼承AnimatorListener就得實現所有方法。為了避免這個問題,你可以選擇繼承AnimatorListenerAdapter,該adapter為上面的各個方法提供了一個空實現,繼承該類,你只需要實現你想用的方法。
ValueAnimator.AnimatorUpdateListener

主要提供了onAnimationUpdate()回調方法,該方法在動畫每一幀執行一次,主要應用於ValueAnimator

TypeEvaluator的原理
動畫是每一幀更新,而動畫一共分為多少幀,每一幀應該做出多少變化,這兩個問題分別交給TimeInterpolator和TypeEvaluator,TimeInterpolator計算出每個幀在什麼時刻,然後使用TypeEvaluator計算在各個幀需要對動畫施加的屬性做出多少改變。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.