TypeEvaluator

本文详细介绍了Android中属性动画Evaluator的使用方法,包括系统内置的Evaluator如IntEvaluator、FloatEvaluator及ArgbEvaluator,并展示了如何自定义Evaluator实现平抛效果、二阶及三阶贝塞尔曲线效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、系统内置的Evaluator:

IntEvaluator

public class IntEvaluator implements TypeEvaluator<Integer> {

    public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
        int startInt = startValue;
        return (int)(startInt + fraction * (endValue - startInt));
    }
}

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);
    }
}

ArgbEvaluator

public class ArgbEvaluator implements TypeEvaluator {
    private static final ArgbEvaluator sInstance = new ArgbEvaluator();

    public static ArgbEvaluator getInstance() {
        return sInstance;
    }

    public Object evaluate(float fraction, Object startValue, Object endValue) {
        int startInt = (Integer) startValue;
        int startA = (startInt >> 24) & 0xff;
        int startR = (startInt >> 16) & 0xff;
        int startG = (startInt >> 8) & 0xff;
        int startB = startInt & 0xff;

        int endInt = (Integer) endValue;
        int endA = (endInt >> 24) & 0xff;
        int endR = (endInt >> 16) & 0xff;
        int endG = (endInt >> 8) & 0xff;
        int endB = endInt & 0xff;

        return (int)((startA + (int)(fraction * (endA - startA))) << 24) |
                (int)((startR + (int)(fraction * (endR - startR))) << 16) |
                (int)((startG + (int)(fraction * (endG - startG))) << 8) |
                (int)((startB + (int)(fraction * (endB - startB))));
    }
}

二、自定义Evaluator

平抛:

public class HorizontalThrowEvaluator implements TypeEvaluator<PointF> {

    /**
     * 计算曲线的值
     *
     * @param fraction   :进度
     * @param startValue :起点
     * @param endValue   :终点
     * @return :曲线位置的值
     */
    @Override
    public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
        PointF point = new PointF();//结果

        //水平:s=vt
        point.x = 300 * fraction;
        //竖直:g*t*t/2
        point.y = 10 * fraction * fraction / 2;

        return point;
    }
}

平抛示意图:

这里写图片描述

二阶贝塞尔曲线:


public class Bezier2Evaluator implements TypeEvaluator<PointF> {

    private PointF pointFCtrl;//控制点

    public Bezier2Evaluator(PointF pointFCtrl1) {
        this.pointFCtrl = pointFCtrl1;
    }

    /**
     * 计算曲线的值
     *
     * @param fraction   :进度
     * @param startValue :起点
     * @param endValue   :终点
     * @return :曲线位置的值
     */
    @Override
    public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
        float timeLeft = 1.0f - fraction;
        PointF point = new PointF();//结果

        point.x = timeLeft * timeLeft * (startValue.x)
                + 2 * timeLeft * fraction * (pointFCtrl.x)
                + fraction * fraction * (endValue.x);

        point.y = timeLeft * timeLeft * (startValue.y)
                + 2 * timeLeft * fraction * (pointFCtrl.y)
                + fraction * fraction * (endValue.y);

        return point;
    }
}

二次方公式:

这里写图片描述

三阶贝塞尔曲线:

public class Bezier3Evaluator implements TypeEvaluator<PointF> {

    private PointF pointFCtrl1;//控制点一
    private PointF pointFCtrl2;//控制点二

    public Bezier3Evaluator(PointF pointFCtrl1, PointF pointFCtrl2) {
        this.pointFCtrl1 = pointFCtrl1;
        this.pointFCtrl2 = pointFCtrl2;
    }

    /**
     * 计算曲线的值
     *
     * @param fraction   :进度
     * @param startValue :起点
     * @param endValue   :终点
     * @return :曲线位置的值
     */
    @Override
    public PointF evaluate(float fraction, PointF startValue, PointF endValue) {
        float timeLeft = 1.0f - fraction;
        PointF point = new PointF();//结果

        point.x = timeLeft * timeLeft * timeLeft * (startValue.x)
                + 3 * timeLeft * timeLeft * fraction * (pointFCtrl1.x)
                + 3 * timeLeft * fraction * fraction * (pointFCtrl2.x)
                + fraction * fraction * fraction * (endValue.x);

        point.y = timeLeft * timeLeft * timeLeft * (startValue.y)
                + 3 * timeLeft * timeLeft * fraction * (pointFCtrl1.y)
                + 3 * timeLeft * fraction * fraction * (pointFCtrl2.y)
                + fraction * fraction * fraction * (endValue.y);

        return point;
    }
}

三次方公式:

这里写图片描述

在 Android 中,TypeEvaluator 是一个接口,用于计算从起始值到结束值之间的属性值的中间值。它主要用于在属性动画中计算属性值的中间值。当你使用属性动画来改变一个对象的属性时,你可以使用 TypeEvaluator 通过计算从起始值到结束值之间的属性值的中间值来控制属性值的变化。 TypeEvaluator 接口只有一个方法 `evaluate(float fraction, Object startValue, Object endValue)`。这个方法将计算出在起始值和结束值之间的属性值的中间值,并以 Object 的形式返回。在这个方法中,fraction 表示动画进行到的百分比,startValue 表示起始值,endValue 表示结束值。具体的计算方式由实现 TypeEvaluator 接口的类来决定。 例如,如果你想通过属性动画来改变一个 View 的背景颜色,你可以创建一个 ArgbEvaluator 对象作为 TypeEvaluator,并将它传递给 ValueAnimator 对象。ArgbEvaluator 将根据起始颜色值和结束颜色值计算出属性值的中间值,然后在动画过程中逐步改变 View 的背景颜色。 ```java ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), startColor, endColor); colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { view.setBackgroundColor((int) animator.getAnimatedValue()); } }); colorAnimation.setDuration(2000); colorAnimation.start(); ``` 总之,TypeEvaluator 接口提供了一个灵活的方式来控制属性值的变化,并且能够满足不同属性值的计算需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值