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 
 

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