捕獲Android幀動畫的結束事件

在一個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();

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