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

Android 屬性動畫(Property Animation)

編輯:關於Android編程

1. Property Animation

屬性動畫,這個是在Android 3.0中才引進的,以前學WPF時裡面的動畫機制好像就是這個,它更改的是對象的實際屬性,在View Animation(Tween Animation)中,其改變的是View的繪制效果,真正的View的屬性保持不變,比如無論你在對話中如何縮放Button的大小,Button的有效點擊區域還是沒有應用動畫時的區域,其位置與大小都不變。而在Property Animation中,改變的是對象的實際屬性,如Button的縮放,Button的位置與大小屬性值都改變了。而且Property Animation不止可以應用於View,還可以應用於任何對象。Property Animation只是表示一個值在一段時間內的改變,當值改變時要做什麼事情完全是你自己決定的。在Property Animation中,可以對動畫應用以下屬性:

  • Duration:動畫的持續時間
  • TimeInterpolation:屬性值的計算方式,如先快後慢
  • TypeEvaluator:根據屬性的開始、結束值與TimeInterpolation計算出的因子計算出當前時間的屬性值
  • Repeat Count and behavoir:重復次數與方式,如播放3次、5次、無限循環,可以此動畫一直重復,或播放完時再反向播放
  • Animation sets:動畫集合,即可以同時對一個對象應用幾個動畫,這些動畫可以同時播放也可以對不同動畫設置不同開始偏移
  • Frame refreash delay:多少時間刷新一次,即每隔多少時間計算一次屬性值,默認為10ms,最終刷新時間還受系統進程調度與硬件的影
 

2. Value Animator的工作方式

一、舉個例子

1、某個對象的X坐標在40ms內從0移動到40 pixel.按默認的10ms刷新一次,這個對象會移動4次,每次移動40/4=10pixel。

\

2、改變插值方式後,該對象的運動形式也隨之改變

\

上述例子的實現可以通關ValueAnimator來實現,現在有個印象即可

 

二、ValueAnimator工作流程圖

\

此圖是理解ValueAnimator的關鍵,現在不理解沒關系,還是大致看一下,按順序浏覽,有個印象即可,不過浏覽後續部分時需回來對照參考

  三、ValueAnimator介紹

ValueAnimator是Property Animation的執行類,ValueAnimator包含Property Animation動畫的所有核心功能,如動畫時間,開始、結束屬性值,相應時間屬性值計算方法等。上圖大致描述了ValueAnimator的工作流程,理解了就差不多對ValueAnimator了解了,當然後面會有具體介紹。

ValueAnimator的屬性介紹:

TimeIntepolator:時間插值

TypeEvaluator:綜合了時間插值、屬性開始值、屬性結束值計算出的屬性當前值

duration:動畫持續時間

startPropertyValue:屬性開始值

endPropertyValue:屬性結束值

start():動畫啟動方法

 

四、ValueAnimator實現步驟

一、計算當前的屬性值,ex.t = 5 ms時,x的值:

1、ValueAnimator根據動畫已進行的時間跟動畫總時間(duration)的比計算出一個時間因子(0~1),如上例中10ms時,計算時間因子t:即經過的時間百分比:t=10ms/40ms=0.25

