編輯:關於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.
以下過程來用一張圖來結尾:
至此,先分析到這裡,確實有點晚了。~@~
作為一名Android開發人員,相信大家對圖片OOM的問題已經耳熟能詳了,關於圖片緩存和解決OOM的開源項目也是相當的多,被大家熟知的就是Un
廣播作為android的四大組件之一,適用的地方還是很多,多用來特定條件情況下的通知。例如,開機,鬧鈴,電池電量過低等等。但還可以自定義廣播,用來兩個應用程序的通知。曾經
如何使用在Eclipse中已經有AJDT插件集成了AspectJ編譯器的使用和關鍵字的聲明。但是在Android Studio中沒有這樣的官方插件。因此,這裡講一下如何在
1.回顧上篇學習了 Android 系統服務的 10個實例 ,當然 還有更多的系統服務沒有使用;留下來的遺憾就是,昨晚沒有將demo下載地址分享出去; &nbs