作者laugher (.。oO)
看板AndroidDev
標題[問題] 動畫結束後移除ImageView的問題
時間Tue Jun 11 19:54:08 2013
我想弄成像是發射子彈的動畫
每一個子彈就是一個ImageView
問題出在子彈若連發(第一發動畫未結束第二發就跟著打出去)程式就當掉
出現NullPointerException的錯誤
但如果第一發動畫結束後再發射第二發就沒有問題
雖然知道出錯在程式哪一行,但確不知道為什麼錯
程式碼架構大至上是這樣
/* fl_anim 被包在 fl_base 裡 */
FrameLayout fl_base = (FrameLayout) getLayoutInflater().inflat.....(略)
FrameLayout fl_anim = (FrameLayout) fl_base.findViewById.....(略)
//用來判斷動畫結束的是哪個 ImageView
Map<Animation, ImageView> hmap = new HashMap<Animation, ImageView>();
public void shoot() {
ImageView imgv_bullet = new ImageView(this);
/* imgv_bullet 的基本設定...(略) */
fl_anim.addView(imgv_bullet);
TranslateAnimation ta = new TranslateAnimation(0, 100, 0, 100);
/* ta 的基本設定...(略) */
ta.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationEnd(Animation an) {
ImageView imgv = hmap.get(an);
//導致程式當掉的這行
fl_anim.removeView(imgv);
}
/* 其它事件沒更動...(略) */
}
);
hmap.put(ta, imgv_bullet);
imgv_bullet.startAnimation(ta);
}
為了測試,我先把出錯的那行註掉
結果子彈連發很順利,只是發完後就停在畫面上無法消失
原本以為是 Listener 裡面的 imgv 沒正確抓到
所以我用 imgv.setX(300) 來測,結果所有的點(imgv)不管有沒有連發都正確執行
而且也不可能是 fl_anim 變 NullPointer,因為子彈有正常出現
換句話說所有的值都有正確抓到
錯誤訊息裡提到的錯誤程式地點也都不在我的程式裡
可否請問問題到底出在哪裡?
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.116.72.155
※ 編輯: laugher 來自: 140.116.72.155 (06/11 20:01)
1F:推 lakestshana:試看看用RunOnUiThread中做removeview動作 06/12 23:58
2F:→ laugher:可以了, 真是感謝 06/13 12:15
3F:→ laugher:不好意思, 我剛接觸Android不久, 可否請教這原理? 謝謝 06/13 12:19
4F:→ laugher:還是有點問題, 偶爾會出現沒移除的情況 06/13 13:07
5F:推 lakestshana:因為UI的動作只能在MainThread做執行 06/13 20:23
6F:→ lakestshana:在子Thread 只能調用runonuithread在做UI的動作 06/13 20:25
7F:→ laugher:了解, 如果我一口氣打出很多子彈的話就會開始發生移除不乾 06/13 22:55
8F:→ laugher:淨的情況, 請問這是因為子Thread回傳訊息來不及的關係嗎? 06/13 22:55