2、然後根據TimeInterpolator計算出插值因子,上述例子中用了AccelerateDecelerateInterpolator,計算公式為(input即為時間因子):(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; 經插值計算(inteplator)後的插值因子:大約為0.15

3、最後TypeEvaluator通過這個因子計算出屬性值,計算方法為 :

1 2 3 4 publicFloatevaluate(floatfraction,NumberstartValue,NumberendValue){ floatstartFloat=startValue.floatValue(); returnstartFloat+fraction*(endValue.floatValue()-startFloat); }

參數分別為上一步的插值因子,開始值與結束值。最後根據TypeEvaluator計算出在10ms時的屬性值:0.15*(40-0)=6pixel。

二、根據屬性值執行相應的動作,如改變對象的某一屬性。(參照上圖理解) 1.通過注冊監聽器AnimatorUpdateListener,在onAnimationUpdate()回調方法中通過ValueAnimator.getAnimatedValue()方法獲取步驟一中的當前屬性值 2.將屬性值賦值給動畫對象   五、ValueAnimator代碼實現 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ValueAnimatorvalueAnimator=newValueAnimator(); valueAnimator.setDuration(3000); //設置動畫時間 valueAnimator.setObjectValues(newPointF(0,0)); //設置目標值 valueAnimator.setInterpolator(newLinearInterpolator()); //設置插值方式 valueAnimator.setEvaluator(newTypeEvaluator() //設置當前值得計算方式 { //fraction=t/duration @Override publicPointFevaluate(floatfraction,PointFstartValue, //設置當前屬性值得計算方式 PointFendValue) { Log.e(TAG,fraction*3+""); //x方向200px/s,則y方向0.5*10*t PointFpoint=newPointF(); point.x=200*fraction*3; point.y=0.5f*200*(fraction*3)*(fraction*3); returnpoint; } });   valueAnimator.addUpdateListener(newAnimatorUpdateListener() //設置監聽器,並在監聽器中給對象賦當前屬性值 { @Override publicvoidonAnimationUpdate(ValueAnimatoranimation) { PointFpoint=(PointF)animation.getAnimatedValue(); mBlueBall.setX(point.x); mBlueBall.setY(point.y);   } }); valueAnimator.start();

3. Object Animator的工作方式

如果理解了Value Animator後,Object Animator理解起來也不是太難。因為他們很相似,Value Animator分兩步執行,而Object Animator合二為一了,主要是省去了第二步,因為Object Animator已經在初始化時就指定了要改變的屬性值了,不多說,上代碼:

1 2 3 4 ObjectAnimator .ofFloat(view,"rotationX",0.0F,360.0F) .setDuration(500) .start();

對於Object Animator,有如下注意點:

1、提供了ofInt、ofFloat、ofObject,這幾個方法都是設置動畫作用的元素屬性。

2、動畫更新的過程中,會不斷調用setPropName更新元素的屬性,所有使用Object Animator更新某個屬性,必須得有getter(設置一個屬性值的時候)和setter方法~如果你操作對象的該屬性方法裡面,比如上例的setRotationX如果內部沒有調用view的重繪,則你需要自己按照下面方式手動調用。

1 2 3 4 5 6 7 8 9 anim.addUpdateListener(newAnimatorUpdateListener() { @Override publicvoidonAnimationUpdate(ValueAnimatoranimation) { view.postInvalidate(); view.invalidate(); } });

4. 動畫事件的監聽

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 ObjectAnimatoranim=ObjectAnimator.ofFloat(mBlueBall,"alpha",0.5f);   anim.addListener(newAnimatorListener() {   @Override publicvoidonAnimationStart(Animatoranimation) { Log.e(TAG,"onAnimationStart"); }   @Override publicvoidonAnimationRepeat(Animatoranimation) { //TODOAuto-generatedmethodstub Log.e(TAG,"onAnimationRepeat"); }   @Override publicvoidonAnimationEnd(Animatoranimation) { Log.e(TAG,"onAnimationEnd"); ViewGroupparent=(ViewGroup)mBlueBall.getParent(); if(parent!=null) parent.removeView(mBlueBall); }   @Override publicvoidonAnimationCancel(Animatoranimation) { //TODOAuto-generatedmethodstub Log.e(TAG,"onAnimationCancel"); } });   anim.addListener(newAnimatorListenerAdapter() { @Override publicvoidonAnimationEnd(Animatoranimation) { Log.e(TAG,"onAnimationEnd"); ViewGroupparent=(ViewGroup)mBlueBall.getParent(); if(parent!=null) parent.removeView(mBlueBall); } });   anim.start();

5. 動畫的組合Animator Set

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ObjectAnimatoranim1=ObjectAnimator.ofFloat(mBlueBall,"scaleX",1.0f,2f); ObjectAnimatoranim2=ObjectAnimator.ofFloat(mBlueBall,"scaleY",1.0f,2f); ObjectAnimatoranim3=ObjectAnimator.ofFloat(mBlueBall,"x",cx,0f); ObjectAnimatoranim4=ObjectAnimator.ofFloat(mBlueBall,"x",cx);   /** *anim1,anim2,anim3同時執行 *anim4接著執行 */ AnimatorSetanimSet=newAnimatorSet(); animSet.play(anim1).with(anim2); animSet.play(anim2).with(anim3); animSet.play(anim4).after(anim3); animSet.setDuration(1000); animSet.start();
 

6. ViewPropertyAnimator

不知道為了什麼,網上的教程,把這個東西放到了最後,但是這個可是超級好用的啊,搞不懂
  1. 這個類操作View對象的。
  2. 提供鏈式調用設置多個屬性動畫,這些動畫同時進行的。
  3. 更好的性能,多個屬性動畫是一次同時變化,只執行一次UI刷新。
  4. 每個屬性提供兩種類型方法設置。
  5. 這個類只能通過View的animate()獲取引用進行通話設置。
       imageView.animate()
          .setDuration(4000)
          .rotationY(45f)
          .translationX(imageView.getWidth())
          .alpha(0f);
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved