引言
關於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