Android属性动画----ValueAnimator

引言
  关于Android动画的内容,我们已经讲了好几篇了,都是一些最基础的,包括Alpha、Translate、Rotate、Scale都是常见的补间动画(Tween Animation),属于视图动画(包括补间动画和帧动画),今天我们来学习另一种类型,属性动画,主角是ValueAnimator。 
  那么肯定有人会疑惑视图动画和属性动画有什么区别?那就看下面我对这两种动画的理解: 

  • 视图动画:只改变控件的显示效果以及显示位置,不改变控件本身的属性。
  • 属性动画:改变控件的某一属性,从而实现控件的展示的动画效果。

ValueAnimator

ValueAnimator也是继承自Animator类,它本质是提供了一个时间的引擎去提供一系列变化的值并将其值赋值与目标控件上。

ValueAnimator xml实现方式

        这里是一个简单的使用xml来实现ValueAnimator的方式 
  第一步,在res文件下新建animator文件夹,并在animator文件夹下新建valueanimator.xml文件,目录结构如下图所示: 
   
  第二步,编写valueanimator.xml文件内容:如下

<?xml version =“1.0”encoding =“utf-8”?> 
<animator xmlns:android =“http://schemas.android.com/apk/res/android” 
    android:duration =“10000” 
    android:valueFrom =“0” 
    android:valueTo =“100” 
    android:valueType =“intType” 
    android:repeatCount =“0” 
    android:interpolator =“@ android:anim / linear_interpolator” 
    android:repeatMode =“reverse”/> 

  第三步,实例化valueanimator 

private ValueAnimator valueAnimator;  //声明动画对象
……
valueAnimator = (ValueAnimator)AnimatorInflater.loadAnimator(this,R.animator.valueanimator); //实例化
/*AnimatorInflator 是Andorid 提供的属性动画帮助类*/

        第四部,添加动画监听

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
              int value = (Integer)valueAnimator.getAnimatedValue(); //获取动画的值
              mTVValue.setText(value+""); //把值设为控制的值,nTVValue是一个TextView
            }
        });

          第五步,开始动画

valueAnimator.start();

ValueAnimator 代码实现方式

第一步,声明对象,并实例化   

private ValueAnimator valueAnimator;
……
valueAnimator = new ValueAnimator();

第二步,设置相关参数

valueAnimator.setIntValues(0,100);
valueAnimator.setDuration(10000);
valueAnimator.setInterpolator(new LinearInterpolator());

第三步,添加动画监听   

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
              int value = (Integer)valueAnimator.getAnimatedValue();
              mTVValue.setText(value+"");
            }
        });

第四步,执行动画

valueAnimator.start();

动画效果
先简单的看一下动画效果 


这算是最简单基础的ValueAnimator的用法。使用流程基本如此,其它也基本是在这个流程上做扩充,在使用的过程中可以自行了解一下。

ValueAnimator中常用函数说明

void addUpdateListener(ValueAnimator.AnimatorUpdateListener listener)  //动画值监听函数

void cancel() //取消动画

void end() //结束动画

static ValueAnimator    ofArgb(int... values)//颜色动画构造函数

static ValueAnimator    ofFloat(float... values)//浮点动画构造函数

static ValueAnimator    ofInt(int... values) //整型动画构造函数

static ValueAnimator    ofObject(TypeEvaluator evaluator, Object... values) //对象动画构造函数

static ValueAnimator    ofPropertyValuesHolder(PropertyValuesHolder... values) //不知道怎么翻译

void    setEvaluator(TypeEvaluator value) //设置值计算器

void    setInterpolator(TimeInterpolator value) //设置插值器

void    pause()//暂停动画

void    resume() //恢复动画

颜色动画示例
示例代码:

<?xml version="1.0"  encoding="utf-8"?>
<animator
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="10000"
    android:valueFrom="#ffff0000"
    android:valueTo="#ffffffff"
    android:valueType="colorType"
    />

监听器

colorValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                int color = (Integer)valueAnimator.getAnimatedValue();
                mTVValue.setBackgroundColor(color);
            }
        });

效果 


对象动画示例
Javacode

/*代码实现对象动画*/
        objectValueAnimator = ValueAnimator.ofObject(new MyAnimObjectEvaluator(),new MyAnimObject(0),new MyAnimObject(10));
        objectValueAnimator.setDuration(10000);
        objectValueAnimator.setInterpolator(new LinearInterpolator());
/*对象动画*/
    class MyAnimObject{

        int value;

        public MyAnimObject(int value){
            this.value = value;
        }
    }
/*对象动画算值器*/
    class MyAnimObjectEvaluator implements TypeEvaluator<MyAnimObject>{

        @Override
        public MyAnimObject evaluate(float v, MyAnimObject myAnimObject, MyAnimObject t1) {
            int oldValue = myAnimObject.value;
            int newValue = t1.value;

            int res = (int)((oldValue + newValue)*v)*2;  //返回偶数
            MyAnimObject animObject = new MyAnimObject(res);
            return animObject;
        }
    }

监听器

objectValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                MyAnimObject value = (MyAnimObject)valueAnimator.getAnimatedValue();
                mTVValue.setText(value.value);

            }
        });

效果: 


结尾
关于ValueAnimator的基础学习,这篇博客就先到这里,关于本篇博客用到动画值计算器以及插值器,会在下篇博客进行专门讲解。
--------------------- 
原文:https://blog.csdn.net/wenwen091100304/article/details/54317765 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章