原標題: Mastering the Android Touch System
原文地址: speakerd.s3.amazonaws.com
原文作者: Dave Smith
主題涵蓋
- 觸控系統概述
- 觸控事件框架
- 處理自定義觸控事件
- 系統提供的觸控機制
- 系統提供的手勢機制
如何處理 Andriod 觸控事件
-
每個使用者的觸控事件都被包裝為動作事件
-
描述使用者當前的操作
ACTION_DOWN
ACTION_UP
ACTION_MOVE
ACTION_POINTER_DOWN
ACTION_POINTER_UP
ACTION_CANCEL
-
包括原資料的事件
- 觸控位置
- 觸控點的數量(手指)
- 事件發生的時間
-
一個”手勢”從
ACTION_DOWN
開始到ACTION_UP
結束 -
事件是從
Activity
的dispatchTouchEvent()
開始,通過檢視從上而下的形式傳遞,父檢視(ViewGroups
)將事件分發給子檢視,事件在傳遞的過程是可以隨時攔截的。它會沿著關係鏈向下傳遞直到該事件被消費掉。任何未攔截的事件都會傳遞到Activity
的onTouchEvent()
後結束。 -
Activity.dispatchTouchEvent()
,總是被首先呼叫,然後將事件傳送到附加的Window
根檢視中,onTouchEvent()
,如果沒有檢視消耗事件是呼叫,總是持續的呼叫狀態中。 -
View.dispatchTouchEvent()
,如果存在,則首先將事件傳送給偵聽器View.OnTouchListener.onTouch()
,如果沒有消耗則處理事件本身,View.onTouchEvent()
。 -
ViewGroup.dispatchTouchEvent()
中的onInterceptTouchEvent()
,會檢查它是否應該取代子檢視。而對於每個子檢視,如果事件是相關的(內部檢視)則以相反的順序新增它們。如果child.dispatchTouchEvent()
以前沒有處理則繼續傳遞到下一個檢視,直到該事件被消耗(與View相同)。事件攔截(onInterceptTouchEvent()
返回true
)會將ACTION_CANCEL
傳遞給子 Activity,所有即將的事件都由ViewGroup直接處理。子檢視可以呼叫requestDisallowTouchIntercept()
來阻止onInterceptTouchEvent()
繼續持有當前手勢的時間。 每個新手勢(ACTION_DOWN
)都會重置fragmework
的標識。
錯誤的檢視案例
有趣的檢視案例
處理自定義事件
處理觸控事件 -Subclass重寫onTouchEvent() - 提供OnTouchListener •消費事件
- 使用ACTION_DOWN返回true以顯示興趣 •即使您對ACTION_DOWN不感興趣,也請返回true
- 對於其他事件,返回true只會停止進一步處理 •ViewConfiguraCon -getScaledTouchSlop()中可用的有用常量 •距離移動事件可能會在被視為拖動之前發生變化-getScaledMinimumFlingVelocity() •系統認為拖動為速度的速度-getScaledPagingTouchSlop() •觸控用於水平分頁手勢的slop(即ViewPager) - 為每個裝置的密度縮放顯示的值
處理事件
子類重寫 onTouchEvent()
方法,並提供一個 OnTouchListener
。使用 ACTION_DOWN
並返回 true
表示消耗該事件即使您對 ACTION_DOWN
不大算消耗該事件也請返回 true
,對於其他事件,返回 true
會停止事件的進一步處理。
在 ViewConfiguration
中有用的常量:
getScaledTouchSlop()
:移動距離的事件可能會在其拖動之前就會發生變化getScaledMinimumFlingVelocity()
:系統認為快速滑動是一種慣性拖拽getScaledPagingTouchSlop()
:事件池使用一個水平分頁手勢(i.e. ViewPager)
以上內容是 Mastering the Android Touch System PPT 1-10頁的內容總結,文章有些術語及方法釋明需要調整校對。剩下的10頁會陸續補上。如果有翻譯不妥的地方,歡迎大家提出,一起完善。