好的,所以我有一个附加TouchListener的TextView。我们的想法是在700毫秒内按下TextView 5次,如果发生这种情况,Activity会触发一个将用户发送到另一个活动的意图。我存储用于跟踪时间的变量和活动顶部的计数器,如下所示:
int counter = 0; // for touch event
long start = 0, stop = 0;
onTouch方法如下所示:
View.OnTouchListener listener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
start += event.getEventTime();
}
if(event.getAction() == MotionEvent.ACTION_UP){
stop += event.getEventTime();
counter++;
Toast.makeText(mContext, "Counter is : " + counter, Toast.LENGTH_SHORT).show();
if(counter == 5){
Toast.makeText(mContext, "stop - start " + (stop - start), Toast.LENGTH_LONG).show();
if((stop - start) < 700) {
counter = 0; start = 0; stop = 0; // reset counter and time variables
Intent intent = new Intent(mContext, MainActivity.class);
startActivity(intent);
} else {
counter = 0; start = 0; stop = 0; // reset counter and time variables
}
}
}
return true;
}
};
mAppTitle.setOnTouchListener(listener);
mAppTitle是TextView。问题是我希望第一次触摸记录一个时间,一旦该时间超过700毫秒,变量应重置为0.现在,如果用户只点击4次,则计数器保持在4并且不会重置直到你再次点击它。我知道使用Threads和Runnables可能有更好的方法来实现它,但我是Java / Android的新手,而且那里的文档至少对我来说很糟糕。
编辑:我刚刚意识到getEventTime()实际上并没有启动计时器,它只是记录了ACTION_DOWN和ACTION_UP之间的持续时间。这必须是你设置Thread而不是getEventTime的地方吗?
答案 0 :(得分:0)
我曾经不得不解决同样的问题。我是通过使用ArrayBlockingQueue
s填充Timestamp
来完成的。
声明队列(例如,在onCreate()
中):
private ArrayBlockingQueue<Timestamp> timeStampQueue;
初始化队列并设置其容量:
timeStampQueue = new ArrayBlockingQueue<>(4); // number of clicks necessary - 1
在侦听器内部,填充队列(在任何情况下)并启动意图(如果当前事件的时间小于.7秒&#34;离开&#34;从第一个事件开始) :
Timestamp timestamp = new Timestamp(SystemClock.elapsedRealtime());
if (timeStampQueue.remainingCapacity() == 0) {
Timestamp oldestTimestamp = timeStampQueue.poll();
if ((timestamp.getTime() - oldestTimestamp.getTime()) < 700) {
Intent intent = new Intent(mContext, MainActivity.class);
startActivity(intent);
}
}
timeStampQueue.add(timestamp);
如果您只是在视图中聆听某种触摸或点击事件,则无需区分操作类型。
使用计时器在此处不起作用,原因如下:如果在第一个事件发生时启动计时器,您可以检查在开始运行后是否还发生了四个事件。但是,如果在阈值范围内的事件少于四个,则无法将第二个事件的时间与第六个事件的时间进行比较,因为您没有跟踪第二个事件的时间。您必须启动四个计时器,或者为了保持更高效率,保留四个时间戳 - 在队列中的FIFO结构中。