屬性動畫學習使用總結
Android 屬性動畫總結
Android屬性動畫是我們自定義View不可缺少的一部分知識,我們日常使用的補間動畫都可以被屬性動畫來代替。下面是自己在鞏學習屬性動畫時總結的的一些知識,由淺入深,在我們以後的開發中做出各種炫酷的動畫效果。
屬性動畫的優點
屬性動畫不在侷限檢視View物件,我們不僅能實現補間動畫的效果,還能自定義各種各樣的動畫效果。
屬性動畫的使用步驟
- 例項化屬性動畫物件
- 設定屬性動畫的時長
- 啟動屬性動畫
下面我將詳細介紹簡單的屬性動畫的使用方法。方便我們更好的理解和使用。
1.例項化屬性動畫物件
屬性動畫的執行機制是通過不斷地對值進行操作來實現的,而初始值和結束值之間的動畫過渡就是由ValueAnimator這個類來負責計算的。它的內部使用一種時間迴圈的機制來計算值與值之間的動畫過渡,我們只需要將初始值和結束值提供給ValueAnimator,並且告訴它動畫所需執行的時長,那麼ValueAnimator就會自動幫我們完成從初始值平滑地過渡到結束值這樣的效果。除此之外,ValueAnimator還負責管理動畫的播放次數、播放模式、以及對動畫設定監聽器等。
ValueAnimator類
通過不斷控制 值 的變化,再不斷 手動 賦給物件的屬性,從而實現動畫效果。主要有下面三個方法。 1.ValueAnimator.ofInt()以整型數值過渡。 2.ValueAnimator.oFloat() 以浮點型數值過渡。 3.ValueAnimator.ofObject()以物件的形式過渡。 ValueAnimator使用主要有以下兩種用法。
用途
1. 實現補間動畫的效果
// 傳入的引數解釋 //設定的物件 //補間動畫的類別 //變化的值 ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f); ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f); ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f); ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360); ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400); ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "tranlsationY", 100, 750);
2.實現屬性值的變化
// 步驟1:設定動畫屬性的初始值 & 結束值 ValueAnimator anim = ValueAnimator.ofInt(0, 3); // 1. 建立動畫例項 // 2. 將傳入的多個Int引數將值從0平滑過渡到1 // 如果傳入了3個Int引數 a,b,c ,則是先從a平滑過渡到b,再從b平滑過渡到C,以此類推 // 步驟2:設定動畫的播放各種屬性 anim.setDuration(2000); // 設定動畫執行的時長 anim.setStartDelay(200); // 設定動畫延遲播放時間 anim.setRepeatCount(0); // 設定動畫重複播放次數 = 重放次數+1 // 動畫播放次數 = -1時,動畫無限重複 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(); // 獲得改變後的值 // 步驟4:將改變後的值賦給物件的屬性值 View.setproperty(currentValue); // 步驟5:重新整理檢視,即重新繪製,從而實現動畫效果 View.requestLayout(); } }); anim.start(); // 啟動動畫 }
ValueAnimator.ofloat()使用方法和上面基本相同,就不在詳細介紹。
在介紹ValueAnimator.ofObeject()之前要先介紹插值器和估值器。在使用ofObeject()要涉及到自定義估值器。
Interpolator的概念其實我們並不陌生,在補間動畫中我們就使用到了。他就是用來控制動畫快慢節奏的;而在屬性動畫中,TimeInterpolator 也是類似的作用;TimeInterpolator 繼承自Interpolator。我們可以繼承TimerInterpolator 以自己的方式控制動畫變化的節奏,也可以使用Android 系統提供的Interpolator。
估值器(TypeEvaluator)決定 值 的具體變化數值
自定義估值器
TypeEvaluator是個介面,我們只要實現這個介面,並在我們的屬性動畫中設定就可以。
// 實現貝塞爾曲線的估值器,返回曲線上每一點的座標 傳入的引數為當前百分比 0-1 起始點的座標 結束點的座標 public class LoveEvaluator implements TypeEvaluator<PointF> { private PointF p1,p2; public LoveEvaluator(PointF p1,PointF p2){ this.p1 = p1; this.p2 = p2; } @Override public PointF evaluate(float v, PointF p0, PointF p3) { PointF pointF1 = new PointF(); pointF1.x = p0.x * (1-v)*(1-v)*(1-v) + 3*p1.x*v*(1-v)*(1-v) +3*p2.x*v*v*(1-v) +p3.x *v*v*v; pointF1.y = p0.y * (1-v)*(1-v)*(1-v) + 3*p1.y*v*(1-v)*(1-v) +3*p2.y*v*v*(1-v) +p3.y *v*v*v; return pointF1; } }
為屬性動畫設定估值器
LoveEvaluator loveEvaluator = new LoveEvaluator(p1,p2); ValueAnimator bezierAnimator = ObjectAnimator.ofObject(loveEvaluator,p0,p3); bezierAnimator.setDuration(10000); bezierAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { PointF pointF = (PointF) valueAnimator.getAnimatedValue(); // 不斷改變檢視的位置 iv.setX(pointF.x); iv.setY(pointF.y); } });
這樣控制元件的運動軌跡就是按我們自定義的軌跡運動。
屬性動畫在自定義View中經常用到,我們可以多加練習,配合屬性動畫做出各種炫酷的UI效果。