2009-06-10 103 views
2

我正在創建一個擴展SurfaceView的自定義Widget,我計劃將其用於相機預覽。在SurfaceView中處理事件

在主要活動中,我嘗試實現一些事件偵聽器,但無法捕捉任何事件。

這是我嘗試添加一個事件監聽器的代碼部分:

videoPreview = (CaptureView)findViewById(R.id.capturePreview); 

    videoPreview.setOnKeyListener(new OnKeyListener(){ 
     public boolean onKey(View v, int keyCode, KeyEvent event){ 
      switch(keyCode) 
      { 
      case KeyEvent.KEYCODE_CAMERA: 
       videoPreview.TakePicture(); 
       return true; 
      } 
      return false; 
     } 
    }); 

如果我按下一個按鈕,logcat的輸出「繼續等待分派鍵」行。

有誰知道如何在使用SurfaceView類的主要活動中實現事件監聽器?

謝謝!

回答

1

我不確定這是否是您正在尋找的答案,但可能值得嘗試。

對於特定視圖的OnKeyListener只有在該視圖具有焦點時按下鍵時纔會被調用。你可以嘗試確保它有重點有:

videoPreview.requestFocus(); 

或將OnKeyListener上包含一切(包括CaptureView)佈局(如LinearLayout)。喜歡的東西:

LinearLayout ll = (LinearLayout) findViewById(R.id.VideoContainer); 
ll.setOnClickListener(new OnKeyListener(){ 
    public boolean onKey(View v, int keyCode, KeyEvent event) { 
     // ... 
    } 
); 
0

由於看來,你有你自己的自定義類設置爲「CaptureView」你也可以覆蓋View.onKeyDown和View.onKeyUp在你的「CaptureView」級。這一直在我的基於SurfaceView的遊戲中發揮作用,並且允許您執行任何額外的處理,您可能需要在停止和結束事件之間進行處理。如果按下此鍵,而View具有焦點

View.onKeyDown()

3

OnKeyListener特定View纔會被調用。對於一個普通的SurfaceView被聚焦首先需要成爲焦點:

view.setFocusable(true); 
view.setFocusableInTouchMode(true); 

而且比你可以通過調用requestFocus()集中的觀點:

videoPreview.requestFocus(); 

之後,你的OnKeyListener將開始接收鍵事件,直到一些其他觀點得到關注。