[問題] 動畫結束後移除ImageView的問題

看板AndroidDev作者 (.。oO)時間11年前 (2013/06/11 19:54), 編輯推噓2(206)
留言8則, 2人參與, 最新討論串1/1
我想弄成像是發射子彈的動畫 每一個子彈就是一個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)

06/12 23:58, , 1F
試看看用RunOnUiThread中做removeview動作
06/12 23:58, 1F

06/13 12:15, , 2F
可以了, 真是感謝
06/13 12:15, 2F

06/13 12:19, , 3F
不好意思, 我剛接觸Android不久, 可否請教這原理? 謝謝
06/13 12:19, 3F

06/13 13:07, , 4F
還是有點問題, 偶爾會出現沒移除的情況
06/13 13:07, 4F

06/13 20:23, , 5F
因為UI的動作只能在MainThread做執行
06/13 20:23, 5F

06/13 20:25, , 6F
在子Thread 只能調用runonuithread在做UI的動作
06/13 20:25, 6F

06/13 22:55, , 7F
了解, 如果我一口氣打出很多子彈的話就會開始發生移除不乾
06/13 22:55, 7F

06/13 22:55, , 8F
淨的情況, 請問這是因為子Thread回傳訊息來不及的關係嗎?
06/13 22:55, 8F
文章代碼(AID): #1Hjm_Z0z (AndroidDev)