屬性動畫(Property Animation),propertyanimation

來源:互聯網
上載者:User

屬性動畫(Property Animation),propertyanimation

轉載請註明出處:http://blog.csdn.net/ZhouLi_CSDN/article/details/45968639

概述

andorid系統提供了兩種動畫系統,屬性動畫和視圖動畫。屬性動畫更靈活並且功能也更強。此外,android還提供了幀動畫(drawable animation).

2D和3D圖形 屬性動畫 屬性動畫特點
  • Duration:可以指定時間長度,預設為300ms。
  • Time interpolation:屬性的計算方式,如先快後慢
  • Repeat count and behavior:重複次數與方式,如1次,3次或者迴圈或者播完在反向回放。
  • Repeat count and behavior:指定多個動畫。可以一起播放或者順序播放或者指定的延遲時間。
  • Frame refresh delay:多長時間重新整理一次,預設為10ms,最終重新整理時間受系統負載程度和硬體效能的影響。
屬性動畫如何工作

(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;

最後根據TypeEvaluator計算出在10ms時的屬性值:0.15*(40-0)=6pixel。上例中TypeEvaluator為FloatEvaluator,計算方法為 :

public Float evaluate(float fraction, Number startValue, Number endValue) {
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}

屬性動畫與視圖動畫區別 應用屬性動畫有兩個步驟:
  • 計算機(Evaluators):根據屬性的開始、結束值與TimeInterpolation計算出的因子計算出目前時間的屬性值。

  • 插值器:( TimeInterpolator)
  • ValueAnimator:

    通過ValueAnimator的ofInt(),ofFloat,ofObeact()方法獲得,
    需要實現監聽器更改要改變的對象的屬性值。

    ObjectAnimator

    初始化需要指定對象和對象的屬性以及值區間。
    有些改變需要調用invalidate()方法,重繪。可以在onAnimationUpdate()方法中做。

    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();
    Animation Listeners
    • Animator.AnimatorListener:
    • ValueAnimator.AnimatorUpdateListener:
    • AnimatorListenerAdapter:
    為viewGroup的layout改變設定動畫

    ViewGroup中的子項目可以通過setVisibility使其Visible、Invisible或Gone,當有子項目可見度改變時(VISIBLE、GONE),可以向其應用動畫,通過LayoutTransition類應用此類動畫:
    通過setAnimator應用動畫,第一個參數表示應用的情境,可以以下4種類型:

    • APPEARING: 當一個元素在其父元素中變為Visible時對這個元素應用動畫
    • CHANGE_APPEARING: 當一個元素在其父元素中變為Visible時,因系統要重新布局有一些元素需要移動,對這些要移動的元素應用動畫
    • DISAPPEARING: 當一個元素在其父元素中變為GONE時對其應用動畫
    • CHANGE_DISAPPEARING: 當一個元素在其父元素中變為GONE時,因系統要重新布局有一些元素需要移動,這些要移動的元素應用動畫.

    可以使用自訂動畫也可以使用預設的;預設可以在xml設定:

    <LinearLayout    android:orientation="vertical"    android:layout_width="wrap_content"    android:layout_height="match_parent"    android:id="@+id/verticalContainer"    android:animateLayoutChanges="true" />

    使用TypeEvalutor

    public class FloatEvaluator implements TypeEvaluator {    public Object evaluate(float fraction, Object startValue, Object endValue) {        float startFloat = ((Number) startValue).floatValue();        return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);    }}
    KeyFrams:

    keyFrame是一個 時間/值 對,通過它可以定義一個在特定時間的特定狀態,即主要畫面格,而且在兩個keyFrame之間可以定義不同的Interpolator,就好像多個動畫的拼接,第一個動畫的結束點是第二個動畫的開始點。KeyFrame是抽象類別,要通過ofInt(),ofFloat(),ofObject()獲得適當的KeyFrame,然後通過PropertyValuesHolder.ofKeyframe獲得PropertyValuesHolder對象,如以下例子:

    Keyframe kf0 = Keyframe.ofFloat(0f, 0f);Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);Keyframe kf2 = Keyframe.ofFloat(1f, 0f);PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)rotationAnim.setDuration(5000ms);
    Animation Views:

    在View Animation中,對View應用Animation並沒有改變View的屬性,動畫的實現是通過其Parent View實現的,在View被drawn時Parents View改變它的繪製參數,draw後再改變參數invalidate,這樣雖然View的大小或旋轉角度等改變了,但View的實際屬性沒變,所以有效地區還是應用動畫之前的地區,比如你把一按鈕放大兩倍,但還是放大這前的地區可以觸發點擊事件。為了改變這一點,在Android 3.0中給View增加了一些參數並對這些參數增加了相應的getter/setter函數(ObjectAnimator要用這些函數改變這些屬性):

    translationX,translationY: View相對於原始位置的位移量
    rotation,rotationX,rotationY: 旋轉,rotation用於2D旋轉角度,3D中用到後兩個
    scaleX,scaleY: 縮放比
    x,y: View的最終座標,是View的left,top位置加上translationX,translationY
    alpha: 透明度
    跟位置有關的參數有3個,以X座標為例,可以通過getLeft(),getX(),getTranslateX()獲得,若有一Button btn2,布局時其座標為(40,0):

    //應用動畫之前btn2.getLeft();    //40btn2.getX();    //40btn2.getTranslationX();    //0//應用translationX動畫ObjectAnimator oa=ObjectAnimator.ofFloat(btn2,"translationX", 200);oa.setDuration(2000);oa.start();/*應用translationX動畫後btn2.getLeft();    //40btn2.getX();    //240btn2.getTranslationX();    //200*///應用X動畫,假設沒有應用之前的translationX動畫ObjectAnimator oa=ObjectAnimator.ofFloat(btn2, "x", 200);oa.setDuration(2000);oa.start();/*應用X動畫後btn2.getLeft();    //40btn2.getX();    //200btn2.getTranslationX();    //160*/

    無論怎樣應用動畫,原來的布局時的位置通過getLeft()獲得,保持不變;
      X是View最終的位置;
      translationX為最終位置與布局時初始位置這差。
      所以若就用translationX即為在原來基礎上移動多少,X為最終多少
      getX()的值為getLeft()與getTranslationX()的和
      對於X動畫,原始碼是這樣的: 

    case X:       info.mTranslationX = value - mView.mLeft;       break;

    Property Animation也可以在XML中定義

    • - AnimatorSet
    • - ValueAnimator
    • - ObjectAnimator
      XML檔案應放大/res/animator/中,通過以下方式應用動畫:
    AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext, R.anim.property_animator);set.setTarget(myObject);set.start();
    ViewPropertyAnimator:

    如果需要對一個View的多個屬性進行動畫可以用ViewPropertyAnimator類,該類對多屬性動畫進行了最佳化,會合并一些invalidate()來減少重新整理視圖,該類在3.1中引入。

    以下三段代碼實現同樣的效果:

    • Multiple ObjectAnimator objects
    ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);AnimatorSet animSetXY = new AnimatorSet();animSetXY.playTogether(animX, animY);animSetXY.start();
    • One ObjectAnimator
    PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();
    • ViewPropertyAnimator
    myView.animate().x(50f).y(100f);
    在XMl中聲明animation

    在3.1以後,聲明屬性動畫必須在res/animator/路徑下。例如:

    <set android:ordering="sequentially">    <set>        <objectAnimator            android:propertyName="x"            android:duration="500"            android:valueTo="400"            android:valueType="intType"/>        <objectAnimator            android:propertyName="y"            android:duration="500"            android:valueTo="300"            android:valueType="intType"/>    </set>    <objectAnimator        android:propertyName="alpha"        android:duration="500"        android:valueTo="1f"/></set>

    運行:

    AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,    R.anim.property_animator);set.setTarget(myObject);set.start();

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.