原標題: Mastering the Android Touch System函數
原文地址: speakerd.s3.amazonaws.compost
原文做者: Dave Smithspa
全部的 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
事件,以後的其餘事件將不會繼續傳遞到子視圖處理。任何未消耗的事件都會傳遞到 Activity
的 onTouchEvent()
後結束。若是仍是沒有被消費的話,則會返回到 Activity
的 onTouchEvent()
函數,能夠經過對外的 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