展开说说:Android动画之插值器和估值器

上一篇写了Android三种动画的使用,这里分析一下属性动画的两个属性插值器和估值器。

1、插值器

1.1 描述

TimeInterpolator、Interpolator、BaseInterpolator以及一些其他的XXInterpolator,一眼望去您认为谁是插值器的顶级父类,3、2、1,没错是TimeInterpolator,因此严格意义上来说他好像应该叫时间插值器。其实我的第一错觉Interpolator才是,下图可以看出来我真的错了。

时间插值器TimeInterpolator,根据时间消耗的百分比计算出当前属性改变的百分比,是以时间为维度的换算方式。

1.2 使用插值器

首先初始化一个插值器

TimeInterpolator mInterpolator = new BounceInterpolator();

然后调用Animator的setInterpolator方法

animSet.setInterpolator(getInterpolatorType(10));

齐活儿!

我上面用的animSet是AnimatorSet对象,因为属性动画Animator是个抽象类,有两个子类ValueAnimator、AnimatorSet,而TimeAnimator和ObjectAnimator是ValueAnimator的子类,我们一般都是在使用他们四个子孙类实现动画。

上面getInterpolatorType方法其实是封装了所有的时间插值器。

系统提供的时间插值器已基本够用,但也可以自定义。

/**
 * 不同插值器
 * @param type
 * @return
 */
public TimeInterpolator getInterpolatorType(int type) {
    switch (type) {
        case 1:
            mInterpolator = new BounceInterpolator();
            break;
        case 2:
            mInterpolator = new AccelerateDecelerateInterpolator();
            break;
        case 3:
            mInterpolator = new DecelerateInterpolator();
            break;
        case 4:
            mInterpolator = new AnticipateInterpolator();
            break;
        case 5:
            mInterpolator = new LinearInterpolator();
            break;
        case 6:
            mInterpolator =new LinearOutSlowInInterpolator();
            break;
        case 7:
            mInterpolator = new OvershootInterpolator();
        case 8:
            mInterpolator = new AccelerateInterpolator();
        case 9:
            mInterpolator = new AnticipateOvershootInterpolator();
        case 10:
            mInterpolator = new CycleInterpolator(1.0F);
        default:
            mInterpolator = new LinearInterpolator();
            break;
    }

    return mInterpolator;
}

2、估值器

估值器用来根据当前属性改变的百分比来得出改变后的属性值

 根TypeEvaluator接口 - 还有ArgbEvaluator 颜色估值器、 FloatEvaluator 浮点类型估值器、 FloatArrayEvaluator 浮点数组类型估值器、IntEvaluator整型类型估值器 、 IntArrayEvaluator 、 PointFEvaluator 、 ReactEvaluator,另外还有几个是在material包,比如MatrixEvaluator以及androidX.core包有几个是和androidjar里的是一样的比如也有ArgbEvaluator。

使用也是两步骤-以颜色估值器为例:

首先,使用ArgbEvaluator和自定义的色值初始化一个ObjectAnimator对象

animColor = ObjectAnimator.ofObject(this, "color", new ArgbEvaluator(), Color.GREEN,
        Color.YELLOW, Color.BLUE, Color.WHITE, Color.RED);

然后设置时长和重复次数,并执行动画

animColor.setRepeatCount(-1);
animColor.setRepeatMode(ValueAnimator.REVERSE);

animColor.start();

不同于时间插值器,除了常用的颜色、浮点和整型估值器,关于运动轨迹的一般会自定义,因为需求各不相同。

3、使用范围

电影和端视屏都有了倍速和慢动作,现实中大多数动画也都是非匀速执行的。时间插值器和估值器就很擅长这个。

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        //todo 这个值不断变动并通过postInvalidate触发onDraw引起重绘,point的值也是逐渐变化。
        currentPoint=(Point) animation.getAnimatedValue();
//重绘
        postInvalidate();
    }
});

onAnimationUpdate回调可以监听动画执行的当前状态。开启动画的方法只执行一次但是onAnimationUpdate这个回调被调用postInvalidate();就会触发onDraw,在onDraw中继续绘制Animator。循环往复形成动画。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值