android實現雙擊事件暨多擊事件詳解

最近在多擊事件上稍微研究瞭下,在此做簡要分析,供大傢吐槽參考

方法一: 將兩次點擊的時間間隔小於0.5s的默認為雙擊事件

 

 

mBtn1.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_DOWN:
					mLastTime = mCurTime;
					mCurTime = System.currentTimeMillis();

					if (mCurTime - mLastTime < 500) {
						Toast.makeText(MainActivity.this, 這就是傳說中的雙擊事件, 1)
								.show();
						return true;
					}
					break;

				default:
					break;
				}

				return false;
			}
		});

 

 

當然上面的方法也可以在OnClickListener中實現

 

mBtn1.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				mLastTime = mCurTime;
				mCurTime = System.currentTimeMillis();

				if (mCurTime - mLastTime < 500) {
					Toast.makeText(MainActivity.this, 這就是傳說中的雙擊事件, 1).show();
				}

			}
		});

方法二:看瞭方法一,大傢是不是覺得如果實現3擊事件的話會很麻煩,我也覺得會很麻煩,但大傢不用擔心,下面實現的方法將教大傢很容易的實現多擊事件

 

首先:實現雙擊事件

 

private long[] mHits = new long[2];

mBtn2.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				System.out.println( + mHits.length);
				System.arraycopy(mHits, 1, mHits, 0, mHits.length - 1);
				mHits[mHits.length - 1] = SystemClock.uptimeMillis(); // 系統開機時間
				if (mHits[0] >= (SystemClock.uptimeMillis() - 500)) {
					Toast.makeText(MainActivity.this, 這就是傳說中的雙擊事件, 1).show();
				}
			}
		});

 

SystemClock.uptimeMillis(); 系統時間,從cpu開啟時間就開始計時,不會出現自己設置時間導致程序跟隨系統時間出錯(如:有個程序,今天簽到得10積分,兩天後簽到得200積分,這是如果你設置系統時間為兩天後,如果程序不是使用上面的時間獲取方法,那麼他就會得到兩天後的積分,這樣作為程序開發者的我們就虧大瞭)

多擊實現:

 

private long[] mHits = new long[m];

其餘的代碼同上,隻需更改new long[m]的值,你設m為幾,他就是幾次點擊事件

 

 

下面簡要分析下三擊事件的實現原理

 

    System.arraycopy(src, srcPos, dst, dstPos, length)   //系統拷貝數組的api
    src:the source array to copy the content(拷貝的源數組)
    srcPos:the starting index of the content in src(從源數組的哪個位置開始拷貝)
    dst:the destination array to copy the data into(目標數組)
    dstPos:the starting index for the copied content in dst(從目標數組的哪個位置開始寫數據)
    length:the number of elements to be copied(拷貝的數據的個數)

 

上圖所畫是指三次間隔都成立(即成功)的情況下實現的三擊事件,當如果你前面點擊瞭兩次時間間隔短瞭,第三次卻明顯很長為3000ms,這時3000-500將不再小於1000,無法執行判斷中的語句if (mHits[0] >= (SystemClock.uptimeMillis() – 500)){執行不到 },這時你就必須重新開始連著點擊3次且時間間隔小於500ms,才能再次實現三擊事件

 

 

 

 

 

 

 

 

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。