通過ValueAnimator實現呼吸燈效果
主要是通過AnimatorUpdateListener獲得狀態,執行一個不現實的動畫,根據獲得的執行值自己設定view或者drawable的狀態。
程式碼如下
ValueAnimator alphaAnim = null;
/**
* 透明漸變的動畫
* @param animType 動畫的型別,迴圈/單次 0是單次,1是迴圈,預設0
* @param drawable 結束之後的前景
**/
public void startAlphaAnim(final int animType,final int overDrawable){
alphaAnim =ObjectAnimator.ofInt(255,0);
alphaAnim.setDuration(2000);
if(1==animType){
alphaAnim.setRepeatCount(-1);
alphaAnim.setRepeatMode(ValueAnimator.REVERSE);
}
alphaAnim.addUpdateListener(new AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int frameValue = (Integer) animation.getAnimatedValue();
getBackground().setAlpha(255-frameValue);
getDrawable().setAlpha(frameValue);
}
});
alphaAnim.addListener(new AnimatorListener(){
@Override
public void onAnimationStart(Animator animation) {}
@Override
public void onAnimationEnd(Animator animation) {
//將透明度的恢復放在前面,只有這樣才是對同一物件入手
//背景色不需要做處理,因為背景色只有在動畫的時候才有用
getDrawable().setAlpha(255);
setBackgroundColor(getResources().getColor(R.color.transparent));
setImageResource(overDrawable);
}
@Override
public void onAnimationCancel(Animator animation) {
//將透明度的恢復放在前面,只有這樣才是對同一物件入手
//背景色不需要做處理,因為背景色只有在動畫的時候才有用
getDrawable().setAlpha(255);
setBackgroundColor(getResources().getColor(R.color.transparent));
setImageResource(overDrawable);
}
@Override
public void onAnimationRepeat(Animator animation) {}
});
alphaAnim.start();
}
/**
* 取消漸變動畫
**/
public void closeAlphaAnim(){
if(alphaAnim==null)
return;
alphaAnim.cancel();
alphaAnim = null;
}