安卓 属性动画之:PropertyValuesHolder 和 AnimatorSet

PropertyValuesHolder : 可以承载多个属性,在一个动画中改变多个属性值

AnimatorSet : 可以承载多个动画,并且自定义动画的执行顺序。

一.PropertyValuesHolder使用:只提供核心代码

                PropertyValuesHolder holder1 = PropertyValuesHolder.ofFloat("scaleX", 0, 1);
                PropertyValuesHolder holder2 = PropertyValuesHolder.ofFloat("scaleY", 0, 1);
                PropertyValuesHolder holder3 = PropertyValuesHolder.ofFloat("alpha", 0, 1);

                ObjectAnimator.ofPropertyValuesHolder(view, holder2, holder3).start();

二. AnimatorSet: 只提供核心代码
下面代码设置监听的原因是 因为我不想让每次点击的时候都触发动画,而是想让动画在执行的过程时,无论怎么点击都无法再触发。 因此三个动画都设置了监听。

                //将动画2也设置几秒试试很有趣
                if(view.getTranslationX() == 200.0){
    
    
                    view.setTranslationX(-200f);
                }else if(view.getTranslationX() != -200){
    
    
                    return;
                }

                ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "alpha", 0, 1);
                animator1.addListener(new Animator.AnimatorListener() {
    
    
                    @Override
                    public void onAnimationStart(Animator animation) {
    
    
                        view.setTranslationX(-199f);
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
    
    

                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
    
    

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
    
    

                    }
                });
                animator1.setDuration(4000);
                ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationX", -200, 200);
                animator2.setDuration(4000);
                animator2.addListener(new Animator.AnimatorListener() {
    
    

                    @Override
                    public void onAnimationStart(Animator animation) {
    
    
                        matrixStart = view.getMatrix();
                        rectFStart = new RectF();
                        matrixStart.mapRect(rectFStart);
                        Log.d("test", "onAnimationStart: " + view.getLeft() + "  " + rectFStart.left + "  " + view.getTranslationX() + "  " + view.getTop());
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
    
    
                        view.setTranslationX(201f);
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
    
    

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
    
    

                    }
                });
                ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, "rotation", 0, 1080);
                animator3.addListener(new Animator.AnimatorListener() {
    
    
                    @Override
                    public void onAnimationStart(Animator animation) {
    
    

                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
    
    
                        matrixEnd = view.getMatrix();
                        rectFEnd = new RectF();
                        matrixEnd.mapRect(rectFEnd);
                        Log.d("test", "onAnimationEnd: " + view.getLeft() + "  " + rectFEnd.left + "  " + view.getTranslationX() + "  " + view.getTop());
                        view.setTranslationX(200f);
//                        view.setTranslationX(-200f);
//                        Log.d("test", "onAnimationEnd: " + view.getLeft() + "  " + rectFEnd.left + "  " + view.getTranslationX());
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
    
    

                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
    
    

                    }
                });
                animator3.setDuration(4000);
                AnimatorSet animatorSet = new AnimatorSet();
                animatorSet.play(animator1).before(animator2); // 先执行 1 再执行 2
//                animatorSet.play(animator3).after(animator2); //先2后3
                animatorSet.playTogether(animator2, animator3); // 2 和 3 同时开始
                animatorSet.start();

属性动画是依赖的属性值必须要有对应的set方法,并且set方法里面要有invalidate() 方法才能在属性值改变的时候进行重绘。(必要时还需要有对应get方法)

猜你喜欢

转载自blog.csdn.net/XJ200012/article/details/127270209