在一個Android應用中,用到了幀動畫。這東西的具體介紹就不講了,網上到處是(雖然基本都是抄來抄去……)。用起來很簡單效果也很好,不過這一次我有一個特殊的要求,希望幀動畫在播放完畢的時候做一些其他的事情。
在漸變動畫中,我們可以很簡單的使用監聽器:
XXX.setAnimationListener(newAnimationListener() {
@Override
publicvoid onAnimationStart(Animation animation) {
}
@Override
publicvoid onAnimationRepeat(Animation animation) {
}
@Override
publicvoid onAnimationEnd(Animation animation) {
//漸變動畫結束....
}
});
然而幀動畫卻沒有這樣方便的功能,爲什麼??
當然,我們自己寫的動畫,自己應該是知道它會什麼時候結束,啓動動畫的時候順便啓動一個線程就好了,說說簡單做起來畢竟也是要花時間的啊,咱自己寫一個類吧,以後就好重複用了,共享出來,要是誰也有這樣的要求就直接用吧!
public abstract class MyAnimationDrawable extends AnimationDrawable {
Handler finishHandler;// 判斷結束的Handler
public MyAnimationDrawable(AnimationDrawable ad) {
// 這裏得自己把每一幀加進去
for(int i = 0; i < ad.getNumberOfFrames(); i++) {
this.addFrame(ad.getFrame(i), ad.getDuration(i));
}
}
@Override
public void start() {
super.start();
/**
* 首先用父類的start()
* 然後啓動線程,來調用onAnimationEnd()
*/
finishHandler =new Handler();
finishHandler.postDelayed(
new Runnable() {
public void run() {
onAnimationEnd();
}
}, getTotalDuration());
}
/**
* 這個方法獲得動畫的持續時間(之後調用onAnimationEnd())
*/
public int getTotalDuration() {
int durationTime = 0;
for(int i = 0; i < this.getNumberOfFrames(); i++) {
durationTime +=this.getDuration(i);
}
return durationTime;
}
/**
* 結束時調用的方法,一定要實現
*/
abstract void onAnimationEnd();
}
/******************************************
***************** 使用方法 *****************
******************************************/
// 新建我們的類的實例
MyAnimationDrawable mad =new MyAnimationDrawable((AnimationDrawable) getResources().getDrawable(R.drawable.anim1)) {
@Override
void onAnimationEnd() {
// 實現這個方法,結束後會調用
}
};
// 把這個動畫“賜福”給某個ImageView
iv.setBackgroundDrawable(mad);
// 開始吧
mad.start();