Android Animation

初识属性动画

在Android中动画包含两种基本动画:View (Tween)补间动画和Frame 动画;在3.0之后引入了属性动画(Property Animation);我们重点说一下属性动画。

动画区别

  • View 动画的特性:
    • 只能针对View进行 淡入淡出、旋转、移动、缩放操作;
    • 动画结束之后,只是一种映射的移动,view本身还停留在原来的地方;
    • 在进行动画和修改位置信息同时操作时,执行的顺序是:先移动到指定位置,再进行动画的显示。这是与我们设想的有出入;
  • Perproty 动画的特性:
    • 对任意对象的任意属性进行值的设定;
    • 针对移动动画实现view的真实移动;

ValueAnimator

动画的核心类,原理:使用一种时间循环的机制来计算值与值之间的一种过渡;

1
2
3
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.0f,1.0f);
valueAnimator.setDuration(300);
valueAnimator.start();

为动画添加监听器,监测值的变化

1
2
3
4
5
6
7
8
9
ValueAnimator animator = ValueAnimator.ofFloat(0.0f,100.0f);
animator.setDuration(300);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
animation.getAnimatedValue();//动画的实时值
}
});
animator.start();

在常用的方法中还有ofInt()和ofObject()方法等;还可以调用setStartDelay()方法来设备动画延迟播放的时间,setRepeatCount()和setRepeatMode()方法设置动画重复播放的次数以及循环播放的模式;

1
2
3
4
5
6
7
8
9
10
ValueAnimator animator = ValueAnimator.ofFloat(0.0f,100.0f);
animator.setDuration(300);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
view.setTranslationX((Float)//时间操作的view animation.getAnimatedValue());//动画的实时值
}
});
animator.setRepeatCount(-1);//无限循环
animator.start();

ObjectAnimator

继承自ValueAnimator,拥有ValueAnimator所有的属性和方法;对图片进行平滑的移动,

1
2
3
ObjectAnimator anim = ObjectAnimator.ofFloat(iv_icon,"translationX",0.0f,100.0f);
anim.setDuration(300);
anim.start();

在 ofFloat 的第二个参数中,我们可以随意的添加类似:alpha、rotation、translationX、scaleY 等属性值,但view中并没有这些值,那么他们到底是怎么发生作用的呢?其实ObjectAnimator 的内部机制是去寻找相应的get()/set()方法来实现相应的操作;因此translationX 属性对应的 get() / set() 方法如下:

1
2
public void setTranslationX(float value);
public float getTranslationX();

组合动画

AnimatorSet,

包含四个方法:

  • after(Animator anim) — 将现有动画插入到传入的动画之后执行
  • after(long delay) — 将现有的动画延迟指定多少毫秒之后执行
  • before(Animator anim) — 将现有动画插入到传入的动画之前执行
  • with(Animator anim) — 同时执行
1
2
3
4
5
6
7
8
//先移动->旋转和淡入淡出
ObjectAnimator anim = ObjectAnimator.ofFloat(iv_icon,"translationX",0.0f,100.0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(iv_icon,"rotation",0.0f,360.0f);
ObjectAnimator alpha = ObjectAnimator.ofFloat(iv_icon,"alpha",1.0f,0.0f,1.0f);
AnimatorSet set = new AnimatorSet();
set.play(alpha).with(rotate).after(anim);
set.setDuration(5000);
set.start();

Animator Listener

当页面有多个动画同时关联的时候,监听器的存在就发挥很大的作用啦;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
anim.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()就可以啦;

1
2
3
4
5
6
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});

关于属性动画的一些基本内容就先介绍到这里,后续在深入挖掘;