Android动画之ValueAnimation中的ofObject

114 阅读1分钟

之前我们在ValueAnimation中使用了ofInt和ofFloat函数,但是如果要传入其他类型的数据,就需要使用到另一个函数ofObject()。它可以传入任何类型的参数。

比如,我们想实现如下的动画效果,文本框中的内容从A变化到Z。

ofObject.gif

我们使用ofObjecte可以如下编码

val valueAnimator:ValueAnimator = ValueAnimator.ofObject(MyCharEvaluator(),Character('A'),Character('Z'))
valueAnimator.setDuration(5000)
valueAnimator.addUpdateListener {
    val currentValue:Character = it.animatedValue as Character
    Log.d(TAG, "start: currentValue = ${currentValue}")
    textview.setText(currentValue.toString())
}
valueAnimator.start()

在以上的ofObject中,第一个参数是一个我们自定义的Evaluator,另外两个参数是初始值和结束值。

import android.animation.TypeEvaluator

/**
 * 项目名称 AndroidViewBook
 * 创建时间 2022/1/17 10:56 下午
 */
class MyCharEvaluator: TypeEvaluator<Character> {
    override fun evaluate(
        fraction: Float,
        startValue: Character?,
        endValue: Character?
    ): Character {
        val startInt:Int = startValue?.charValue()!!.toInt()
        val endInt:Int = endValue?.charValue()!!.toInt()
        val currentInt:Int = (startInt + fraction * (endInt - startInt)).toInt()
        val result = currentInt.toByte().toChar() as Character
        return result
    }
}

我们利用了字符与数字的转换。

参考资料《Android自定义控件开发与实战》