Android對點擊事件的處理


前兩天想研究下Android點擊事件是如何處理的,翻譯了一篇國外文件,英文原版下載地址附在文后。
 
Android怎樣處理點擊事件

Android的點擊事件封裝在MotionEvent中,點擊事件可以分為以下幾種:

 - ACTION_DOWN
 - ACTION_UP
 - ACTION_MOVE
 - ACTION_POINTER_DOWN
 - ACTION_POINTER_UP
 - ACTION_CANCEL
點擊事件的數據包括:
 - Touch loaction
 - Number of pointers (fingers)
 - Event time
一次點擊事件起始於ACTION_DOWN,結束於ACTION_UP。
最先對點擊事件進行響應的是Activity中的dispatchTouchEvent()回調,並且從父視圖向子視圖依次傳遞,在傳遞過程中可以隨時對點擊事件進行攔截處理。
點擊事件自頂向下傳遞並逆向返回,直至點擊事件被處理,在View中必須通過處理ACTION_DOWN動作來響應點擊事件;為了提高效率,一旦點擊事件被處理,則不會繼續向下傳遞。
任何未被處理的點擊事件最終都會返回到Activity中的onTouchEvent()回調函數,並於此結束。
可以在任何View/ViewGroup中通過使用可選的外部OnTouchListener來截取點擊事件。
 
Activity.dispatchTouchEvent():
此回調通常是最先被調用的,並向關聯於當前用戶界面的根視圖(root view)發送點擊事件。
 - onTouchEvent()
    如果沒有視圖(view)處理點擊事件,此回調將被調用,通常是最后才被調用的。
 
View.dispatchTouchEvent():
此回調首先向監聽器(listener)發送點擊事件,如果存在監聽器,則調用回調View.OnTouchListener.onTouch();如果點擊事件沒有被處理,則通過回調View.onTouchEvent()來處理點擊事件。
 
ViewGroup.dispatchTouchEvent():
 - onInterceptTouchEvent()
    此函數的功能:
        - 檢查是否需要取代子視圖
        - 向活動的子視圖傳遞ACTION_CANCEL事件
        - 一旦子序列中的事件全部處理完畢返回true值
 - 對各個子視圖按照添加的順序進行反轉
        - 如果點擊事件是相關的(在view視圖內),調用child.dispatchTouchEvent()
        - 如果點擊事件沒有被前一個視圖處理掉,分發給下一個視圖。
 - 如果沒有子視圖處理監聽事件,監聽器得到了通過下面回調處理點擊事件的機會:
        OnTouchListener.onTouch()
 - 如果沒有監聽器,或者點擊事件沒有被處理,調用下面的函數:
        onTouchEvent()
被攔截的點擊事件會停止向子視圖傳遞
 
 
 
 
通常的點擊事件處理方式
處理點擊事件可通過子類重寫onTouchEvent()方法和提供OnTouchListener監聽器來實現。
 
銷毀點擊事件
    - Return true with ACTION_DOWN to show interest
        即使對ACTION_DOWN不感興趣,也要返回true。
    - 對於其他事件,返回true會簡單地停止進一步的處理。
 
ViewConfiguration中可用的有用常量
    - getScaledTouchSlop()
        Distance  move events might vary before they should be considered a drag
        位移事件在被認定為拖拽前可能存在變數
    - getScaledMinimumFlingVelocity()
        用來獲取點擊移動速度,系統據此判斷是慢速拖拽還是快速拖拽
    - getLongPressTimeout()
        系統據此獲取的數據判斷是否是長點擊事件
    - 根據每個設備的分辨率顯示不同的數值
 
轉發點擊事件
    - 調用目標視圖的dispatchTouchEvent()
    - 避免直接調用目標視圖的onTouchEvent()
 
偷取點擊事件
    - 子類重寫onInterceptTouchEvent()
    - 當你要接管點擊處理事件時返回true
        所有針對當前動作的子序列點擊事件將直接進入到onTouchEvent()回調中,將不再為每一個事件調用onInterceptTouchEvent()回調函數
    - 任何當前目標視圖均會接收到ACTION_CANCEL
 
用戶點擊事件處理警告
在任何需要的時候調用上層處理方法
    - View.onTouchEvent()對點擊事件進行了大量的狀態管理(pressed,checked,etc.),如果自己抓取每個點擊事件將會遺漏許多內容。
 
通過溢出檢測(slop check)進行ACTION_MOVE保護
    - 避免手指接觸面積過大或手指滑動
 
一直處理ACTION_CANCEL事件
    - 有用戶操作動作(如滾動)的視圖容器會盜取點擊事件,需要對狀態進行重置。
    - 牢記進行CANCEL操作后將不會收到任何其他消息。
 
不要對點擊事件進行截取除非你准備對他們進行處理
    - 截取點擊事件是不可逆的
 
多點點擊事件處理
MotionEvent.getPointerCount()
    - 獲取當前屏幕上的觸點個數
 
使用ACTION_POINTER_DOWN和ACTION_POINTER_UP事件來檢測第二觸點
    - MotionEvent.getActionMasked()
    - MotionEvent.getActionIndex()
 
使用MotionEvent方法從觸點列表參數中獲取特定的觸點數據
    - 方法中不傳遞參數通常返回第一個觸點的數據
 
批處理
為了提高效率,ACTION_MOVE事件可以在一個MotionEvent內進行批次處理
最新的點擊事件通常可以通過如下的標准方法獲取到相應數據:
    - getX(), getY(), getEventTime()
發生於當前和上一個ACTION_MOVE之間的點擊事件可以通過以下獲取歷史數據的方法獲得:
    -getHistoricalX(), getHistoricalY(), getHistoricalEventTime()
    - getHistoricalSize()方法返回進行批處理點擊事件的個數
當所有的點擊事件在時間上具有最大精度時可以對所有點擊事件進行重構
 
系統點擊處理程序
如果沒有必要,不用立即跳轉到自定義點擊處理程序。
OnClickListener
OnLongClickListener
OnTouchListener
OnTouchListener
    - 監控個別的沒有子類的MotionEvent
    - 可以在監聽器中處理點擊事件
    - 可以事先清空視圖的處理器
OnScrollListener/View.onScrollChanged()
    - 處理具有滾動功能的視圖發生了滾動事件
 
處理更復雜的點擊交互
手勢檢測器
    - onDown(), onSingleTapUp(), onDoubleTap()
    - onLongPress()
    - onScroll() (用戶用手機拖拽)
    - onFling() (用戶快速結束拖拽)
平衡手勢檢測器
    - onScaleBegin(), onScale(), onScaleEnd()
通過OnTouchListener()或onTouchEvent()處理
 
 
 
 http://files.cnblogs.com/files/cn-bloger/PRE_andevcon_mastering-the-android-touch-system.pdf
 
 
 
 
 
 
 
 
 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM