1. 程式人生 > >屬性動畫:ValueAnimator類和ObjectAnimator類的簡單使用

屬性動畫:ValueAnimator類和ObjectAnimator類的簡單使用

ValueAnimator類: 

ValueAnimator anim = ValueAnimator.ofInt(0, 3);
        // ofInt()作用有兩個
        // 1. 建立動畫例項
        // 2. 將傳入的多個Int引數進行平滑過渡:此處傳入0和1,表示將值從0平滑過渡到1
        // 如果傳入了3個Int引數 a,b,c ,則是先從a平滑過渡到b,再從b平滑過渡到C,以此類推
        // ValueAnimator.ofInt()內建了整型估值器,直接採用預設的.不需要設定,即預設設定瞭如何從初始值 過渡到 結束值
        // 關於自定義插值器我將在下節進行講解
        // 下面看看ofInt()的原始碼分析 ->>關注1

// 步驟2:設定動畫的播放各種屬性
        anim.setDuration(500);
        // 設定動畫執行的時長

        anim.setStartDelay(500);
        // 設定動畫延遲播放時間

        anim.setRepeatCount(0);
        // 設定動畫重複播放次數 = 重放次數+1
        // 動畫播放次數 = infinite時,動畫無限重複//ValueAnimator.INFINITE

        anim.setRepeatMode(ValueAnimator.RESTART);
        // 設定重複播放動畫模式
        // ValueAnimator.RESTART(預設):正序重放
        // ValueAnimator.REVERSE:倒序回放

// 步驟3:將改變的值手動賦值給物件的屬性值:通過動畫的更新監聽器
        // 設定 值的更新監聽器
        // 即:值每次改變、變化一次,該方法就會被呼叫一次
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {

                int currentValue = (Integer) animation.getAnimatedValue();
                // 獲得改變後的值

                System.out.println(currentValue);
                // 輸出改變後的值

        // 步驟4:將改變後的值賦給物件的屬性值,如設定view物件的長寬,間距,旋轉等
                View.setproperty(currentValue);

       // 步驟5:重新整理檢視,即重新繪製,從而實現動畫效果
                View.requestLayout();


            }
        });

        anim.start();
        // 啟動動畫

也可以在xml定義屬性動畫,這樣可在各個介面重用

  • 步驟1:在路徑 res/animator的資料夾裡建立相應的動畫 .xml檔案

    此處設定為res/animator/set_animation.xml

  • 步驟2:設定動畫引數

    // ValueAnimator採用<animator>  標籤
    <animator xmlns:android="http://schemas.android.com/apk/res/android"  
        android:valueFrom="0"   // 初始值
        android:valueTo="100"  // 結束值
        android:valueType="intType" // 變化值型別 :floatType & intType
    
        android:duration="3000" // 動畫持續時間(ms),必須設定,動畫才有效果
        android:startOffset ="1000" // 動畫延遲開始時間(ms)
        android:fillBefore = “true” // 動畫播放完後,檢視是否會停留在動畫開始的狀態,預設為true
        android:fillAfter = “false” // 動畫播放完後,檢視是否會停留在動畫結束的狀態,優先於fillBefore值,預設為false
        android:fillEnabled= “true” // 是否應用fillBefore值,對fillAfter值無影響,預設為true
        android:repeatMode= “restart” // 選擇重複播放動畫模式,restart代表正序重放,reverse代表倒序回放,預設為restart|
        android:repeatCount = “0” // 重放次數(所以動畫的播放次數=重放次數+1),為infinite時無限重複
        android:interpolator = @[package:]anim/interpolator_resource // 插值器,即影響動畫的播放速度,下面會詳細講
    
    /> 
    
    ---------------------
    
    本文來自 Carson_Ho 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/carson_ho/article/details/72909894?utm_source=copy 
  • 步驟3:在Java程式碼中啟動動畫
    Animator animator = AnimatorInflater.loadAnimator(context, R.animator.set_animation);  
    // 載入XML動畫
    
    animator.setTarget(view);  
    // 設定動畫物件
    
    animator.start();  
    // 啟動動畫
    
    ---------------------
    
    本文來自 Carson_Ho 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/carson_ho/article/details/72909894?utm_source=copy 

    ObjectAnimator類

  • ObjectAnimator類繼承自ValueAnimator類,後者的方法,前者都可以使用
    ObjectAnimator animator = ObjectAnimator.ofFloat(tv,"alpha",1,0,1);  
    animator.setDuration(2000);  
    animator.start(); 

    使用demo如上,第二個引數alpha為要改變的view的引數

  • ObjectAnimator 做動畫,並不是根據控制元件 xml 中的屬性來改變的,而是通過指定屬性所對應的 set 方法來改變的。比如,我們上面指定的改變 rotation 的屬性值,ObjectAnimator 在做動畫時就會到指定控制元件(TextView)中去找對應的 setRotation()方法來改變控制元件中對應的值。同樣的道理,當我們在最開始的示例程式碼中,指定改變”alpha”屬性值的時候,ObjectAnimator 也會到 TextView 中去找對應的 setAlpha()方法。那 TextView 中都有這些方法嗎,有的,這些方法都是從 View 中繼承過來的,在 View 中有關動畫,總共有下面幾組 set 方法:

    //1、透明度:alpha  
    public void setAlpha(float alpha)  
    
    //2、旋轉度數:rotation、rotationX、rotationY  
    public void setRotation(float rotation)  
    public void setRotationX(float rotationX)  
    public void setRotationY(float rotationY)  
    
    //3、平移:translationX、translationY  
    public void setTranslationX(float translationX)   
    public void setTranslationY(float translationY)  
    
    //縮放:scaleX、scaleY  
    public void setScaleX(float scaleX)  
    public void setScaleY(float scaleY) 

詳細細節可參考: