Android View的onTouchEvent和OnTouch區別

來源:互聯網
上載者:User

標籤:android   http   io   ar   color   sp   java   for   on   

還是以自訂的TestButton為例。

我們可以通過重寫onTouchEvent方法來處理諸如down move up的訊息:

 

?
123456789101112131415161718 public class TestButton extends Button {     public TestButton(Context context) {        super(context);        // TODO Auto-generated constructor stub    }         public TestButton(Context context, AttributeSet attributeSet) {        super(context, attributeSet);        // TODO Auto-generated constructor stub    }         @Override    public boolean onTouchEvent(MotionEvent event) {        boolean value = super.onTouchEvent(event);        System.out.println("super.onTouchEvent: " + value+ " event: " + event.getAction());        return value;    }

也可以通過實現OnTouchListener的介面,然後設定TestButton的onTouchListener可以達到同樣的目的

?
1234567 class OnTouchListenerTest implements View.OnTouchListener{    @Override    public boolean onTouch(View v, MotionEvent event) {        return false;    }     }
?
123 TestButton b = (TestButton)findViewById(R.id.button);OnTouchListenerTest listener = new OnTouchListenerTest();b.setOnTouchListener(listener);

但上述兩種監聽有什麼區別呢?

 

先看一下Android源碼中對於View中dispatchTouchEvent的實現:

 

?
123456789101112131415 public boolean dispatchTouchEvent(MotionEvent event){    ... ...    if(onFilterTouchEventForSecurity(event)){        ListenerInfo li = mListenerInfo;        if(li != null && li.mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED            && li.mOnTouchListener.onTouch(this, event)) {            return true;        }        if(onTouchEvent(event)){            return true;        }    }    ... ...    return false;}


可以看到onTouchListener的介面的優先順序是要高於onTouchEvent的,假若onTouchListener中的onTouch方法返回true,

 

表示此次事件已經被消費了,那onTouchEvent是接收不到訊息的。

因為Button的performClick是利用onTouchEvent實現,假若onTouchEvent沒有被調用到,那麼Button的Click事件也無法響應。


綜合來講:

onTouchListener的onTouch方法優先順序比onTouchEvent高,會先觸發。

假如onTouch方法返回false會接著觸發onTouchEvent,反之onTouchEvent方法不會被調用。

內建諸如click事件的實現等等都基於onTouchEvent,假如onTouch返回true,這些事件將不會被觸發。

Android View的onTouchEvent和OnTouch區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.