Android 属性动画(三)使用类型评估程序--TypeEvaluate

一、评估程序简介

    在 Android 属性动画(一)新手入门 中就已经介绍了属性动画的类型评估程序(TypeEvaluator)是用于定义在动画中如何计算添加了动画效果的属性的值,即属性值跟时间之间的关系(随着时间如何变化)。插值器会接收来自 Animator 的已播放时间分数,插值器会根据已播放时间分数计算出插值分数,评估程序根据这个插值分数计算出属当前性值。Android系统已经定义了可识别类型的评估程序,分别是 IntEvaluatorFloatEvaluatorArgbEvaluator,分别对应 intfloat颜色(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()
}
  • 效果
    自定义评估程序实现动画

注意事项:如果自定义的评估程序使用了不是属性值的类型或者同时需要修改多个属性值,那么 Animator 就无法自动更新属性值(即使是用 ObjectAnimator),所以自定义评估程序一般都会结合 ValueAnimator 使用,然后在 ValueAnimator.AnimatorUpdateListener 监听中更新属性值。


上一篇:Android 属性动画(二)为视图状态更改添加动画效果
下一篇:Android 属性动画(四)使用动画插值器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值