android onTouchEvent和setOnTouchListener中onTouch的區別
android中onTouchEvent和setOnTouchListener中onTouch的區別可以有些人並不瞭解,其實要說明白這個問題先要說下android的事件傳遞機制。
首先看下以下的程式碼1,這段程式碼反應了View處理事件的過程:
程式碼1:
public boolean dispatchTouchEvent(MotionEvent event) {
if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {
return true;
}
return onTouchEvent(event);
}
在程式碼1中有一點首先需要明確,那就是如果dispatchTouchEvent返回值為true則本次事件被系統消耗掉(就是被控制元件處理了), 然後一個新的事件會被傳入,如果dispatchTouchEvent返回值為false,則不會有新的事件被傳入。
好,明白了這一點再看那個程式碼1中if語句後面的條件mOnTouchListener != null && mOnTouchListener.onTouch(this, event),mOnTouchListener 物件其實不就是你寫的監聽器物件嗎?比如下面程式碼2的這個匿名物件。
程式碼2:
xxxView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
return true;
}
});
好,我們再看下程式碼2中onTouch事件中的返回值,如果程式碼2 return true則代表什麼呢?代表程式碼1中將不會執行 return onTouchEvent(event);語句,這也就是說這次系統事件會被消耗掉,將會再次執行dispatchTouchEvent這個方法。
如果程式碼2 return false則代表程式碼1會執行onTouchEvent(event);這個方法,本次事件是否會被消耗掉將取決於onTouchEvent的返回值。
做個小總結其實就是如果setOnTouchListener中的onTouch方法返回值是true則onTouchEvent方法將不會被執行;只有當setOnTouchListener中的onTouch方法返回值是false時onTouchEvent方法才被執行。
以上說的情況適用於View物件而不是ViewGroup物件,ViewGroup物件下次再分析。
相關文章
- Android自定義OnTouch事件Android事件
- Android 開發中 getContext 和 getActivity的區別AndroidContext
- Android主專案和Module中R類的區別Android
- Android核心和Linux核心的區別AndroidLinux
- Android之android:theme設定在Application 和 Activity的區別AndroidAPP
- JavaScript中==和===的區別JavaScript
- Linux中“>”和“>>”的區別Linux
- Python 中 is 和 == 的區別Python
- Python中is和==的區別Python
- mysql中“ ‘ “和 “ ` “的區別MySql
- JavaScript中for in 和for of的區別JavaScript
- Js中for in 和for of的區別JS
- mysql中!=和is not的區別MySql
- Android之Intent的setClass和setClassName的區別AndroidIntent
- APP測試中IOS和Android的區別,有哪些注意點?APPiOSAndroid
- Android中drawable和mipmap到底有什麼區別Android
- 【我的Android進階之旅】解決重寫onTouch事件提示的警告:onTouch should call View#performClick when a click is detectedAndroid事件ViewORM
- PHP 中的 -> 和 :: 的區別PHP
- Java開發和Android開發的區別JavaAndroid
- Android程式(Processes)和任務(tasks)的區別Android
- SQL中where和on的區別SQL
- java 中equals和==的區別Java
- deferred中done和then的區別
- Android中asset資料夾和raw資料夾區別Android
- JS中的!=、== 、!==、=== 的用法和區別JS
- Android Studio之Gradle和Gradle外掛的區別AndroidGradle
- Android之drawable和mipmap目錄區別Android
- MySQL中datetime和timestamp的區別MySql
- Python中字典和json的區別!PythonJSON
- Lua中pair和ipair的區別AI
- js中null和undefined的區別JSNullUndefined
- js中undefined和null的區別JSUndefinedNull
- ts中的type 和 interface 區別
- Nginx中root和alias的區別Nginx
- Spring中@Component和@Configuration的區別Spring
- js中AMD和CMD的區別JS
- php中TCP和UDP的區別PHPTCPUDP
- 程式中fork和vfork的區別
- python中break和continue的區別Python