事件分發總結和驗證
一、分發機制總結
1、傳遞順序:Activity->PhoneWindow->DecorView->ViewGroup->View
2、三個方法:
* dispatchTouchEvent用來進行事件的分發。如果事件能夠傳遞給當前的View,那麼此方法一定會被呼叫,返回結果受當前View的onTouchEvent和下級View的dispatchTouchEvent方法的影響,表示是否消耗當前事件。
* onInterceptTouchEvent是用來判斷是否攔截某個事件,如果當前View攔截了某個事件,那麼在同一個事件序列當中,此方法不會被再次呼叫,返回結果表示是否攔截當前事件。預設返回false,返回true表示攔截。Activity和View中不存在onInterceptTouchEvent方法。
* onTouchEvent在dispatchTouchEvent方法中呼叫,用來處理點選事件,返回結果表示是否消耗當前的事件,如果不消耗,則在同一個事件序列中,當前View無法再次接受到事件。view中預設返回true,表示消費了這個事件。
3、onTouch和onTouchEvent的區別:
這兩個方法都是在View的dispatchTouchEvent中呼叫的,onTouch方法優先於onTouchEvent方法執行。如果在onTouch方法中通過返回true將事件消費掉,onTouchEvent將不會再執行。
4、ViewGroup 是根據 onInterceptTouchEvent 的返回值來確定是呼叫子View的 dispatchTouchEvent 還是自身的 onTouchEvent
二、結論驗證:
1、點選View,View的onTouchEvent返回true
整個流程從ActivitydispatchTouchEvent方法開始,到View的onTouchEvent消費事件結束。
流程圖:
注:view的dispatchTouchEvent是在ViewGroup的dispatchTouchEvent方法中被呼叫的。
Activity和ViewGroup之間事件傳遞需要通過PhoneWindow和DecorView
2、點選View,View的onTouchEvent返回false
整個流程從ActivitydispatchTouchEvent方法開始,到View的onTouchEvent,由於不消費事件,所以回傳給ViewGroup的onTouchEvent,同樣不消費。最後傳回Activity的onTouchEvent方法,整個流程結束。
流程圖:
3、點選View,ViewGroup將事件攔截
ViewGroup呼叫onInterceptTouchEvent返回true,將事件攔截,交由ViewGroup的onTouchEvent方法呼叫,預設返回false,不進行處理。再次回傳到Activity的onTouchEvent方法中。
4、點選View,onTouchEvent返回true或者false。給view設定點選事件
findViewById(R.id.id_touch_view).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.e("TouchView", "onClick: " );
}
});
結論:點選事件未執行,因為點選事件是在onTouchEvent方法的ACTION_UP中執行,返回true或者false,點選事件都執行不到
5、點選view,給view設定onTouchListener,並且返回true
findViewById(R.id.id_touch_view).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.e("TouchView", "onTouch: " );
return true;
}
});
此時View的onTouchEvent方法不會被呼叫,因為OnTouchListener優先順序比onTouchEvent要高,如果OnTouchListener返回true,則onTouchEvent不再呼叫。
相關推薦
事件分發總結和驗證
一、分發機制總結 1、傳遞順序:Activity->PhoneWindow->DecorView->ViewGroup->View 2、三個方法: * dispatchTouchEvent用來進行事件的分發。如果事件能夠傳遞
圖解 Android 事件分發機制 和 handler 機制
在Android開發中,事件分發機制是一塊Android比較重要的知識體系,瞭解並熟悉整套的分發機制有助於更好的分析各種點選滑動失效問題,更好去擴充套件控制元件的事件功能和開發自定義控制元件,同時事件分發機制也是Android面試必問考點之一,如果你能把下面的一些事件分發圖當場畫出來肯定加分不少。廢
Android View 的事件分發原理和滑動衝突分析
作為一名Android 開發者,每天接觸最多的就是 View 了。Android View 雖然不是四大元件,但其並不比四大元件的地位低。而 View 的核心知識點事件分發機制則是不少剛入門同學的攔路虎,也是面試過程中基本上都會問的。理解 View 的事件能夠讓你寫出更好自定義 View 以及解決滑動衝突。
Activity dispatchTouchEvent事件分發--總結(一)
先看一下除錯的堆疊資訊 MainActivity的dispatchTouchEvent的方法定義如下 @Override public boolean dispatchTouchEvent(MotionEvent event) { return super.dis
Android事件分發總結
從今天開始寫讀書筆記,希望自己每天都可以堅持下來,在Android開發的道路上越走越遠。 一、事件分發的物件及其方法。 Android事件分發的物件有2個,View和ViewGroup。 View的事件有2個:dispatchTouchEvent()
window.document的屬性、方法和事件的總結
http 兄弟節點 保留 前綴 ron 匹配 eno form link document屬性作為window對象的一個子對象被創建,是用於訪問頁面中所有元素的對象,這裏簡單整理下,方便學習js的朋友javascript中window.document的屬性、方法和事件的總
事件之分發總結
cti 上傳 android事 cancel dispatch GC 流程 默認 action 12.android事件處理涉及到的三個重要函數 事件分發:public boolean dispatchTouchEvent(MotionEvent ev) 當有監聽
總結oninput、onchange與onpropertychange事件的用法和區別
前端頁面開發的很多情況下都需要實時監聽文字框輸入,比如騰訊微博編寫140字的微博時輸入框hu9i動態顯示還可以輸入的字數。過去一般都使用onchange/onkeyup/onkeypress/onkeydown實現,但是這存在著一些不好的使用者體驗。比如onchange事件只在鍵盤或者滑鼠操作
js中的onclick事件和JQuery中的click方法以及on方法事件用法總結
1.onclick是繫結的事件(它是一個事件),注意該事件繫結只是JacaScript中有(js中的),Jquery中並沒有此事件,告訴瀏覽器在滑鼠點選時候要做什麼 2.click方法(jquery中的)作用是觸發onclick事件,只要執行了元素的click()方法,就會觸發onclick事件
Android : 事件分發,以及消除子控制元件和父控制元件互相的影響
效果圖 消除在上下滑的時候讓下面的listview控制元件不進行滑動 如題,先上xml的程式碼 父控制元件listview <?xml version="1.0" encoding="utf-8"?> <android.support.constraint.Con
cocos中的觀察者模式 以及"點選事件"的註冊和分發(個人理解)
一、控制元件的點選事件註冊與完成 在學習cocos引擎時,感覺觸控事件用的比較頻繁。 於是對各種觸控事件做一些小小的總結: cocos中的控制元件(按鈕,精靈,各種容器等)。在實際開發中發現他們都是可以新增點選事件的,可以通過設定setTouchEnabled()來開啟點
【Unity遊戲開發】用C#和Lua實現Unity中的事件分發機制EventDispatcher
一、簡介 最近馬三換了一家大公司工作,公司制度規範了一些,因此平時的業餘時間多了不少。但是人卻懶了下來,最近這一個月都沒怎麼研究新技術,部落格寫得也是拖拖拉拉,週六周天就躺屍在家看帖子、看小說,要麼就是吃雞,唉!真是罪過罪過。希望能從這篇部落格開始有些改善吧,儘量少玩耍
Android 事件分發機制總結篇
一、前言 事件分發是基礎的知識點,開發中會經常遇到,平時開發只是為了解決問題,片面的理解,不夠深入,不成體系。這兩天有點時間,從 View,ViewGroup 到 Activity 體系的學習總結一下。 二、View 事件 我們知道view事件處理順序是(Down,Mo
事件分發,以及消除子控制元件和父控制元件互相的影響
效果圖 消除在上下滑的時候讓下面的listview控制元件不進行滑動 如題,先上xml的程式碼 父控制元件listview <?xml version="1.0" encoding="utf-8"?> <android.support.
關於javascript事件總結和自己的心得體會
傳統事件 1、表單事件 Form元素:submit、reset 按鈕類表單元素:click 輸入、選擇框等元素:change 更換焦點:focus、blur,這兩個事件不會冒泡,focusin和focusout可以冒泡 文字輸入表單:input事件,在每次更改文字的時候都會
Touch事件傳遞流程、事件分發中的onTouch 和onTouchEvent 有什麼區別,又該如何使用?
Touch事件傳遞流程1.Touch事件型別 Touch事件被封裝成MotionEvent,使用者當前的touch事件主要型別有: ACTION_DOWN: 表示使用者開始觸控 ACTION_MOVE: 表示使用者在移動(手指或者其他)
Android 觸控事件分發和攔截機制
Android 開發中,很多情況下,我們需要對觸控事件進行處理,但是當面對錯綜複雜的 Android 佈局時,我們如何準確的將一個使用者的觸控事件傳遞到對應的控制元件中並讓它進行處理呢? 首先,我們先假設這裡有這樣一個佈局: 我們可以很清楚的看到,一個很
JS事件機制:事件繫結、事件監聽、事件委託(代理)和事件執行順序總結
JS 對於使用者的操作做出響應,就必須對DOM元素繫結事件處理函式 事件繫結 1、在DMO中直接繫結事件 <input type="button" value="click me"
Android自定義View之事件分發機制總結
事件序列 (1)手指接觸屏幕後會產生一系列事件,事件分為3種:ACTION_DOWN(手指剛剛接觸螢幕)、ACTION_MOVE(手指在螢幕移動)、ACTION_UP(手指從螢幕鬆開) (2)一個事件序列為ACTION_DOWN-->ACTION_MOV
事件分發系列—View中的dispatchTouchEvent和onTouchEvent分析
dispatchTouchEvent 話不多說直接上原始碼 /** * Pass the touch screen motion event down to the target view, or this * view if