屬性動畫:ValueAnimator類和ObjectAnimator類的簡單使用
阿新 • • 發佈:2018-12-12
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)
詳細細節可參考: