2010-04-13 42 views
7

我以爲我已經理解了這個問題,但在這裏有些錯誤。當用戶(我到目前爲止)試圖按鍵時,沒有什麼事情發生,而且我很難理解我錯過了什麼。在Android中處理用戶輸入事件的基本知識是什麼?

在我提出一些代碼來幫助澄清我的問題之前,請考慮這一點:我使用Android的Lunar Lander示例來製作我的第一個「真實」Android程序。當然,在那個例子中,有一個LunarView類和嵌套在LunarThread中的類。在我的代碼中,這些類的等價物分別是Graphics和GraphicsThread。

此外,我可以使2D精靈動畫在Android上很好。我有一個Player類,讓我們說GraphicsThread有一個被稱爲「播放器」的Player成員。這個類有四個座標 - x1,y1,x2和y2 - 並且它們定義了一個矩形,在這個矩形中繪製精靈。我已經制定出來,以便我能夠完美地處理。每當調用doDraw(Canvas canvas)方法時,它只會查看這些座標的值並相應地繪製出精靈。

現在讓我們說 - 這不是我想要做的與該程序 - 我試圖讓程序,它所做的一切是顯示播放器精靈在屏幕的一個位置直到第一次用戶按下Dpad的左鍵。然後,該位置將被改變爲屏幕上的另一個設置位置,並且該精靈將在該位置總是繪製該程序的其餘部分。

另請注意,Graphics中的GraphicsThread成員稱爲「線程」,並且GraphicsThread中的SurfaceHolder成員稱爲「mSurfaceHolder」。

所以考慮Graphics類此方法:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent msg) { 
    return thread.keyDownHandler(keyCode, msg); 
} 

也請考慮在課堂GraphicsThread這個方法:

boolean keyDownHandler(int keyCode, KeyEvent msg) { 
    synchronized (mSurfaceHolder) { 
     if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { 
      player.x1 = 100; 
      player.y1 = 100; 
      player.x2 = 120; 
      player.y2 = 150; 
     } 
    } 
    return true; 
} 

那麼,現在假設玩家的座標開始爲(200,200,220 ,250),爲什麼按Dpad時他不會做任何不同的事情:左?

謝謝!

+2

放下一些破發點,並確保你到達那裏的球員位置被設置的代碼行。如果正在設置值,那麼在設置位置之後很有可能您的繪圖方法未被調用。如果沒有,那麼你要麼檢查錯誤的密鑰代碼,要麼你有一個線程問題。 – 2010-04-13 22:57:09

+1

你確定你正在重新繪製畫布嗎?調用invalidate()強制一個視圖被繪製 – YGL 2010-05-19 17:50:32

回答

1

之前,我會擔心實際運動之類,我會考慮日誌...

喜歡的東西:

Log.d("lunar", "keyCode = ["+String.valueOf(keyCode)+"] // msg = ["+String.valueOf(msg)+"]"); 

在這樣做之前,我可以感受系統註冊的內容,然後再擔心我所做的註冊數據......之後,您可以決定是否發送正確的內容,然後擔心線程工作等。 。

希望這可以幫助診斷等(所有這一切都被寫寫意,可能含有錯誤)