动画的种类
Android中的动画有视图动画(View)和属性动画(Property),其中视图动画还包括补间动画和逐帧动画,也就是我们常说的Frame动画和Tweened动画。
属性动画property是在Android3.0(API 11)之后才出现的,比视图动画出现的晚,显然也比较高级。视图动画能实现的效果,理论上属性动画也能实现,而且更加的灵活。
动画的区别
这里列举的区别主要是功能上的区别,也体现了两者的优缺点。
- 针对的对象:属性动画可以作用于任何对象,而补间动画只能作用于视图。即使没有对象,依然可以使用属性动画
- 动画效果:补间动画的效果只有:平移、旋转、缩放、透明度4种,而属性动画还可在此基础上进行拓展。
- 作用对象的属性:补间动画只改变了视图的效果,并不能改变View的属性。也就是说当你利用补间动画让一个按钮Button从A点移动到B点后,你再点击A点,同样存在点击效果的。而属性动画则是实实在在的改变了按钮的位置。这个在自定义View中的使用十分常见。
动作原理
在一定时间间隔内,通过不断对值进行改变,并不断将该值赋给对象的属性(补间动画不会改变对象的属性),从而实现该对象在该属性上的动画效果。
- 赋值:动画时长、开始值、结束值
- 值变化:从开始值到结束值的过渡
- 值每改变一次,就对对象的属性赋值一次,直到开始值等于结束值
- 每次赋值都会调用invalidate()不断的刷新视图,利用onDraw()绘制视图。从而实现动画效果
使用
属性动画有两个非常重要的类:ValueAnimator 类 和 ObjectAnimator 类。
两者的区别就是在赋值的时候,ValueAnimator是手动赋值,ObjectAnimator是自动赋值的
ValueAnimator
有三个重要方法:
ValueAnimator.ofInt(int values):将初始值 以整型数值的形式 过渡到结束值
ValueAnimator.ofFloat(float values):将初始值 以浮点型数值的形式 过渡到结束值
ValueAnimator.ofObject(int values):将初始值 以对象的形式 过渡到结束值,面向对象操作的,需要自定义对象类
下面针对ofInt作演示:
上面是Java代码演示,也可以在XML中(set_animation.xml)设置动画:
然后在Java中添加进去:
ObjectAnimator
|
|
例如改变一个按钮的透明度属性:
|
|
可以明显看出,相对于ValueAnimator,ObjectAnimator是不需要手动赋值。
其同样可以在XML文件中表示出以上的效果:
然后在Java中启动
TypeEvaluator与Interpolator
- 插值器(Interpolator)决定 值 的变化模式(匀速、加速、减速)
- 估值器(TypeEvaluator)决定 值 的具体变化数值
例如一个自由落体运动,物体是由静止慢慢加速掉落的,插值器(Interpolator)可以让这种效果更加明显、形象。而估值器(TypeEvaluator)体现了初始值与结束值以浮点型的过渡的逻辑。
例如FloatEvaluator
组合动画
实现 组合动画 的功能:AnimatorSet类
AnimatorSet.play(Animator anim) :播放当前动画
AnimatorSet.after(long delay) :将现有动画延迟x毫秒后执行
AnimatorSet.with(Animator anim) :将现有动画和传入的动画同时执行
AnimatorSet.after(Animator anim) :将现有动画插入到传入的动画之后执行
AnimatorSet.before(Animator anim) : 将现有动画插入到传入的动画之前执行
例如:
效果:
总结
属性动画的本质原理:通过不断对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果。
其中涉及的类及其功能如下图: