Tôi đang tạo trò chơi trên Android và tôi cần thực hiện một số hành động nhất định khi người dùng cố gắng nhấn và giữ trên màn hình. Rất tiếc, tôi không tìm thấy bất kỳ phương pháp nào hoạt động trực tiếp với SurfaceView tùy chỉnh, hãy cho tôi biết nếu phương thức như vậy tồn tại :)Chạm dài trên bề mặt (android)
Vì vậy, tôi quyết định thử và thực hiện phát hiện cảm ứng dài từ trình xử lý sự kiện onTouch.
đây là mã của tôi:
@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;
này hoạt động, nhưng tôi có thể phát hiện nếu báo chí là một nền báo chí dài hay không chỉ khi người dùng ngừng chạm vào điện thoại. Vì vậy, nó không chính xác những gì tôi muốn. Tôi muốn nếu một bộ đếm thời gian sẽ bắt đầu khi người dùng chạm vào màn hình lần đầu tiên sau đó 800 ms đã trôi qua, phương thức LongTouch() được gọi. Nói cách khác, tôi không muốn phải kiểm tra thời gian trôi qua khi ACTION_UP kể từ ACTION_DOWN. Tôi tin rằng tôi nên sử dụng một thread cho bộ đếm thời gian nói nhưng tôi không thể làm cho nó hoạt động. Khi sử dụng mã sau, thông báo gỡ lỗi được hiển thị ngay sau khi tôi chạm vào màn hình:
@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;
}
}
}
}
Có ai có ý tưởng nào không? Một giải pháp khác cũng sẽ được hoan nghênh.
Cảm ơn.