一、ValueAnimator
1、基本介紹
- 屬性動畫的引入是為了彌補視圖動畫的不足,視圖動畫僅能對指定的控件做動畫,而屬性動畫是通過改變控件的某一屬性值來做動畫的。
- 補間動畫點擊區(qū)域是不變的,依然保持原區(qū)域可點擊狀態(tài)。屬性動畫點擊區(qū)域是可變化的,隨控件的位置改變而改變。
主要方法:
public static ValueAnimator ofInt(int... values);
public static ValueAnimator ofFloat(int... values);
//設(shè)置動畫時長,單位毫秒
ValueAnimator setDuration(long duration);
//獲取ValueAnimator在運動時當(dāng)前運動點的值
Object getAnimatedValue();
//開始動畫
void start();
//設(shè)置循環(huán)次數(shù),設(shè)置為INFINITE表示無限循環(huán)
void setRepeatCount(int value);
//設(shè)置循環(huán)模式value的取值有RESTART和REVERSE
void setRepeatMode(int value);
//取消動畫
void cancel();
向右下角移動動畫 :
ValueAnimator animator = ValueAnimator.ofInt(0,400);
animator.setDuration(1000);
animator.setRepeatMode(ValueAnimator.REVERSE);
animator.setRepeatCOunt(ValueAnimator.INFINITE);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animation){
int curValue = animation.getAnimatedValue();
textView.layout(curValue,curValue,curValue+textView.getWidth(),curValue+getHeight());
}
});
animator.start();
- ValueAnimator只負(fù)責(zé)對指定值區(qū)間進行動畫運算。
- 我們需要對運算過程進行監(jiān)聽,然后自己對控件執(zhí)行動畫操作。
- 重復(fù)次數(shù)為INFINITE(無限循環(huán))的動畫,當(dāng)Activity結(jié)束的時候,必須調(diào)用cancel()取消動畫,否則動畫將無線循環(huán),從而導(dǎo)致View無法釋放,進一步導(dǎo)致整個Activity無法釋放,最終引起內(nèi)存泄露。
2、添加監(jiān)聽器
①、監(jiān)聽動畫過程中值的變化
public static interface AnimatorUpdateListener{
void onAnimationUpdate(ValueAnimator animation);
}
②、監(jiān)聽動畫變化的四個階段
public static interface AnimatorListener{
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);//動畫重復(fù)時調(diào)用
}
3、移除監(jiān)聽器
移除AnimatorUpdateListener
void removeUpdateListener(AnimatorUpdateListener listener);
void removeAllUpdateListeners();
移除AnimatorListener
void removeListener(AnimatorListener listener);
void removeAllListeners();
4、其它不常用函數(shù)
延時開始執(zhí)行動畫,單位毫秒
public void setStartDelay(long startDelay);
完全克隆一個ValueAnimator實例,包括它所有的設(shè)置以及所有對監(jiān)聽器代碼的處理
public ValueAnimator clone();