【问题标题】:Processing events in SurfaceView在 SurfaceView 中处理事件
【发布时间】:2010-11-01 19:59:50
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: android event-handling surfaceview


    【解决方案1】:

    特定ViewOnKeyListener 只有在View 具有焦点时按下键才会被调用。要使通用SurfaceView 获得焦点,它首先需要具有焦点:

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

    您可以通过调用requestFocus() 使视图聚焦:

    videoPreview.requestFocus();
    

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

    【讨论】:

      【解决方案2】:

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

      特定视图的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) {
              // ...
          }
      );
      

      【讨论】:

        【解决方案3】:

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

        View.onKeyDown()

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-29
          • 2020-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多