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方法才被執行。


免責聲明!

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



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