安卓 属性动画之: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方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值