2009-06-10 99 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将开始接收键事件,直到一些其他观点得到关注。