系統的學習 Android Touch 事件傳遞機制

原標題: Mastering the Android Touch System函數

原文地址: speakerd.s3.amazonaws.compost

原文做者: Dave Smithspa

如何處理 Andriod 觸摸事件

全部的 Touch 事件都封裝爲 MotionEvent 對象,包括觸摸的位置,多點觸控和事件發生的時間。 事件的基礎類型分爲 ACTION_DOWN ACTION_UP ACTION_MOVE ACTION_POINTER_DOWN ACTION_POINTER_UP ACTION_CANCEL,而且每一個事件都是從 ACTION_DOWN 開始到 ACTION_UP 結束 。對事件的處理包括三類,分別爲傳遞——dispatchTouchEvent() 函數、攔截——onInterceptTouchEvent()函數、消費——onTouchEvent() 函數和 OnTouchListener.net

事件傳遞的流程

事件從 Activity.dispatchTouchEvent() 開始傳遞,若是事件在傳遞的過程當中沒有被消費,會從最上層的父視圖(ViewGroup) 開始按照從上而下的順序傳遞事件直到該事件被消費,在傳遞的過程當中子視圖能夠隨時消耗事件,若是父視圖消費了 ACTION_DOWN 事件,以後的其餘事件將不會繼續傳遞到子視圖處理。任何未消耗的事件都會傳遞到 ActivityonTouchEvent() 後結束。若是仍是沒有被消費的話,則會返回到 ActivityonTouchEvent() 函數,能夠經過對外的 OnTouchListener 來消費 View/ViewGroup 的任意事件,若是 View.dispatchTouchEvent() 存在的話會將事件交由 View.OnTouchListener.onTouch() 處理,若是事件沒有被消費則其自身來負責事件流程。code

若是在 ViewGroup.dispatchTouchEvent() 的事件傳遞過程當中,若是父視圖的 onInterceptTouchEvent() 中消費了事件則子視圖的 onInterceptTouchEvent() 不會在接收到任何的事件,直接由父視圖本身進行處理。對於每一個子視圖會以相反的順序添加它們,若是在以前沒有進行處理,則交由子級的視圖進行消費觸摸事件。cdn

事件攔截的時候在 onInterceptTouchEvent() 函數返回一個 true,子視圖會收到一個 ACTION_CANCEL 事件後則認爲該事件已經結束,不在執行下一步的處理,而接下來收到的全部事件則返回 ViewGroup 來進行處理。固然子視圖能夠調用 requestDisallowTouchIntercept() 來阻礙父視圖的 onInterceptTouchEvent() 對當前所滑動的手勢進行攔截。對象

錯誤的視圖案例

有趣的視圖案例

處理事件

子類重寫 onTouchEvent() 方法,並提供一個 OnTouchListener。使用 ACTION_DOWN 並返回 true 表示消耗該事件即便您對 ACTION_DOWN不大算消耗該事件也請返回 true,對於其餘事件,返回 true 會中止事件的進一步處理。blog

ViewConfiguration 中有用的常量:事件

  • getScaledTouchSlop():移動距離的事件可能會在其拖動以前就會發生變化
  • getScaledMinimumFlingVelocity():系統認爲快速滑動是一種慣性拖拽
  • getScaledPagingTouchSlop():事件池使用一個水平分頁手勢(i.e. ViewPager)

以上內容是 Mastering the Android Touch System PPT 1-10頁的內容總結,文章有些術語及方法釋明須要調整校對。剩下的10頁會陸續補上。若是有不妥的地方,歡迎你們提出,一塊兒完善。ci


歡迎關注 Kotlin 中文社區!

中文官網:www.kotlincn.net/

中文官方博客:www.kotliner.cn/

公衆號:Kotlin

知乎專欄:Kotlin

CSDN:Kotlin中文社區

掘金:Kotlin中文社區

簡書:Kotlin中文社區

相關文章
相關標籤/搜索