私は 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;
}
}
}
}
誰かが何か考えを持っていますか? 他の解決策も歓迎します。
ありがとう。