2

我正在创建一个扩展 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 类在主要活动中实现事件侦听器?

谢谢!

4

3 回答 3

3

仅当在具有焦点时按下键时才会调用OnKeyListener特定对象。要使泛型成为焦点,它首先需要具有焦点:ViewViewSurfaceView

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

而不是你可以通过调用使视图集中requestFocus()

videoPreview.requestFocus();

之后,您OnKeyListener将开始接收关键事件,直到其他视图获得焦点。

于 2009-11-24T15:02:06.610 回答
1

我不确定这是否是您正在寻找的答案,但可能值得一试。

仅当在该OnKeyListener视图具有焦点时按下该键时才会调用特定视图的 。您可以尝试确保它专注于:

videoPreview.requestFocus();

或将 放在包含其他所有内容(包括)OnKeyListener的布局(例如)上。就像是:LinearLayoutCaptureView

LinearLayout ll = (LinearLayout) findViewById(R.id.VideoContainer);
ll.setOnClickListener(new OnKeyListener(){
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        // ...
    }
);
于 2009-06-10T22:44:57.587 回答
0

由于您似乎有自己的名为“CaptureView”的自定义类设置,您还可以在“CaptureView”类中覆盖 View.onKeyDown 和 View.onKeyUp。这在我的基于 SurfaceView 的游戏中一直有效,并允许您在向下和向上事件之间进行任何您可能想做的额外处理。

查看.onKeyDown()

于 2009-06-11T21:39:32.960 回答