Android 的动画分为三类: 帧动画、补间动画、属性动画; 而动画的效果分为四类:透明度、旋转、平移、缩放;
我们要学习的属性动画,在Android3.0之后推出,帮助开发者实现更加丰富的动画效果;属性动画改编了3.0之前动画框架Animation存在的一些局限性----动画只改变显示,不改变点击效果,(意思就是,我把一个button从a左边移动到了b坐标,但是我们点击b坐标的按钮没有效果,还需要去点击a坐标才会响应点击事件,这就给我们造成了很多不必要的麻烦)
在Animator框架中,我们使用最多的就是AnimatorSet 和ObjectAnimator配合,使用ObjectAnimator精细化控制,只控制一个对象的一个属性值,然后组合到AnimatorSet行成一个动画 ;
最重要的是: 属性动画通过调用属性的get、set方法来真实的控制view的属性值,因此强大的属性动画框架,基本可以实现所有的动画效果;
ObjectAnimator
ObjectAnimator animator = ObjectAnimator.ofFloat(view , "translationX", 300 );
animator.setDuration(300);
animator.start();
这是一个简单的平移操作,调用ObjectAnimator 的静态工厂方法,创建一个对象,第一个参数就是我们要控制的view,第二个参数就是要进行操控的属性,第三个参数是可变数组参数,这里我们只设置了一个300 ,即向右平移300;
PropertyValuesHolder
PropertyValuesHolder propertyValuesHolder1 = PropertyValuesHolder.ofFloat("translationX", 400);
PropertyValuesHolder propertyValuesHolder2 = PropertyValuesHolder.ofFloat("alpha", 0.5f);
PropertyValuesHolder propertyValuesHolder3 = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
PropertyValuesHolder propertyValuesHolder4 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
ObjectAnimator.ofPropertyValuesHolder(view,propertyValuesHolder1, propertyValuesHolder2,
propertyValuesHolder3, propertyValuesHolder4).setDuration(1000).start();
PropertyValuesHolder 类似动画中的AnimationSet ,在属性动画中,如果针对同一个对象的多个属性,要同时控制多种动画, 可以通过PropertyValuesHolder 来实现。
ValueAnimator
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,100);
valueAnimator.setTarget(v);
valueAnimator.setDuration(1000).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value =(Float) animation.getAnimatedValue();
//TODO use the value
}
});
ValueAnimator 在属性动画中占有非常重要的地位, (虽然我并没有感受到0.0),
ValueAnimator 本身 不提供任何动画效果,一段代码写完,屏幕点碎了,没见什么动静,真是糟心啊;
ValueAnimator 的一般使用方法是在AnimatorUpdateListener中监听数值的变化 ,从而完成动画的变化;
AnimatorSet
ObjectAnimator animator1 = ObjectAnimator.ofFloat(v, "translationX", 300);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(v, "scaleX", 1f, 0, 1f);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(v, "scaleY", 1f, 0, 1f);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(1000);
animatorSet.playTogether(animator1, animator2, animator3);
animatorSet.start();
对于一个属性同事作用多个属性动画效果, 前面已经用PropertyValuesHolder 实现过了,但是呢,请广大彩民同志注意了,"playTogether",顾名思义,AnimatorSet不仅能实现这样的效果,还可以精确的控制动画执行的顺序;
AnimaotrSet正是通过 playTogether()、playSequentially()、animSet.play().with()、before()、after()这些方法来控制多个动画的协同工作方式;
what ? 什么意思? 百度!