一、 前言
Android支持两种动画模式,分别为:
1.View Animation:补间动画,给出两个关键帧,通过一些算法将给定属性值在给定时间内在两个关键帧间渐变
2.Frame动画:传统的动画方式,通过顺序的播放排列好的图片来实现,类似与电影的帧动画
而今天将要使用的是Animator框架,Animator框架是Android 4.0新增的一个动画框架,相比于Animation框架,Animator可以进行更多和更精细化的动画控制,而且比之前更简单也更高效。
二、 关键接口介绍
ObjectAnimator
Animator框架封装的比较好,对外提供的接口非常简单,创建一个ObjectAnimator只需要通过静态工厂返回一个ObjectAnimator对象即可,构造方法如下
public static ObjectAnimotor ofFloat(Object target,
String propertyName,float...values)
三个变量分别为要变换的对象、变换的属性名称及变换范围,例如:
X轴变换——
ObjectAnimator oa = ObjectAnimator.ofFloat(view, "translationX", x0,x+x0);
Y轴变换——
ObjectAnimator oa = ObjectAnimator.ofFloat(view, "translationY", y0,y+y0);
绕X轴旋转——
ObjectAnimator oa = ObjectAnimator.ofFloat(view, "rotationX",0F,360F);
AnimatorSet
set是集合的意思,AnimatorSet用于将多个属性动画集合到一起。AnimatorSet提供了4种方法用于集合动画的创建:
1.playSequentially(Animator...items)
2.playSequentially(List<Animator> items)
3.playTogether(Animator...items)
4.playTogether(Collection<Animator> items)
这里可以看出它主要有两种操作类型,sequentially和together,前者用于依次播放动画,而后者用于同时播放动画。
接下来我们看下AnimatorSet提供的Build类。
public class Builder {
private Node mCurrentNode;
Builder(Animator anim) {
mCurrentNode = mNodeMap.get(anim);
if (mCurrentNode == null) {
mCurrentNode = new Node(anim);
mNodeMap.put(anim, mCurrentNode);
mNodes.add(mCurrentNode);
}
}
public Builder with(Animator anim) {
Node node = mNodeMap.get(anim);
if (node == null) {
node = new Node(anim);
mNodeMap.put(anim, node);
mNodes.add(node);
}
Dependency dependency = new Dependency(mCurrentNode, Dependency.WITH);
node.addDependency(dependency);
return this;
}
public Builder before(Animator anim) {
Node node = mNodeMap.get(anim);
if (node == null) {
node = new Node(anim);
mNodeMap.put(anim, node);
mNodes.add(node);
}
Dependency dependency = new Dependency(mCurrentNode, Dependency.AFTER);
node.addDependency(dependency);
return this;
}
public Builder after(Animator anim) {
Node node = mNodeMap.get(anim);
if (node == null) {
node = new Node(anim);
mNodeMap.put(anim, node);
mNodes.add(node);
}
Dependency dependency = new Dependency(node, Dependency.AFTER);
mCurrentNode.addDependency(dependency);
return this;
}
public Builder after(long delay) {
// setup dummy ValueAnimator just to run the clock
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
anim.setDuration(delay);
after(anim);
return this;
}
}
通过查看源码可知,Build类的构造函数不是public的,所以我们只能通过AnimatorSet的play()方法来获得Builder对象。Builder提供了before(),after(),with()等方法,用于调整动画变换的先后顺序,看代码:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationX", 0F,200F);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(view, "translationY", 0F,300F);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(view, "rotation", 0F,270F);
AnimatorSet set = new AnimatorSet();
set.play(animator2).with(animator1);
set.play(animator3).after(animator2);
set.setDuration(1000);
set.start();
上面的代码会使view同时完成在X轴和Y轴上的移动,完成移动后再完成反转变换。
三、 使用实例
我们可以通过Animator实现自由落体动画
// 获取屏幕大小
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
// Log.i("height------", dm.heightPixels+"");
//实现自由落体动画
ObjectAnimator animator = ObjectAnimator.ofFloat(image,
"translationY", 0, 858);
AnimatorSet set = new AnimatorSet();
set.setDuration(3000);
set.setInterpolator(new BounceInterpolator());
set.play(animator);
set.start();
这样就实现了自由落体的动画效果。