属性动画与视图动画的区别
android中动画分为两大类,视图动画(ViewAnimatior)和属性动画(PropertyAnimator),视图动画主要包括逐帧动画和补间动画,属性动画主要分为ValueAnimator和ObjectAnimator。视图动画和属性动画本质上的操作对象都是要添加动画的控件,区别主要有一下几点:
- 引入时间不同,视图动画从android1.0开始就已经引入,而属性动画从android3.0才开始引入,可以理解为引入属性动画是为了弥补视图动画的不足。
- 二者操作的对象虽然都是控件,但是作用的效果不同,视图动画主要使控件产生平移、旋转、透明度、缩放四种效果,并不能改变控件的相关属性值。而属性动画除了可以实现视图动画的四种效果之外,还可以改变控件的属性值。
- 视图动画并没有改变控件的实际位置,控件依然位于初始位置,而属性动画可以改变控件的实际位置。这会导致视图动画和属性动画的点击事件触发区域不同。
属性动画的分类
属性动画主要分为ValueAnimator和ObjectAnimator,本文主要讲解ValueAnimator。
属性动画的基本使用
ValueAnimator的使用分为两步:创建并启动ValueAnimator,为ValueAnimator添加监听。
- 创建并启动ValueAnimator
ValueAnimator animator = ValueAnimator.ofInt(0,10);//创建ValueAnimator实例
animator.setDuration(3000)//时长
animator.start();//启动动画
- 添加监听
animator5.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
tv_xxx.setText((int)animation.getAnimatedValue()+"");//改变控件值
}
});
上面的动画示例实现了一个3s内数字从0变化到10的效果。
常用函数
在上面的示例中,可以通过ValueAnimator的ofInt()方法获取ValueAnimator对象。事实上还有几个类似的方法可以获取到ValueAnimator对象,这里主要介绍一下其中的ofInt()和ofFloat()方法。
- ofInt(int…value),参数是可变类型的整数值,用来表示动画的数值变化范围,比如上面例子中使用的ofInt(0,10),表示数值从0变化到10。由于是变长参数,参数越多表示动画越复杂,比如ofInt(0,10,100),表示数值先从0变化到10,然后再从10变化到100。
- ofFloat(float…value) 与ofInt()的唯一不同就是传入的参数类型不同,onInt()需要传入整数类型数值,而ofFloat()需要传入浮点型数值。
函数汇总
函数名 | 作用 |
---|---|
ofInt | 接收整数类型可变参数,使控件的状态在参数范围内发生变化 |
ofFloat | 接收浮点类型可变参数,使控件的状态在参数范围内发生变化 |
ofArgb | 接收颜色的十六进制数值,主要用于改变控件颜色 |
ofObject | 接收一个自定义估值器和Object类型的可变参数,用于实现自定义变化效果 |
setDuration | 动画时长,单位为毫秒 |
setInterpolator | 设置插值器,参数为系统自带或自定义插值器 |
start | 启动动画 |
监听器
前面讲过,使用ValueAnimator需要有两个步骤,一获取ValueAnimator对象;二设置监听。比如上面讲的textview值从0到10的变化动画,我们为这个动画过程设置了0-10的整数变化范围,那么如何实时获取到0-10变化过程中的每个数字并且将其设置到textview上呢?答案就是采用监听。设置监听的作用就是要能够实时获取到动画的变化状态。ValueAnimator通过addUpdateListener(AnimatorUpdateListener listener)方法来设置监听,AnimatorUpdateListener是ValueAnimator的一个内部接口。我们可以采用以下方式来设置监听:
animator5.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
tv_xxx.setText((int)animation.getAnimatedValue()+"");//改变控件值
}
});
animation.getAnimatedValue()获取到的就是在指定的数值变化范围内每次变化时的值,这个值是根据插值器和估值器的一些列运算的到的,关于插值器和估值器会在以后专门介绍。
移除监听器
通过上文知道可以通过addUpdateListener方法添加监听器,那么怎么移除监听器呢?移除监听器主要有两个方法:removeAllUpdateListeners()和removeUpdateListener(xxxListener)。
removeAllUpdateListeners用于移除所有监听器,removeUpdateListener(xxxListener)用于移除指定的监听器。 需要注意的是监听器移除之后动画效果将不再发生变化,但是动画依然在执行,除非调用cancel方法取消动画。
使用示例
接下来用一个loading动画来演示并总结一下ValueAnimator的基本使用。核心代码如下:
ValueAnimator animator = ValueAnimator.ofFloat(0,360);// 顺时针360度旋转
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Float value=(Float) animation.getAnimatedValue();
setRotation(value);
}
});
animator.setDuration(1000);//每次旋转过程执行时长1s
animator.setRepeatCount(ValueAnimator.INFINITE);//无限次旋转
animator.setInterpolator(new LinearInterpolator());//线性匀速旋转
animator.start();
效果图由于上传过程比较麻烦,就补贴出了,按照核心代码字自己运行一下就知道效果了。