天天看點

Android 屬性動畫(三)使用類型評估程式--TypeEvaluate一、評估程式簡介二、如何自定義類型評估程式

一、評估程式簡介

    在 Android 屬性動畫(一)新手入門 中就已經介紹了屬性動畫的類型評估程式(TypeEvaluator)是用于定義在動畫中如何計算添加了動畫效果的屬性的值,即屬性值跟時間之間的關系(随着時間如何變化)。插值器會接收來自 Animator 的已播放時間分數,插值器會根據已播放時間分數計算出插值分數,評估程式根據這個插值分數計算出屬目前性值。Android系統已經定義了可識别類型的評估程式,分别是

IntEvaluator

FloatEvaluator

ArgbEvaluator

,分别對應

int

float

顔色(argb)

類型資料。如果需要添加動畫效果的屬性類型不是這些,那麼就需要自定義類型評估程式,計算屬性值了。

二、如何自定義類型評估程式

    自定義類型評估程式,隻需要實作

TypeEvaluator

接口,這個接口類中隻有

evaluate()

一個方法需要實作。在此方法中實作如何計算動畫在目前點的屬性值,并将值傳回。下面是

FloatEvaluator

類實作的代碼:

  • FloatEvaluator

public class FloatEvaluator implements TypeEvaluator<Number> {
    public Float evaluate(float fraction, Number startValue, Number endValue) {
        float startFloat = startValue.floatValue();
        return startFloat + fraction * (endValue.floatValue() - startFloat);
    }
}
           
說明:當

ValueAnimator

(或

ObjectAnimator

)運作時,它會計算動畫目前的已完成動畫分數(一個介于 0 和 1 之間的值),目前的插值器會根據這個動畫分數計算出一個插值分數,類型評估程式(

TypeEvaluator

)通過

fraction

參數接收這個插值分數,根據這個插值分數計算出屬性的目前值。

    在前面文章的示例中,對一個視圖同時進行X、Y縮放的時候,如果X、Y縮放比例不一緻,使用

FloatEvaluator

就無法直接實作了,隻能通過

AnimatorSet

來實作。如果自定義

TypeEvaluator

,再結合

ValueAnimator

可以不通過

AnimatorSet

就實作同時對視圖X、Y實作不同比例的縮放。

  • 定義評估程式

    XYEvaluator

class XYEvaluate : TypeEvaluator<PointF> {
    override fun evaluate(fraction: Float, startValue: PointF, endValue: PointF): PointF {
        val x = startValue.x + fraction * (endValue.x  - startValue.x)
        val y = startValue.y + fraction * (endValue.y - startValue.y)
        return PointF(x, y)
    }
}
           
  • 在動畫中使用自定義的評估程式
ValueAnimator.ofObject(XYEvaluate(), PointF(1.0f, 1.0f), PointF(1.5f, 2.0f)).apply {
    duration = 1000
    repeatMode = ValueAnimator.REVERSE
    repeatCount = ValueAnimator.INFINITE
    addUpdateListener {
        val value = it.animatedValue as PointF
        imageView.scaleX = value.x
        imageView.scaleY = value.y
    }
    start()
}
           
  • 效果
    Android 屬性動畫(三)使用類型評估程式--TypeEvaluate一、評估程式簡介二、如何自定義類型評估程式
注意事項:如果自定義的評估程式使用了不是屬性值的類型或者同時需要修改多個屬性值,那麼 Animator 就無法自動更新屬性值(即使是用

ObjectAnimator

),是以自定義評估程式一般都會結合

ValueAnimator

使用,然後在

ValueAnimator.AnimatorUpdateListener

監聽中更新屬性值。

上一篇:Android 屬性動畫(二)為視圖狀态更改添加動畫效果

下一篇:Android 屬性動畫(四)使用動畫插值器