属性动画跟早些的补间动画最大的差别应该是补间动画只是个绘画的展示效果,duang duang duang都是特技,是假的,属性动画是view本身的属性真的跟着动画改变的,是真的。
【属性动画,属性动画组合队列详解 ValueAnimator ObjectAnimator AnimatorSet】ValueAnimator 使用姿势:
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,1.0f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float animatedValue = https://www.it610.com/article/(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顺序播放