1. 程式人生 > >android動畫二·動畫之間的關係

android動畫二·動畫之間的關係


動畫—屬性動畫

ValueAnimator

ValueAnimator是整個屬性動畫機制當中最核心的一個類,實際開發中不常用,ValueAnimator中ofFloat(),ofInt(),ofObject()這三個方法常用

  • ValueAnimator只是對值進行了一個平滑的動畫過渡
		ValueAnimator anim = ValueAnimator.ofFloat(0f, 20f);
		anim.setDuration(1000);  
		anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener
() { @Override public void onAnimationUpdate(ValueAnimator animation) { float currentValue = (float) animation.getAnimatedValue(); } }); anim.start(); ValueAnimator anim = ValueAnimator.ofInt(0, 10); anim.setDuration(1000); anim.start();

ObjectAnimator

不過雖說ObjectAnimator會更加常用一些,但是它其實是繼承自ValueAnimator的,底層的動畫實現機制也是基於ValueAnimator來完成的,因此ValueAnimator仍然是整個屬性動畫當中最核心的一個類。

  • ObjectAnimator對任意物件的任意屬性進行動畫的操作,“translationX”、“scaleY”、“alpha”、“rotation”
		float curTranslationX = textview.getTranslationX();  
		ObjectAnimator animator = ObjectAnimator.
ofFloat(textview, "translationX", curTranslationX, -300f, curTranslationX); animator.setDuration(5000); animator.start();

View當中一定也存在著setRotation()、getRotation()、setTranslationX()、getTranslationX()、setScaleY()、getScaleY()這些方法

  • AnimatorSet組合動畫

AnimatorSet.Builder中包括以下四個方法:
after(Animator anim) 將現有動畫插入到傳入的動畫之後執行
after(long delay) 將現有動畫延遲指定毫秒後執行
before(Animator anim) 將現有動畫插入到傳入的動畫之前執行
with(Animator anim) 將現有動畫和傳入的動畫同時執行

		ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
		ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
		ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
		AnimatorSet animSet = new AnimatorSet();  
		animSet.play(rotate).with(fadeInOut).after(moveIn);  
		animSet.setDuration(5000);  
		animSet.start();
  • Animator監聽器

ObjectAnimator是繼承自ValueAnimator的,而ValueAnimator又是繼承自Animator的,因此不管是ValueAnimator還是ObjectAnimator都是可以使用addListener()這個方法的。另外AnimatorSet也是繼承自Animator的,因此addListener()這個方法算是個通用的方法。

		anim.addListener(new AnimatorListener() {  
		    @Override  
		    public void onAnimationStart(Animator animation) {  
		    }  
		  
		    @Override  
		    public void onAnimationRepeat(Animator animation) {  
		    }  
		  
		    @Override  
		    public void onAnimationEnd(Animator animation) {  
		    }  
		  
		    @Override  
		    public void onAnimationCancel(Animator animation) {  
		    }  
		});  

為了方便,android提供了一個適配類,叫AnimatorListenerAdapter,使用這個類可以解決實現介面繁瑣問題。

		anim.addListener(new AnimatorListenerAdapter() {  
		    @Override  
		    public void onAnimationEnd(Animator animation) {  
		    }  
		});  

使用XML編寫動畫

通過XML來編寫動畫可能會比通過程式碼來編寫動畫要慢一些,但是在重用方面將會變得非常輕鬆,比如某個將通用的動畫編寫到XML裡面,我們就可以在各個介面當中輕鬆去重用它。

  • 如果想要使用XML來編寫動畫,首先要在res目錄下面新建一個animator資料夾,所有屬性動畫的XML檔案都應該存放在這個資料夾當中。然後在XML檔案中我們一共可以使用如下三種標籤:

    • 對應程式碼中的ValueAnimator
    • 對應程式碼中的ObjectAnimator
    • 對應程式碼中的AnimatorSet

講一個檢視從0過渡到100,就可以這樣寫:

	<animator xmlns:android="http://schemas.android.com/apk/res/android"  
	    android:valueFrom="0"  
	    android:valueTo="100"  
	    android:valueType="intType"/>  					

將一個檢視的alpha屬性從1變成0,就可以這樣寫:

	<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
	    android:valueFrom="1"  
	    android:valueTo="0"  
	    android:valueType="floatType"  
	    android:propertyName="alpha"/>   

將一個檢視先從螢幕外移動進螢幕,然後開始旋轉360度,旋轉的同時進行淡入淡出操作,就可以這樣寫:

	<set xmlns:android="http://schemas.android.com/apk/res/android"  
	    android:ordering="sequentially" >  
	  
	    <objectAnimator  
	        android:duration="2000"  
	        android:propertyName="translationX"  
	        android:valueFrom="-500"  
	        android:valueTo="0"  
	        android:valueType="floatType" >  
	    </objectAnimator>  
	  
	    <set android:ordering="together" >  
	        <objectAnimator  
	            android:duration="3000"  
	            android:propertyName="rotation"  
	            android:valueFrom="0"  
	            android:valueTo="360"  
	            android:valueType="floatType" >  
	        </objectAnimator>  
	  
	        <set android:ordering="sequentially" >  
	            <objectAnimator  
	                android:duration="1500"  
	                android:propertyName="alpha"  
	                android:valueFrom="1"  
	                android:valueTo="0"  
	                android:valueType="floatType" >  
	            </objectAnimator>  
	            <objectAnimator  
	                android:duration="1500"  
	                android:propertyName="alpha"  
	                android:valueFrom="0"  
	                android:valueTo="1"  
	                android:valueType="floatType" >  
	            </objectAnimator>  
	        </set>  
	    </set>  
	  
	</set>  

最後XML檔案是編寫好了,在程式碼中把檔案載入動畫只需呼叫如下程式碼即可:

	Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
	animator.setTarget(view);  
	animator.start();  

參考:[http://blog.csdn.net/guolin_blog/article/details/43536355]