我正在 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/