【问题标题】:Long Touch on a surfaceView ( android )SurfaceView 上的长按 (android)
【发布时间】:2011-03-15 06:03:22
【问题描述】:

我正在 Android 上制作游戏,当用户尝试长按屏幕时,我需要执行某些操作。不幸的是,我还没有找到任何直接与自定义 SurfaceView 一起使用的方法,请随时告诉我是否存在这样的方法:)

所以我决定尝试从 onTouch 事件监听器实现长触摸检测。

这是我的代码:

@Override
    public boolean onTouch(View v, MotionEvent event)
    {
        long touchDuration = 0;


            if ( event.getAction() == MotionEvent.ACTION_DOWN )
            {
                //Start timer
                touchTime = System.currentTimeMillis();


            }else if ( event.getAction() == MotionEvent.ACTION_UP )
            {
                //stop timer
                touchDuration = System.currentTimeMillis() - touchTime;

                if ( touchDuration < 800 )
                {
                    onShortTouch(event,touchDuration);
                }else
                {
                    onLongTouch(event,touchDuration);
                }
            }
        }

        return true;

这可行,但我可以检测到按下是否是长按,或者仅在用户停止触摸手机时才能检测到。所以这不是我想要的。我更希望在用户第一次触摸屏幕时启动计时器,然后一旦经过 800 毫秒,就会调用 LongTouch() 方法。换句话说,我不想检查自 ACTION_DOWN 以来 ACTION_UP 已经过去了多长时间。我相信我应该为所述计时器使用线程,但我无法使其工作。使用以下代码时,一触屏就会显示调试信息:

        @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        long touchDuration = 0;

            TouchThread touchThread = new TouchThread();

            if ( event.getAction() == MotionEvent.ACTION_DOWN )
            {
                //Start timer
                touchTime = System.currentTimeMillis();
                touchThread.setEvent(event);
                touchThread.run();  
            }

        return true;
    }


    private class TouchThread extends Thread
    {

            public MotionEvent event = null;

            public void setEvent(MotionEvent e)
            {
                event = e;
            }

            @Override
            public void run()
            {
                long startTime = System.currentTimeMillis();
                long time = 0;

                while(event.getAction() == MotionEvent.ACTION_DOWN)
                {
                    time = System.currentTimeMillis() - startTime;
                    if( time > 800 )
                    {
                        System.out.println("LOOONG CLICK!!");
                        return;
                    }
                }
            }
    }

有人知道吗?也欢迎其他解决方案。

谢谢。

【问题讨论】:

    标签: android multithreading touch long-press


    【解决方案1】:

    当您还想进行一些手动事件处理时,一个不错的选择是 GestureDetector 类:http://developer.android.com/reference/android/view/GestureDetector.html

    我如何使用它是在构造函数中创建一个 GestureDetector 实例,实现我感兴趣的方法,然后在 onTouchEvent() 方法的开头执行以下操作:

        if (gestureDetector.onTouchEvent(event)) {
            return true;
        }
    

    这意味着在大多数情况下,当检测到手势会中止您的其余触摸处理时。但是,长按有点不同,因为长按方法不返回值。在这种情况下,我只是在某个地方设置了一个布尔值,当触发长按时我会在稍后在触摸事件处理方法中检查(如有必要)。

    【讨论】:

      【解决方案2】:

      您可以做的一件事是在 SurfaceView 上设置 OnLongClickListener。

      mySurfaceView.setOnLongClickListener(l);
      

      然后在你的 SurfaceView 中,你需要重写 onTouchEvent :

      public boolean onTouchEvent(MotionEvent event) {
          super.onTouchEvent(event);
          return true;
      }
      

      【讨论】:

      • 谢谢super.onTouchEvent(event); 是我的关键。
      【解决方案3】:

      其实很简单。在视图的构造函数中,执行以下操作:

      setOnLongClickListener(new View.OnLongClickListener() 
      {
         public boolean onLongClick(View v) {
              Log.v( "debug", "LONG CLICK!" );
              return true;
           }
        }
      );
      

      然后覆盖onTouchEvent:

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            super.onTouchEvent(event);
        }
      

      你已经准备好了;)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-02
        • 2015-05-06
        • 2011-11-27
        • 1970-01-01
        相关资源
        最近更新 更多