属性动画ValueAnimator的基本使用

属性动画与视图动画的区别

    android中动画分为两大类,视图动画(ViewAnimatior)和属性动画(PropertyAnimator),视图动画主要包括逐帧动画和补间动画,属性动画主要分为ValueAnimator和ObjectAnimator。视图动画和属性动画本质上的操作对象都是要添加动画的控件,区别主要有一下几点:

  1. 引入时间不同,视图动画从android1.0开始就已经引入,而属性动画从android3.0才开始引入,可以理解为引入属性动画是为了弥补视图动画的不足。
  2. 二者操作的对象虽然都是控件,但是作用的效果不同,视图动画主要使控件产生平移、旋转、透明度、缩放四种效果,并不能改变控件的相关属性值。而属性动画除了可以实现视图动画的四种效果之外,还可以改变控件的属性值。
  3. 视图动画并没有改变控件的实际位置,控件依然位于初始位置,而属性动画可以改变控件的实际位置。这会导致视图动画和属性动画的点击事件触发区域不同。

属性动画的分类

属性动画主要分为ValueAnimator和ObjectAnimator,本文主要讲解ValueAnimator。

属性动画的基本使用

    ValueAnimator的使用分为两步:创建并启动ValueAnimator,为ValueAnimator添加监听。

  1. 创建并启动ValueAnimator
ValueAnimator animator = ValueAnimator.ofInt(0,10);//创建ValueAnimator实例
animator.setDuration(3000)//时长
animator.start();//启动动画
  1. 添加监听
 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()方法。

  1. ofInt(int…value),参数是可变类型的整数值,用来表示动画的数值变化范围,比如上面例子中使用的ofInt(0,10),表示数值从0变化到10。由于是变长参数,参数越多表示动画越复杂,比如ofInt(0,10,100),表示数值先从0变化到10,然后再从10变化到100。
  2. 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();

效果图由于上传过程比较麻烦,就补贴出了,按照核心代码字自己运行一下就知道效果了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值