TypeEvaluator

一、系统内置的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;
    }
}

三次方公式:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值