Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android動畫學習Demo(2) 關於Property Animation的用法及總結

Android動畫學習Demo(2) 關於Property Animation的用法及總結

編輯:關於Android編程

 

首先我們要先了解關於View在3.0之後引入的幾個新的屬性,並設置了其getter和setter方法:

1)translationX 和 translationY:這兩個屬性控制了View所處的位置,它們的值是由layout容器設置的,是相對於坐標原點(0,0左上角)的一個偏移量。

2)rotation, rotationX 和 rotationY:控制View繞著軸點(pivotX和pivotY)旋轉。

3)scaleX 和 scaleY:控制View基於pivotX和pivotY的縮放。

4)pivotX 和 pivotY:旋轉的軸點和縮放的基准點,默認是View的中心點。

5)x 和 y:描述了view在其父容器中的最終位置,是左上角左標和偏移量(translationX,translationY)的和。

6)aplha:透明度,1是完全不透明,0是完全透明。

照例,先上效果Gif,然後再來講解一下各種效果的實現。

\

同樣的,在Property Animation機制中,同樣可以通過XML 或者直接在Java中來定義我們的動畫效果。

XML中定義動畫效果

比如上面展示中ScaleX 按鈕,其效果是在 res/animator/scalex.xml 中定義的,在這裡也要說明一下,定義在 animator中不是必須的,但是是android推薦的,因為在eclipse開發中,ADT插件(ADT 11.0.0+)只會去搜尋 res/animator 這個路徑,如果不是定義在這個文件夾裡面,我們在開發的時候,就沒法利用ADT的布局工具了。

 



在XML中要利用objectAnimator來定義我們的某個屬性的效果,所以:

 

1)propertyName 當然是一定要的啦,理論上這個屬性的值可以是對象中的任何有get/set方法的屬性,不過我們這裡是對View來說,所以一般而言,就是上面新加的那幾種新屬性了。

2)duration 持續時間

3)valueFrom 和 valueTo:這就是動畫開始和結束時,這個屬性相對應的值了,如果我們是縮放的話,當然就是倍數了,如果是平移(Translation)的話,那麼就是距離了。

4)repeatCount 和 repeatMode:這兩個和View Animation 中是一樣的,就不多說了。

在xml中定義好了之後,接下來就要在Java中調用了,如下:

 

Button btnScaleX = (Button)findViewById(R.id.buttonScaleX);
btnScaleX.setOnClickListener(this);
scaleXAnimator = (ObjectAnimator)AnimatorInflater.loadAnimator(this, R.animator.scalex);
scaleXAnimator.setTarget(btnScaleX);
...
public void onClick(View v) {        
	switch(v.getId()){           	    
	    case R.id.buttonScaleX:
			scaleXAnimator.start();
			break;              
	...    

 

1)當然,首先要找到我們動畫的對象了,在demo中就是那個scaleX的button了。

 

2)利用AnimationInflater類的loadAnimator方法來獲取我們的ObjectAnimator對象

3)利用setTarget(View)方法來設置這個動畫應用的對象,在這裡就是我們的按鈕了。

4)觸發動畫效果,就是調用其start方法了。

當動畫效果開始後,我們發現它就只是在x方向上變大,腫了,那我們要在Y方向上怎麼辦,在XML中一個ObjectAnimator只能對應於一個屬性,所以下面就是Set的展現了,跟View Animation一樣,set也是將幾個效果給弄在一起,一次性執行也行,順序執行也行,只要設置其ordering屬性就好。

第二個按鈕scale,就是在X方向上和Y方向上同時進行的,其定義如下:

 



    
    
而在Java中呢,這個xml對應的對象已經不是ObjectAnimator了,而是AnimatorSet了,其代碼如下:

 

 

		Button btnScale = (Button)findViewById(R.id.buttonScale);
		btnScale.setOnClickListener(this);
		animatorScaleSet = (AnimatorSet)AnimatorInflater.loadAnimator(this, R.animator.scale);
		animatorScaleSet.setTarget(btnScale);

 

Java中定義動畫效果

我們也可以直接在java中創建OjbectAnimator和AnimatorSet對象,並設置對應的參數和屬性,如:

 

Set

 

Button buttonSet = (Button) findViewById(R.id.buttonSet);
buttonSet.setOnClickListener(this);
animationSet = new AnimatorSet();
animationSet.playTogether(
		ObjectAnimator.ofFloat(buttonSet, alpha, 1,0,1),
		ObjectAnimator.ofFloat(buttonSet, translationX, 0f,400f,0f),
		ObjectAnimator.ofFloat(buttonSet, rotation, 0,180,360)
		);
