【譯】系統的學習 Android Touch

駐坑大使發表於2019-06-04

原標題: 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 結束

  • 事件是從 ActivitydispatchTouchEvent() 開始,通過檢視從上而下的形式傳遞,父檢視(ViewGroups)將事件分發給子檢視,事件在傳遞的過程是可以隨時攔截的。它會沿著關係鏈向下傳遞直到該事件被消費掉。任何未攔截的事件都會傳遞到 ActivityonTouchEvent() 後結束。

  • 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 的標識。

錯誤的檢視案例

【譯】系統的學習 Android Touch

有趣的檢視案例

【譯】系統的學習 Android Touch

【譯】系統的學習 Android Touch

處理自定義事件

處理觸控事件 -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頁會陸續補上。如果有翻譯不妥的地方,歡迎大家提出,一起完善。

歡迎關注 Kotlin 中文社群!

中文官網:www.kotlincn.net/

中文官方部落格:www.kotliner.cn/

公眾號:Kotlin

知乎專欄:Kotlin

CSDN:Kotlin中文社群

掘金:Kotlin中文社群

簡書:Kotlin中文社群

相關文章