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

來源:互聯網
上載者:User

標籤: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中實現雙擊(多擊)事件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.