android - 长按 surfaceView ( android )

标签 android multithreading touch long-press

我正在 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;
                    }
                }
            }
    }

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

谢谢。

最佳答案

其实很简单。在您的 View 的构造函数中,执行此操作:

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

你已经设置好了 ;).

关于android - 长按 surfaceView ( android ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3236195/

相关文章:

android - 使用 android webview 在浏览器中打开外部链接

Android NDK-安卓 : command not found

java - Java 中的线程池执行器

iOS 触摸阻塞问题

javascript - 在 YUI 3 上模拟触摸事件

javascript - React JS 滑动功能未按预期工作

Android - 沿 Y 轴旋转对象

android - Primefaces 菜单栏在移动浏览器中不起作用

c# - 从 GTK#Thread 访问 System.Drawing.Bitmap 抛出 Object Currently in use elshere 异常

c# - .NET 相当于 Android SDK AsyncTask(我需要在后台线程上执行操作时显示进度条)