animationSet.setDuration(1000);
animationSet.addListener(new AnimatorListener() {			
	@Override
	public void onAnimationStart(Animator arg0) {}
	@Override
	public void onAnimationRepeat(Animator arg0) {}			
	@Override
	public void onAnimationEnd(Animator arg0) {}			
	@Override
	public void onAnimationCancel(Animator arg0) {}			
});
1)我們先通過ObjectAnimator的工廠方法創建幾個ObjectAnimator:

 

1.1)target:動畫效果的實施對象,也就是demo中的set按鈕。

1.2)propertyName:對應的屬性,如alpha,translationX等等。

1.3)values:這是一組值,就是由什麼值變動到另外一個什麼值,再到什麼什麼值。。。之類的。

 

     * @param target The object whose property is to be animated. This object should
     * have a public method on it called setName(), where name is
     * the value of the propertyName parameter.
     * @param propertyName The name of the property being animated.
     * @param values A set of values that the animation will animate between over time.
     * @return An ObjectAnimator object that is set up to animate between the given values.
     */
    public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
        ObjectAnimator anim = new ObjectAnimator(target, propertyName);
        anim.setFloatValues(values);
        return anim;
    }

 

2)然後通過 AnimatorSet的playTogether方法或者playAfter, playBefore等方法將其加入到set中,如果不加入到set的話,就是對

3)給set設置相對應的如duration之類的屬性

4)我們還能夠給Animator添加一個Listener,讓它能夠對Animator的幾個關鍵點進行響應,分別是開始,結束,重復,取消時的響應函數,在這裡有一點要注意的就是:

4.1)如果添加的是 AnimatorListener,則其四個函數都要實現

4.2)我們也可以添加 AnimatorListenerAdapter,它是以AnimatorListener的封裝,實現了上面的幾個空方法,我們只需要實現我們想要的方法就好了,比如:

 

new AnimatorListenerAdapter() {
	@Override
	public void onAnimationEnd(Animator animator){
		final Button button = (Button) findViewById(R.id.buttonViewPropAnimator);
		button.animate().alpha(1).translationX(0f).start();
	}
})

 

5)最後在onClick事件中調用其start方法。

不過在Java中,如果要實現一個對象不同屬性的動畫效果,除了Set,我們還可以利用PropertyValuesHolder和ViewPropertyAnimator對象來實現,具體做法如下:

PropertyValuesHolder

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat(translationX,0f,300f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat(translationY,0f,300f);		
translateAnimator = ObjectAnimator.ofPropertyValuesHolder(buttonProValHolder, pvhX,pvhY);
translateAnimator.setDuration(2000);

1)我們可以通過 PropertyValuesHolder類的工廠方法ofInt, ofFloat等方法,讓它能夠Hold住對應property的value。 2)在利用ObjectAnimator的ofPropertyValuesHolder方法時,再將我們上面定義的propertyValuesHolder給傳進去,定義出一個objectAnimator。 3)設置objectAnimator對應的屬性,調用其Start方法就行。

ViewPropertyAnimator

也可以通過ViewPropertyAnimator類來實現,如下:
case R.id.buttonViewPropAnimator:
	v.animate().translationX(100f).alpha(0).setListener(new AnimatorListenerAdapter() {
		@Override
		public void onAnimationEnd(Animator animator){
			final Button button = (Button) findViewById(R.id.buttonViewPropAnimator);
			button.animate().alpha(1).translationX(0f).start();
		}
	}).start();
1)先利用view的animate() 方法返回一個ViewPropertyAnimator對象,然後調用其translationX,alpha等方法,也可以給其添加listener。 2)最後調用其start方法即可。

關於ValueAnimator

從上面的代碼中,我們可以發現,我們好像都是在用ObjectAnimator對象,那麼ValueAnimator類呢?其實ObjectAnimator是ValueAnimator的一個子類,是比較常用的一個類。 但是有時候如果ObjectAnimator不能滿足我們的需求了,那麼我們就要用ValueAnimator類了。但是我們留到下一篇文章講Property Animation的工作原理的時候再講吧。 (Tips. 其實demo中已經有一個ValueAnimator的實現了,各位可以先看一下)。
源代碼請點擊(請記住,上述屬性是3.0後才支持的!!!)

 

P.S. 大家有沒有發現,在View Animation中,當我們移動一個按鈕到另外一個地方的時候,要響應按鈕的點擊事件的時候,我們必須在原來的位置點擊,那麼在Property Animation中呢,當然是不用啦,大家可以在demo中試試。

P.S. 大家有沒有發現,PropertyAnimation基本上都是用animator,而不是用animation了呢?

P.S. 大家如果有興趣,還可以了解一下View Animation 是怎麼樣的呢,傳送門:

Android動畫學習Demo(1) 關於ViewAnimation的用法及總結

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