標籤:android 雙擊事件 三擊事件
第一種,容易想到的方法。 要實現雙擊,你需要儲存第一次點擊時的時間,需要使用到變數,之後便是與第二次點擊時的時間比較,看時間間隔是否在你設定的時間內(比如500ms)。
long firstClickTime = 0;long secondClickTime = 0;public void click1(View view) {if (firstClickTime > 0) {secondClickTime = SystemClock.uptimeMillis();if (secondClickTime - firstClickTime < 500) {Toast.makeText(this, "第一種雙擊方式", 0).show();}firstClickTime = 0;return ;}firstClickTime = SystemClock.uptimeMillis();new Thread(new Runnable() {@Overridepublic void run() {//try {Thread.sleep(500);firstClickTime = 0;} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();} 雙擊事件(多擊事件)中有兩個重要的問題需要考慮:第一次點擊的時間,最後(如何知道是“最後”)點擊的時間;點擊一次後,等待一段時間(比如2s),再次雙擊(多擊)如何保證得到正確的響應。 上面的代碼解決了這兩個問題,但不夠效率,也很複雜。它是通過一個變數儲存第一次點擊的時間,通過判斷這個變數的大小來判斷是不是第二次點擊,解決第一個問題;再加上子線程的sleep方法,500ms內如果沒有第二次點擊,變數就重設了,解決了第二個問題。 但是這種方式解決雙擊事件還算湊合,那麼三擊、四擊……如何解決了?
第二種,換種方式儲存變數
List<Long> times = new ArrayList<Long>();public void click2(View view) {times.add(SystemClock.uptimeMillis());if (times.size() == 2) {if (times.get(1)-times.get(0) < 500) {times.clear();Toast.makeText(this, "第一種雙擊方式", 0).show();} else {times.clear();times.add(SystemClock.uptimeMillis());}}} 在第二種方式中,使用List存放點擊時的時間。現在來分析一下這個實現的原理: 1、如何判斷是第二次點擊? 通過鏈表的長度,每次點擊list的長度加1,當為2時,表示點擊了兩次。 2、如何消除間隔一段時間的點擊事件的影響? 如果是正常的雙擊,點擊兩次就完成一次“輪迴”,之前儲存的時間資料已經使用完畢了,需要清除掉,具體操作就是將List清空。而如果是點擊一次後,第二次點擊相隔時間較長,那個第一次點擊的時間已經沒有用處了,就直接將第二次點擊視為“第一次”點擊,具體而言就是清空List,add第二次的點擊事件。
這個方法,比起第一種方法效率要好得多,而且非常容易擴充到三擊、四擊……事件。比如:
List<Long> times = new ArrayList<Long>();public void click2(View view) {times.add(SystemClock.uptimeMillis());if (times.size() == 3) {if (times.get(2)-times.get(0) < 500) {times.clear();Toast.makeText(this, "第一種雙擊方式", 0).show();} else {times.clear();times.add(SystemClock.uptimeMillis());}}} 真正需要改變的只是兩個判斷條件!!
第三種,Google程式員的寫法。 下面是Google所寫的三擊方法,我改寫成了雙擊的方法
/** * 雙擊事件、多擊事件 *///儲存時間的數組long[] mHits = new long[2];public void doubleClick() {// 雙擊事件響應/** * arraycopy,拷貝數組 * src 要拷貝的源數組 * srcPos 源數組開始拷貝的下標位置 * dst 目標數組 * dstPos 開始存放的下標位置 * length 要拷貝的長度(元素的個數) * *///實現數組的移位操作,點擊一次,左移一位,末尾補上當前開機時間(cpu的時間)System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);mHits[mHits.length - 1] = SystemClock.uptimeMillis();//雙擊事件的時間間隔500msif (mHits[0] >= (SystemClock.uptimeMillis() - 500)) { //雙擊後具體的操作//do}} 非常簡潔,思想差不多,不過Google工程師是利用數組移位操作來消除第二個問題的影響的。而要實現多擊事件,只需修改數組長度即可。
Android中實現雙擊(多擊)事件