Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android View框架總結(七)View事件分發機制

Android View框架總結(七)View事件分發機制

編輯:關於Android編程

View布局告一段落,從本篇開始View事件相關分析,今天分析的是View的事件分發機制(PS:本篇文章中源碼均是android 6.0,請知曉)

View 事件的分發機制 dispatchTouchEvent onInterceptTouchEvent onTouchEvent 案例

事件通常重要的有如下三種:
MotionEvent.ACTION_DOWN 按下View,是所有事件的開始
MotionEvent.ACTION_MOVE 滑動事件
MotionEvent.ACTION_UP 與down對應,表示抬起
事件的響應原理:
在android系統中,最廣泛應用的就是監聽、回調,進而形成了事件響應的過程。通俗就是說,你出去度假,提前預定過某酒店並注冊,你在去那兒時,就能辦入往手續,不用重新注冊。立刻享用你的房間就行。
首先,我們要熟悉dispatchTouchEvent和onTouchEvent兩個方法,話不多說,read the fucking source

View.java -> dispatchTouchEvent()

這裡寫圖片描述
這裡寫圖片描述

View.java -> onTouchEvent()

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

以上代碼補充點:一個clickable或者longclickable的View是一直要消費Touch事件的,而一般的View既不是clickable也不是longclickable的(即不會消費Touch事件,只會執行ACTION_DOWN而不會執行ACTION_MOVE和ACTION_UP) Button是clickable的,可以消費Touch事件,但是我們可以通過setClickable()和setLongClickable()來設置View是否為clickable和longClickable。當然還可以通過重寫View的onTouchEvent()方法來控制Touch事件的消費與否

View.java -> CheckForTap()<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160823/20160823091125411.png" title="\" />

View.java -> checkForLongClick()

這裡寫圖片描述

View.java.$CheckForLongPress -> run()

這裡寫圖片描述

View.java.$CheckForLongPress -> performClick()

這裡寫圖片描述

這裡寫圖片描述

看個小例子,我們知道通常來說,Button、ImageView、TextView等控件都是繼承父類View來實現的。RelativeLayout、LinearLayout、FrameLayout等布局都是繼承父類ViewGroup來實現的,下面選 Button來演示View事件分發,當然我也會切換TextView,來看看它們是否有不同之處:
MainActivity,給EventButton設置了OnTouchListener監聽,同時它本身有onTouchEvent,及onDispatchTouchEvent

這裡寫圖片描述
這裡寫圖片描述

這是一個自定義的button

這裡寫圖片描述
這裡寫圖片描述

布局文件

這裡寫圖片描述

運行在studio,在手機上如圖:

這裡寫圖片描述

點擊按鈕,看日志輸出:

這裡寫圖片描述

可以看到,執行過程為
dispatchTouchEvent() -> setOnTouchListener() -> onTouchEvent()

如果手指一直長按,超過系統認為的時間,那麼就認為是一次長按鍵,可以發現是在down時觸發的,這和我們分析源代碼時,是對應起來的,當UP時,觸發onClick
在這說下,如果上面的EventButton繼承TextView的話,按下抬起,會有一個特別現象,我可以告訴大家現象:就是只有dispatchTouchEvent ACTION_DOWN,onTouch ACTION_DOWN,onTouchEvent ACTION_DOWN這三個,你移動,或者抬起,是沒有MOVE,或者UP的,這個答案,我下篇開頭告訴大家(細心同學在本篇中也可找到答案,嘿嘿)。

這裡寫圖片描述

從以上log可看出,設置了onLongClickListener是先執行的,那麼要想執行點擊事件,這個View就必須要消費ACTION_DOWN和ACTION_MOVE事件,並且沒有設置OnLongClickListener的情況下,如果設置了OnLongClickListener的情況下,需要onLongClick()返回false才能執行到onClick()方法,也許你又會納悶,一般的View默認是不消費touch事件的,這不是和你上面說的相違背嘛,我們要向執行click事件必須要調用setOnClickListener()來設置OnClickListener接口,看下這個callback:

這裡寫圖片描述

也就是說,這個view如果不是/clickable的,在設轉置setOnClickListener時,會設置一個clickable為true.

以下過程來用一張圖來結尾:

這裡寫圖片描述

至此,先分析到這裡,確實有點晚了。~@~

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved