Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android動畫之三:Property Animation(上)

Android動畫之三:Property Animation(上)

編輯:關於Android編程

來完成這個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() {

	@Override
	public 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計算在各個幀需要對動畫施加的屬性做出多少改變。

 
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved