Android屬性動畫(Property Animation)要點

屬性動畫是一種非常棒的框架,能夠使任何對象動起來。


屬性動畫允許我們對自己的動畫進行如下一些屬性的設定:

持續時間: 動畫的持續時間。默認爲300ms。

時間插值: 用於指定隨着時間流逝,要以哪種方式計算動畫屬性的值。

重複次數和行爲:可以設定動畫是否要循環播放或者只播放固定的次數。也可以對動畫的播放行爲進行一些其他的設定,例如將動畫倒着播放。

動畫集:可以將一組動畫打包到一起,一起(或者按一定次序)或者延遲播放。

幀刷新延遲:用於指定多長時間對動畫幀進行一次刷新。默認爲10毫秒,但是實際的數值也和系統跟設備的配置有關。



屬性動畫和視圖動畫有哪些區別:

屬性動畫是針對所有Object對象的,而視圖動畫是針對所有View對象的。下面使他們的繼承關係圖:


其實Object是Java中唯一沒有父類的類,而且它是所有類型的父類,所以一個Object對象可以指向任何對象,但是View就不具備這樣的能力。因此,屬性動畫比視圖動畫更加通用,因爲它使用於幾乎所有對象。

● 視圖動畫只會改變動畫對象的繪製位置,而並沒有改變對象本身,但是屬性動畫改變的就是動畫對象的本身。舉個例子:你用視圖動畫讓一個按鈕移動,但是按鈕移動後,你點擊新按鈕的位置不會有任何反應,因爲這個按鈕的“真身”還在原來沒發生移動的那個位置上



屬性動畫的實現包括ValueAnimator類和ObjectAnimator類。

兩者的區別就是前者在動畫的過程中並不會實際改變動畫對象的屬性值(需要自己在監聽器中實現對響應事件的響應代碼),而後者則會非常方便的在動畫過程中自動改變動畫對象的屬性值。



這裏着重介紹ObjectAnimator的使用,因爲在使用這個類的時候有一些需要特別注意的地方,我們由一個代碼示例展開對這個類的使用方法的介紹:

下面的這段代碼直接覆蓋到主layout XML文件即可:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >
    
    <ImageView
        android:id="@+id/img"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:src="@drawable/ic_launcher"
        android:onClick="performAnimation" />

</RelativeLayout>

下面這段代碼直接覆蓋到MainActivity源碼文件中即可(別忘了把最低API Level調到11):

package com.example.testapp;

import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;

public class MainActivity extends Activity {
	private ImageView img;

	//因爲ImageView沒有合適的setWidth和getWidth,所以創建一個類來幫忙實現這兩個方法
	class ImageWrapper {
		private View view;

		ImageWrapper(View view) {
			this.view = view;
		}

		// 人爲的給ImageView類加上可用的setWidthh()方法
		public void setWidth(int width) {
			this.view.getLayoutParams().width = width;
			this.view.requestLayout();
		}

		// 人爲的給ImageView類加上可用的getWidthh()方法
		public int getWidth() {
			return this.view.getLayoutParams().width;
		}
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		img = (ImageView) findViewById(R.id.img);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	public void performAnimation(View view) {
		ImageWrapper imgwrp = new ImageWrapper(img);
		// ofInt中的 "width" 就是要變化的屬性,
		// imgwrp這個對象一定要有 setWidth()和getWitdh()方法纔可以哦
		ObjectAnimator.ofInt(imgwrp, "width", 120).setDuration(5000).start();
	}

}



這段代碼可以直接複製粘貼,編譯運行都應該沒有問題。

代碼中啓動動畫的部分就是

ObjectAnimator.ofInt(imgwrp, "width", 120).setDuration(5000).start();
這一句代碼。


其中的"width"就是我們的動畫對象要改變的屬性。但是千萬要注意這個動畫對象是否具有getWidth(...)和setWidth(...)方法,如果有了這些方法,還要注意他們的作用是否就是我們想要實現的那種效果。類似的,如果你要改變屬性值"x",那麼動畫對象就應該具有getX(...)和getY(...)方法。

也就是說,你想改變哪個名字叫XXX的屬性,那麼你要動畫的對象就應該具有setXXX()方法和getXXX方法。



可以看看這位前輩的博文,相信看完高手的講解,你能更加了解屬性動畫:




如果轉載請註明出處:http://blog.csdn.net/gophers/article/details/25918319




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章