import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
public class MainActivity extends Activity {
private int tapCount = 0;
private long tapCounterStartMillis = 0;
//detect any touch event in the screen (instead of an specific view)
@Override
public boolean onTouchEvent(MotionEvent event) {
int eventaction = event.getAction();
if (eventaction == MotionEvent.ACTION_UP) {
//get system current milliseconds
long time= System.currentTimeMillis();
//if it is the first time, or if it has been more than 3 seconds since the first tap ( so it is like a new try), we reset everything
if (tapCounterStartMillis == 0 || (time-tapCounterStartMillis > 3000) ) {
tapCounterStartMillis = time;
tapCount = 1;
}
//it is not the first, and it has been less than 3 seconds since the first
else{ // time-tapCounterStartMillis < 3000
tapCount ++;
}
if (tapCount == 5) {
//do whatever you need
}
return true;
}
return false;
}
5条答案
按热度按时间odopli941#
请阅读代码中的注解,它相当直接
vbkedwbf2#
我的解决方案类似于Andres's。倒计时开始时,你抬起手指第一次,也就是说,当我认为水龙头完成。这与单击类似,释放鼠标按钮时会发生单击。第一次提升3秒后,计数器复位。另一方面,安德烈斯的方法使用的逻辑是将手指放在屏幕上。它还使用了一个额外的线程。
我的逻辑是许多可能的逻辑之一。另一种合理的方法将是在敲击流中在3秒内检测5次连续敲击。考虑:
第二次至第六次敲击包括在小于3秒内的一组五次敲击;在我的方法中,这将不会被检测到。要检测到这一点,您可以使用固定大小为5的FIFO队列,并记住最后5个时间戳:该序列正在增加。当您收到一个新的点击,您检查是否1)有至少5个点击发生,和2)最旧的时间戳是不是旧的3秒。
无论如何,回到第一个逻辑,将此代码放入
Activity
中:注意:您可能也希望在配置更改时保留一些状态。就像数学家会说的那样,我把它作为一个练习留给读者
g0czyy6m3#
覆盖Activity
onTouchEvent()
方法以从屏幕接收触摸事件。每次用户点击屏幕时,如果是第一次触摸,则递增一个变量并推迟3秒内的Runnable,如果3秒过去,则触摸事件将被清除,什么也不会发生。线程检查触摸事件数是否为5或更多,如果它们发生在3秒之前,则变量未被清除并且if(touchEvent >= 5)
条件为真。我还没试过!但它是完全异步的:)koaltpgm4#
如果要在Kotlin中检测视图上的触摸
在Java中:https://stackoverflow.com/a/21104386/10784151
deyfvvtc5#