属性动画,属性动画组合队列详解 ValueAnimator ObjectAnimator AnimatorSet

属性动画跟早些的补间动画最大的差别应该是补间动画只是个绘画的展示效果,duang duang duang都是特技,是假的,属性动画是view本身的属性真的跟着动画改变的,是真的。

ValueAnimator 使用姿势:

ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1.0f);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        Float animatedValue = (Float) animation.getAnimatedValue();
                        getGuideHand().setAlpha(animatedValue);
                    }
                });

也可以加个listener做一些动画开始前,结束,取消或者重复时候的动作

valueAnimator.addListener(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) {
                    }
                });


当然大部分时候我们并不需要这么多的接口,为了其中一个回调却出来一大堆代码太不优雅了,AnimatorListenerAdapter就是一个帮我们实现了空实现的抽象类,我们可以有选择的重载我们需要的方法,这样就优雅很多了:

valueAnimator.addListener(new AnimatorListenerAdapter() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                    }
                });

在ValueAnimator中,我们需要在onAnimationUpdate中实现自己想要实现的动画效果,非常灵活,灵活的同时也是稍有些麻烦,下面要说的 ObjectAnimator 就不需要, ObjectAnimator 继承自ValueAnimator,我们只要指定要改变的属性值就可以了。

ObjectAnimator.ofFloat(tv, "Alpha", 0f, 1f).start();
嗯 没错,就只有这一句实现了上述ValueAnimator的透明度动画。。。

不过还是有几个注意点,参数二 属性值不需要关注首字母大小写问题,但是动画对象必须要有相对应的set方法,(如果valueFrom或者valueTo有为null的,那get方法也必须要有)

ObjectAnimator.ofFloat(iv_red_package, "ScaleX", 0, 1);
ObjectAnimator.ofFloat(iv_top, "translationY", iv_top.getMeasuredHeight(), 0);
ObjectAnimator.ofFloat(iv_halo, "Rotation", 0, 360);

属性动画可以通过AnimatorSet来排序动画播放顺序。with同时播放,before,after之前之后播放。比如:

AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.play(anim1).before(anim2).before(anim3);
        animatorSet.start();
很好理解,先放anim1,再放anim2,再放anim3,很简单对不对。 错!正确的结果是anim1完后anim2,anim3同时播放。啪啪啪,敲重点。play方法会创建一个Builder,同时,play方法传入的动画对象会成为一个节点,之后的所有不管是before,after还是with,都会以这个节点作为目标节点。所以,优雅的写法是一对一对得写:

AnimatorSet animatorSet = new AnimatorSet();
        animatorSet.play(anim1).before(anim2);
        animatorSet.play(anim2).before(anim3);

这样才是anim1,anim2,anim3顺序播放









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值