RxComboDetector:Android view點擊“連擊”檢測

jopen 8年前發布 | 9K 次閱讀 安卓開發 Android開發 移動開發

今天迷迷糊糊聽見iOS同事對PM說“連擊檢測”其實只需要傳一個參數就行了,我大為震驚,iOS竟有如此炫酷的API,Android似乎沒有呀!在google和github搜索兩次之后無果,我決定自己實現一個連擊檢測的庫。因為主要使用RxJava實現,所以命名為 RxComboDetector , github 源碼地址

效果有圖有真相

原理

基本思想非常簡單,如果本次點擊事件發生的時間,距離上次點擊事件之間的時間差小于某個閾值,就判定為屬于連擊。

具體實現上采用了多個RxJava的operator:

  • 利用 RxBinding ,把View的點擊事件轉化為 Void 事件流,這里并未直接依賴RxBinding庫,而是把View點擊事件相關的兩個類摘了出來,以避免多余的依賴;當然源碼中加入了相應的版權聲明(Apache V2);
  • 利用 map 操作符,把 Void 轉化為 1 ,表示1次連擊;
  • 利用 timestamp 操作符,為每次點擊事件加上時間戳;
  • 利用 scan 操作符,檢查本次點擊事件和上次點擊事件的時間戳,并決定是否屬于連擊,設置連擊次數加1,或者重置為1;這里和Rx官方文檔的例子用法不完全一樣,文檔中是以遞歸求和舉的例子,但是scan操作符正好可以保留本次和上次發射的兩個對象,完全符合這里的需求,所以采用;
  • 再次利用 map 操作符,把 Timestamped<Integer> 轉化為 Integer ;
  • 利用 filter 操作符,過濾掉連擊次數小于目標值的事件;

實現細節

RxComboDetector 的創建采用builder模式進行創建,完整使用代碼如下:

使用builder來配置連擊判斷最大時間間隔,以及過濾掉低連擊事件的閾值。

此外,上一小節中描述的operator操作代碼并不在 start 函數中,而是封裝在了一個static的 detect 方法中,這是為了便于進行測試,一方面和View的點擊事件解耦,邏輯完全是Rx事件流的操作,只需mock事件源即可;另一方面也無需mock構造 RxComboDetector 時的View參數,簡化測試代碼。

最后, RxComboDetector 只是一個事件的檢測類,并沒有炫酷的UI效果,所以我使用了 rebound 庫來實現具有物理真實感的View動畫效果。

最后的最后,demo中的小黃笑臉來自 YOLO 的logo。

來自: http://blog.piasy.com/Android-View-Click-Combo-Detector/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!