2017-04-17 65 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?這種方式更簡單。 –