2009-06-10 14 views
2

Ich erstelle ein benutzerdefiniertes Widget, das SurfaceView erweitert und ich plane, es für die Kameravorschau zu verwenden.Verarbeitung von Ereignissen in SurfaceView

In der Hauptaktivität habe ich versucht, einige Event-Listener zu implementieren, kann aber kein Ereignis abfangen.

Dies ist der Teil des Codes, wo ich einen Ereignis-Listener hinzuzufügen versucht:

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; 
     } 
    }); 

Wenn ich eine Taste, um die LogCat Ausgänge drücken „Fortsetzung warten Schlüssel zu versendenden“ -Zeile.

Kann jemand Event-Listener in Hauptaktivität mithilfe von SurfaceView-Klassen implementieren?

Danke!

Antwort

1

Ich bin mir nicht sicher, ob dies die Antwort ist, die Sie suchen, aber es könnte einen Versuch wert sein.

Die OnKeyListener für eine bestimmte Ansicht wird nur aufgerufen, wenn die Taste gedrückt wird, während diese Ansicht den Fokus hat. Sie könnten zu gewährleisten versuchen, dass es mit Fokus hat:

videoPreview.requestFocus(); 

oder setzen Sie den OnKeyListener auf das Layout (zB LinearLayout), die alles andere enthält (einschließlich des CaptureView). Etwas wie:

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

Da es scheint, dass Sie Ihre eigenen benutzerdefinierten Klasse Setup mit dem Namen „Capture“ Sie könnten auch View.onKeyDown und View.onKeyUp in Ihrem „Capture“ Klasse außer Kraft setzen. Dies hat in meinen SurfaceView-basierten Spielen immer funktioniert und erlaubt Ihnen, jede zusätzliche Verarbeitung, die Sie in der Zeit zwischen dem Down- und Up-Event durchführen möchten, vorzunehmen.

View.onKeyDown()

3

Die OnKeyListener für ein bestimmtes View wird nur aufgerufen werden, wenn die Taste gedrückt wird, während die View Fokus hat. Für eine generisches SurfaceView zu fokussierte es muss zuerst fokussierbar sein:

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

Und als Sie die Ansicht von requestFocus() Aufruf konzentriert machen:

videoPreview.requestFocus(); 

Danach Ihre OnKeyListener starten Schlüsselereignis empfangen, bis eine andere Ansicht wird fokussiert.