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
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的屬性值來完成動畫。