ValueAnimator、objectAnimator的基础用法

ValueAnimator 的用法

要实现一个从0到100的位移动画,ValueAnimator会根据动画持续的总时间产生一个0~1时间因子,有了这样一个时间因子。通过相应的变幻,就可以根据你的startValue和endValue来生成相应的值。同时,通过插值器的使用,我们还可以进一步控制每一个时间因子它产生值的一个变化速率。如果我们使用线性插值器,那么它生成数值的时候,就会形成一个线性变化,只要时间相同,它的增量也相同。如果我们使用一个加速度的插值器,那么它的增量变化就会呈现一个二次曲线图。增长率会越来越快。由于我们的ValueAnimator并不响应任何一个动画,也不能控制任何一个属性,所以它并没有ObjectAnimator使用的那么广泛。我们还是来看一下如何在程序中使用ValueAnimator吧。

        ValueAnimator animator = ValueAnimator.ofInt(start, end);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
              /**
                 * 通过这样一个监听事件,我们就可以获取
                 * 到ValueAnimator每一步所产生的值。
                 *
                 * 通过调用getAnimatedValue()获取到每个时间因子所产生的Value。
                 * */

                //获取动画过程中的渐变值
                int animatedValue = (int) animation.getAnimatedValue();
                Log.w("wangwei", "--->" + animatedValue);
                ViewGroup.LayoutParams layoutParams = last.getLayoutParams();
                layoutParams.height = animatedValue;
                last.setLayoutParams(layoutParams);
            }
        });

        if (mAdapter.getItemCount() > 0) {
            animator.setDuration(300);
            animator.start();
        }

objectAnimator的基础用法,

如平移、旋转、缩放、渐变以及动画的集合;至于objectAnimator(必须的有set get方法)和valueAnimator的详细区别也可参考郭霖大神的动画详解篇

2、除此基本用法,还有估值器和插值器

(1)插值器:动画速率的变换,有点类似物理的加速度,就是该变动画的速率的

(2)估值器:一般配合插值器使用,插值器返回因子,起始值,结束值给估值器,估值器根据这个区间数据生成这个区间连续的数值,而这写数值就是动画需要的属性的值,使动画平滑过渡比如:ValueAnimator.ofFloat()方法就是实现了初始值与结束值之间的平滑过度,那么这个平滑过度是怎么做到的呢?其实就是系统内置了一个FloatEvaluator,它通过计算告知动画系统如何从初始值过度到结束值

我们都知道对于属性动画可以对某个属性做动画,而插值器(TimeInterpolator)和估值器(TypeEvaluator)在其中扮演了重要角色,下面先了解下TimeInterpolator和TypeEvaluator。

TimeInterpolator(时间插值器):

作用:根据时间流逝的百分比计算出当前属性值改变的百分比。

系统已有的插值器:

①LinearInterpolator(线性插值器):匀速动画。

②AccelerateDecelerateInterpolator(加速减速插值器):动画两头慢,中间快。

③DecelerateInterpolator(减速插值器):动画越来越慢。

TypeEvaluator(类型估值算法,即估值器):

作用:根据当前属性改变的百分比来计算改变后的属性值。

系统已有的估值器:

①IntEvaluator:针对整型属性

②FloatEvaluator:针对浮点型属性

③ArgbEvaluator:针对Color属性

那么TimeInterpolator和TypeEvaluator是怎么协同工作的呢?

它们是实现非匀速动画的重要手段。属性动画是对属性做动画,属性要实现动画,首先由TimeInterpolator(插值器)根据时间流逝的百分比计算出当前属性值改变的百分比,并且插值器将这个百分比返回,这个时候插值器的工作就完成了。比如插值器返回的值是0.5,很显然我们要的不是0.5,而是当前属性的值,即当前属性变成了什么值,这就需要估值器根据当前属性改变的百分比来计算改变后的属性值,根据这个属性值,我们就可以设置当前属

做了一凡说明,直接上代码:

1、透明度

    RESTART:重新从头开始执行。
    REVERSE:反方向执行。

    private void voidstartAlphaAnim(View view) {
        ObjectAnimator animator = ObjectAnimator.ofFloat(view, "alpha", 0f, 1.0f);

        animator.setDuration(3000);

        animator.setRepeatCount(-1);

        animator.setRepeatMode(ValueAnimator.REVERSE);

        animator.start();

    }

位移

private void startTranslationAnimtor(View mView) {

        ObjectAnimator animator = ObjectAnimator.ofFloat(mView, "TranslationX", 0, 500);

        animator.setDuration(3000);

        animator.setRepeatCount(-1);

        animator.setRepeatMode(ValueAnimator.REVERSE);

        animator.start();

    }

缩放

 public static void playAnimationDaShang(View view) {
        AnimatorSet animatorSetPeople = new AnimatorSet();  //多个动画 动画集
        animatorSetPeople.setDuration(1000);
        ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "translationX", -110, 110, 0);
        ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1, 2, 1);//从原始状态放大2倍再回到原始状态
        ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1, 2, 1);
        translationX.setRepeatCount(-1);//设置动画重复次数
        translationX.setRepeatMode(ObjectAnimator.RESTART);//动画重复模式
        translationX.setStartDelay(1000);//动画延时执行
        translationX.setInterpolator(new AccelerateInterpolator());//Interpolator可以定义动画播放的速度
        /*after(Animator anim) 将现有动画插入到传入的动画之后执行
after(long delay) 将现有动画延迟指定毫秒后执行
before(Animator anim) 将现有动画插入到传入的动画之前执行
with(Animator anim) 将现有动画和传入的动画同时执行*/
        animatorSetPeople.play(translationX).before(scaleX).before(scaleY);
        // animatorSetPeople.playTogether(translationX, scaleX, scaleY);
        animatorSetPeople.start();
        animatorSetPeople.end();
        animatorSetPeople.cancel();


    }
旋转
 /**
     * 旋转动画
     */

    private void startRotationAnimtor(View mView) {

        ObjectAnimator rotation = ObjectAnimator.ofFloat(mView, "Rotation", 0, 180);

        // rotation.setRepeatCount(-1);

        rotation.setRepeatMode(ValueAnimator.REVERSE);

        rotation.setDuration(2000);

        rotation.start();

    }

你可能感兴趣的:(ValueAnimator、objectAnimator的基础用法)