ObjectAnimation 是Android 3.0 以后出现的,之前的桢动画可以实现透明度、旋转、缩放、移动四种变换,前提还只是对View可操作,设想我们自己创建了一个类,也想对它实现一些动画,这样objectAnimation就可以帮到你,此外,3.0之前的动画效果并没有真正使view的内容得到改变。例如你讲一个View(是一个可响应点击事件的)从(0,0)坐标移动到(50,50),然后在(50,50)坐标处点击图标,然而你会发现什么也没发生,如果你在(0,0)处点击,就会触发点击事件。所以,3.0 之前的动画无法完成和用户完成很好的交互, ObjectAnimation的出现很好的弥补了之前的不足。那就让我们来认识一下他吧。
- 可以用它来实现原来在3.0之前的动画效果,一下是一部分代码:
case R.id.id_button1:
//属性动画调用start方法是异步进行的,所以这三个动作可以同时进行
ObjectAnimator.ofFloat(imageView, "translationX", 0, 145F)
.setDuration(1000).start();
ObjectAnimator.ofFloat(imageView, "translationY", 0, 145F)
.setDuration(1000).start();
ObjectAnimator.ofFloat(imageView, "rotation", 0, 180F)
.setDuration(1000).start();
break;
2 . objectAnimator 的升级版 PropertyValuesHolder
android 官方API 是这么描述这个类的:PropertyValuesHolder objects can be used to create animations with ValueAnimator or ObjectAnimator thatoperate on several different properties in parallel. 其实它实现了上段代码的功能,可以同时的处理多个属性动画,不过它更高效,更加节省资源。实现方法,如下:
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat
("rotation", 0, 360F);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat
("translationX", 0, 200F);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat
("translationY", 0, 200F);
ObjectAnimator.ofPropertyValuesHolder(imageView, p1, p2, p3)
.setDuration(1000).start();
3 . 实现组合动画
前面介绍的属性动画都是同时进行的,android的API里有一个AnimatorSet类,它可以管理动画的播放次序,可以顺序播放,也可以同时播放,一句话,随你喽~~不同指出请擦亮眼睛:
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat
(imageView, "translationX", 0, 145F);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat
(imageView, "translationY", 0, 145F);
ObjectAnimator objectAnimator3 = ObjectAnimator.ofFloat
(imageView, "rotation", 0, 180F);
//有顺序的执行 animatorSet.playSequentially(objectAnimator1, objectAnimator2, objectAnimator3);
//同时执行动画1和动画2 之后再执行3 animatorSet.play(objectAnimator1).with(objectAnimator2);
animatorSet.play(objectAnimator3).after(objectAnimator2);
animatorSet.setDuration(1000);
animatorSet.start();
4.Interpolator的用法
参考:第一行代码作者博客地址
对于补间器的介绍,郭老师讲的也很详细了,大家好好看。
贴一段代码,下面这段代码可以实现一个简单的卫星菜单,当然是很简单的,如要看详细代码请到 :点击这里有惊喜
查看完整代码。
rivate void startAnima() {
for (int i =1;i<res.length;i++){
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageViews
.get(i), "translationY", 0, (i-1) * 150);
objectAnimator.setDuration(1000);
objectAnimator.setStartDelay(i*300);
objectAnimator.start();
flag = false;
}
}
for (int i = res.length-1;i>= 1; i--){
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageViews
.get(i), "translationY",(i-1) * 150, 0);
objectAnimator.setDuration(1000);
objectAnimator.setStartDelay(i*300);
objectAnimator.start();
flag = true;
}
点击按钮之前
点击按钮后
效果有点操,我会慢慢改的,谢谢啦