1. 程式人生 > >Android學習之動畫總結(二)

Android學習之動畫總結(二)

寫在前面:本文是根據hencoder提供的教程寫的總結。HenCoder https://hencoder.com。

     關於ObjectAnimator可以用ofInt()來做整數的屬性動畫和ofFloat()來做小數的屬性動畫。當需要對其他型別的屬性來做動畫就需要用到TypeEvaluator,例如顏色的變化的動畫,我們無法直接從整數或者浮點數來進行屬性動畫。

    TypeEvaluator

  自定義一個顏色的TypeEvaluator:使用方式 ObjectAnimator animator = ObjectAnimator.ofInt(view,"color",0xff00ff00);

animator.setEvaluator(new HsvEvaluator());

import android.graphics.Color;

public class HsvEvaluator implements TypeEvaluator<Integer> {
    float[] startHsv = new float[3];
    float[] endHsv = new float[3];
    float[] outHsv = new float[3];

    @Override
    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        //convert ARGB to HSV
        Color.colorToHSV(startValue,startHsv);
        Color.colorToHSV(endValue,endHsv);

        //compute the color value of the current fraction
        if (endHsv[0] - startHsv[0] > 180) {
            endHsv[0] -= 360;
        } else if (endHsv[0] - startHsv[0] < -180) {
            endHsv[0] += 360;
        }
        outHsv[0] = startHsv[0] + (endHsv[0] - startHsv[0]) * fraction;
        if (outHsv[0] > 360) {
            outHsv[0] -= 360;
        } else if (outHsv[0] < 0) {
            outHsv[0] += 360;
        }
        outHsv[1] = startHsv[1] + (endHsv[1] - startHsv[1]) * fraction;
        outHsv[2] = startHsv[2] + (endHsv[2] - startHsv[2]) * fraction;

        // 計算當前動畫完成度(fraction)所對應的透明度
        int alpha = startValue >> 24 + (int) ((endValue >> 24 - startValue >> 24) * fraction);

        // 把 HSV 轉換回 ARGB 返回
        return Color.HSVToColor(alpha, outHsv);
    }
}

ofObject()

藉助TypeEvaluator,屬性動畫就可以通過ofObject()來對不限定型別的屬性做動畫了。方式很簡單:

1⃣️將目標屬性寫一個自定義的TypeEvaluator。2⃣️使用ofObject()來建立Animator,並把自定義的TyoeEvaluator作為引數填入。例如:ObjectAnimator animator = ObjectAnimator.ofObject(view,"position",new PointFEvaluator(),new PointF(0,0),new PointF(1,1)); animator.start();新api還有ofMultiInt() ofMultiFloat()。3⃣️當需要同時對多個屬性進行動畫時,ViewPropertyAnimator可以通過View.animate().scaleX().scaleY().start();來實現。對於ObjectAnimator,不能這麼用。但是可以通過PropertyValuesHolder

來實現。例子:PropertyValuesHolder h1 = PropertyValuesHolder.ofFloat("scaleX",1);PropertyValuesHolder h2 = PropertyValuesHolder.ofFloat("scaleY",1);

ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(view,h1,h2,...);animator.start();4⃣️當需要執行一個動畫後執行另外一個動畫時,就要用AnimatorSet來實現。animatorSet.playTogether(animator1,animator2);animatorSet.start();5⃣️Keyframe動畫,類似於css3裡面的keyframe,我們可以通過Keyframe類來指定動畫完成時間維度上view的屬性值,比如,0%時候值為1 ,85%值為100,然後100%值為80;可以通過三個keyframe來例項化一個PropertyValueHolder,然後通過ObjectAnimator來執行動畫。

ValueAnimator 是ObjectAnimator的父類,ObjectAnimator是自動呼叫目標物件的setter方法來更新目標的屬性值,但是ValuelAnimator只是幫你改變一個獨立的資料,至於資料更新後要做什麼需要自己來實現。總的來說ViewPropertyAnimator是最簡單的。三者都是通過改變目標View的屬性值來完成動畫。