Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中實現雙擊(多擊)事件

Android中實現雙擊(多擊)事件

編輯:關於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() {
			
			@Override
			public void run() {
				//
				try {
					Thread.sleep(500);
					firstClickTime = 0;
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
		}).start();
	}
雙擊事件(多擊事件)中有兩個重要的問題需要考慮:第一次點擊的時間,最後(如何知道是“最後”)點擊的時間;點擊一次後,等待一段時間(比如2s),再次雙擊(多擊)如何保證得到正確的響應。 上面的代碼解決了這兩個問題,但不夠效率,也很復雜。它是通過一個變量存儲第一次點擊的時間,通過判斷這個變量的大小來判斷是不是第二次點擊,解決第一個問題;再加上子線程的sleep方法,500ms內如果沒有第二次點擊,變量就重置了,解決了第二個問題。 但是這種方式解決雙擊事件還算湊合,那麼三擊、四擊……如何解決了?

第二種,換種方式存儲變量

	List times = new ArrayList();
	public void click2(View view) {
		times.add(SystemClock.uptimeMillis());
		if (times.size() == 2) {
			//已經完成了一次雙擊,list可以清空了
			if (times.get(times.size()-1)-times.get(0) < 500) {
				times.clear();
				Toast.makeText(this, "第二種雙擊方式", 0).show();
			} else {
				//這種情況下,第一次點擊的時間已經沒有用處了,第二次就是“第一次”
				times.remove(0);
			}
		}
	}



  在第二種方式中,使用List存放點擊時的時間。現在來分析一下這個實現的原理:

1、如何判斷是第二次點擊?

通過鏈表的長度,每次點擊list的長度加1,當為2時,表示點擊了兩次。

2、如何消除間隔一段時間的點擊事件的影響?

如果是正常的雙擊,點擊兩次就完成一次“輪回”,之前保存的時間數據已經使用完畢了,需要清除掉,具體操作就是將List清空。而如果是點擊一次後,第二次點擊相隔時間較長,那個第一次點擊的時間已經沒有用處了,就直接將第二次點擊視為“第一次”點擊,具體而言就是去掉第1次的點擊事件。
這個方法,比起第一種方法效率要好得多,而且非常容易擴展到三擊、四擊……事件。比如:
	List times = new ArrayList();
	public void click2(View view) {
		times.add(SystemClock.uptimeMillis());
		if (times.size() == 3) {
			if (times.get(times.size()-1)-times.get(0) < 500) {
				times.clear();
				Toast.makeText(this, "三擊方式", 0).show();
			} else {
				times.remove(0);
			}
		}
	}



改變的只是判斷條件。

第三種,谷歌程序員的寫法。

下面是谷歌所寫的三擊方法,我改寫成了雙擊的方法
	/**
	 * 雙擊事件、多擊事件
	 */
	//存儲時間的數組
	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();
		//雙擊事件的時間間隔500ms
		if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
            //雙擊後具體的操作
			//do
		}
	}
非常簡潔,思想差不多,不過谷歌工程師是利用數組移位操作來消除第二個問題的影響的。而要實現多擊事件,只需修改數組長度即可。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved