定时touchEvents

时间:2017-11-03 20:24:09

标签: java android multithreading runnable ontouchlistener

好的,所以我有一个附加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的地方吗?

1 个答案:

答案 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结构中。