2017-04-17 149 views
1

我的应用程序具有可单击的View,然后单击该View时应调用handleClickEvent()。我尝试将OnClickListener设置为视图,但当用户双击视图时,handleClickEvent()会被调用两次。我不希望它在双击过程中被调用两次。即我想handleClickEvent()被称为一次单击和双击。Android避免双击双击轻触,无需使用onSingleTapConfirmed

我做了一些研究,发现了这个问题:Android detecting double tap without single tap first我尝试了答案中的建议,即用onSingleTapConfirmed()方法实现了一个GestureDetector。这工作,但我注意到,与使用OnClickListener相比,响应时间有明显的延迟。我认为这是因为onSingleTapConfirmed()仅在系统通过等待某个特定时间段确认这是一次单击之后才被调用。

无论如何要实现这一点没有明显的延迟?我能想到的另一个选项是有一个lastClickedTimeStamp成员变量,比较当前点击的时间与lastClickedTimeStamp,如果它在某个阈值内,则不执行任何操作。

我想知道是否还有其他选择?

谢谢!

回答

2

我会做它设置一个状态变量作为一项长期的,并呼吁它timeOfLastTouch,它在每个OnClickListener函数把这个代码设置为0,然后将他们的方式

long currentTime = System.currentTimeMillis(); 
if (timeOfLastTouch + 100 < currentTime) { 
    // code 
    timeOfLastTouch = System.currentTimeMillis(); 
} 
+0

谢谢!是的,我认为这会起作用。我只是想知道是否有内置的东西可以做到。如果没有,我会继续采用这种方法。 – HeyThere

0

您可以尝试使用GestureDetector.SimpleOnGestureListener并将其与onTouchEvent结合使用。

private GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { 
    @Override 
    public boolean onSingleTapConfirmed(MotionEvent e) { 
     Log.d("SingleTap", " is detected"); 
     return true; 
    } 

    @Override 
    public boolean onDoubleTap(MotionEvent e) { 
     Log.d("DoubleTap", " is detected"); 
     return true; 
    } 
}); 

然后卸下onClickListener并在该视图

yourView.setOnTouchListener(new View.OnTouchListener() { 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     return gestureDetector.onTouchEvent(event); 
    } 
}); 

你可以参考设置触摸事件Detecting Common Gestures

+0

正如我在问题中提到的,我已经尝试过这种方法。它可以工作,但用户点击视图和调用handleClickEvent()之间有明显的延迟。因此,我正在寻找一种可能的替代方法。谢谢! – HeyThere

+0

我的不好。我没有注意到上面的链接。如果是这样的话,当handleClickEvent被调用时,为什么不将视图设置为clickable(false),并在完成时将其设置为true?这种方式更简单。 –