屬性動畫學習使用總結

Android 屬性動畫總結

  Android屬性動畫是我們自定義View不可缺少的一部分知識,我們日常使用的補間動畫都可以被屬性動畫來代替。下面是自己在鞏學習屬性動畫時總結的的一些知識,由淺入深,在我們以後的開發中做出各種炫酷的動畫效果。

屬性動畫的優點

屬性動畫不在侷限視圖View對象,我們不僅能實現補間動畫的效果,還能自定義各種各樣的動畫效果。

屬性動畫的使用步驟

  1. 實例化屬性動畫對象
  2. 設置屬性動畫的時長
  3. 啓動屬性動畫

下面我將詳細介紹簡單的屬性動畫的使用方法。方便我們更好的理解和使用。

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效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章