Android动画-属性动画-ViewPropertyAnimator

想想之前使用组合动画的时候,是不是这样的:

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.play(objectAnimator).with(objectAnimator1);
animatorSet.start();

或者这样的:

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(btnShow, "translationX", 0, 300);
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(btnShow, "rotation", 0, 360);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);
animatorSet.playTogether(objectAnimator,objectAnimator1);
animatorSet.start();

达到的效果是:

初见

然而,还能用下面的方法实现这个效果:

btnShow.animate()
        .setDuration(2000)
        .translationX(300)
        .rotation(360)
        .start();

简单了很多有没有 !

概述

平常所做的动画大部分是针对View的,而View经常会需要集中动画混合在一起做,因此提供了一个ViewPropertyAnimator类来快速的实现多个动画的混合。

ViewPropertyAnimator对同时进行多个动画进行了性能优化,虽然有多个动画同时进行,但是一次只刷新一次ui,不会让每个动画都去刷新ui。而且很明显他的写法非常简单。

获取ViewPropertyAnimator

只能通过View.animate()获取ViewPropertyAnimator。

常用方法

这里把能链式调用的全列举出来,感受一下他的方便之处:

                btnShow.animate()
                        .setDuration(5000)
                        //透明度
                        .alpha(0)
                        .alphaBy(0)
                        //旋转
                        .rotation(360)
                        .rotationBy(360)
                        .rotationX(360)
                        .rotationXBy(360)
                        .rotationY(360)
                        .rotationYBy(360)
                        //缩放
                        .scaleX(1)
                        .scaleXBy(1)
                        .scaleY(1)
                        .scaleYBy(1)
                        //平移
                        .translationX(100)
                        .translationXBy(100)
                        .translationY(100)
                        .translationYBy(100)
                        .translationZ(100)
                        .translationZBy(100)
                        //更改在屏幕上的坐标
                        .x(10)
                        .xBy(10)
                        .y(10)
                        .yBy(10)
                        .z(10)
                        .zBy(10)
                        //监听及其他设置
                        .setInterpolator(new BounceInterpolator())
                        .setStartDelay(1000)
                        .setListener(new Animator.AnimatorListener() {
                            @Override
                            public void onAnimationStart(Animator animation) {
                            }
                            @Override
                            public void onAnimationEnd(Animator animation) {
                            }
                            @Override
                            public void onAnimationCancel(Animator animation) {
                            }
                            @Override
                            public void onAnimationRepeat(Animator animation) {
                            }
                        })
                        .setUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                            @Override
                            public void onAnimationUpdate(ValueAnimator animation) {
                            }
                        })
                        .withEndAction(new Runnable() {
                            @Override
                            public void run() {
                                Log.i(TAG, "run: end");
                            }
                        })
                        .withStartAction(new Runnable() {
                            @Override
                            public void run() {
                                Log.i(TAG, "run: start");
                            }
                        })
                        .start();
  1. 动画的方法名和ObjectAnimator中药填写的属性名是一样的,很容易明白。
  2. 每个动画都有一个By的后缀的方法。加上By的意思是,继续动画这么多数值。不加By的意思是动画到这个数值。
  3. 也可以设置插值器和Animator.AnimatorListener监听以及ValueAnimator.AnimatorUpdateListener监听
  4. 可以直接设置动画开始和结束时的回调方法。
  5. 但是好像没有重复动画的功能

关于By

下面用旋转来演示一下By的区别。

按钮初始旋转角度已经旋转了90, 当点击按钮执行的动画是下面这样的时候,表示旋转到180:

btnShow.animate()
        .setDuration(2000)
        .rotation(180)
        .start();
Android动画-属性动画-ViewPropertyAnimator_第1张图片

第一次点击会从90旋转到180,再次点击会从180旋转到180,因为已经是180了,所以看着没动。

如果是By呢?:

btnShow.animate()
                        .setDuration(2000)
                        .rotationBy(180)
                        .start();
Android动画-属性动画-ViewPropertyAnimator_第2张图片

你可能感兴趣的:(Android动画-属性动画-ViewPropertyAnimator)