Android–事件觸發機制

來源:互聯網
上載者:User

我總結: 這裡的傳回值有一個"消費(consume)"的概念. 如果放事件(down, move,up)想像為商品就很好理解了. true代表我消費了.(這個商品我要了,你就不能要了,所以就不向後傳遞). false代表我沒消費(這個商品我不要, 我向後傳遞給你,你愛要不要).
MotionEvent事件在onInterceptTouchEvent()、onTouchEvent()中的行程順序

onInterceptTouchEvent() 用於處理事件並改變事件的傳遞方向。處理事件這個不用說了,你在函數內部編寫代碼處理就可以了。而決定傳遞方向的是傳回值,返回為false時事件會傳遞 給子控制項的onInterceptTouchEvent();傳回值為true時事件會傳遞給當前控制項的onTouchEvent(),而不在傳遞給子控 件,這就是所謂的Intercept(截斷)。

onTouchEvent() 用於處理事件,傳回值決定當前控制項是否消費(consume)了這個事件。可能你要問是否消費了又區別嗎,反正我已 經針對事件編寫了處理代碼?答案是有區別!比如ACTION_MOVE或者ACTION_UP發生的前提是一定曾經發生了ACTION_DOWN,如果你 沒有消費ACTION_DOWN,那麼系統會認為ACTION_DOWN沒有發生過,所以ACTION_MOVE或者ACTION_UP就不能被捕獲。

本文源地址:http://www.cnblogs.com/rocky_yi/archive/2011/01/21/1941522.html# ,轉載請註明出處!
<?xml version="1.0" encoding="utf-8"?>
<com.touchstudy.LayoutView1 xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<com.touchstudy.LayoutView2
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center">
<com.touchstudy.MyTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv"
android:text="AB"
android:textSize="40sp"
android:textStyle="bold"
android:background="#FFFFFF"
android:textColor="#0000FF"/>
</com.touchstudy.LayoutView2>
</com.touchstudy.LayoutView1>

在沒有重寫onInterceptTouchEvent()和onTouchEvent()的情況下(他們的傳回值都是false), 對上面這個布局,MotionEvent事件的行程順序如下:

當某個控制項的onInterceptTouchEvent()傳回值為true時,就會發生截斷,事件被傳到當前控制項的onTouchEvent()。如我們將LayoutView2的onInterceptTouchEvent()傳回值為true,則傳遞流程變成:

 如果我們同時將LayoutView2的onInterceptTouchEvent()和onTouchEvent()設定成true,那麼 LayoutView2將消費被傳遞的事件,同時後續事件(如跟著ACTION_DOWN的ACTION_MOVE或者ACTION_UP)會直接傳給 LayoutView2的onTouchEvent(),不傳給其他任何控制項的任何函數。同時傳遞給子空間一個ACTION_CANCEL事件。傳遞流程 變成(圖中沒有畫出ACTION_CANCEL事件):

                        

樣本對應的Java代碼(來自http://blog.csdn.net/ddna/archive/2010/04/11/5473293.aspx)
onInterceptTouchEvent和onTouchEvent調用時序
分類: Android開發綜合 2010-04-11 18:01 14949人閱讀 評論(28) 收藏 舉報

onInterceptTouchEvent和onTouchEvent調用時序

onInterceptTouchEvent()是ViewGroup的一個方法,目的是在系統向該ViewGroup及其各個childView觸發onTouchEvent()之前對相關事件進行一次攔截,Android這麼設計的想法也很好理解,由於ViewGroup會包含若干childView,因此需要能夠統一監控各種touch事件的機會,因此純粹的不能包含子view的控制項是沒有這個方法的,如LinearLayout就有,TextView就沒有。

onInterceptTouchEvent()使用也很簡單,如果在ViewGroup裡覆寫了該方法,那麼就可以對各種touch事件加以攔截。但是如何攔截,是否所有的touch事件都需要攔截則是比較複雜的,touch事件在onInterceptTouchEvent()和onTouchEvent以及各個childView間的傳遞機制完全取決於onInterceptTouchEvent()和onTouchEvent()的傳回值。並且,針對down事件處理的傳回值直接影響到後續move和up事件的接收和傳遞。

關於傳回值的問題,基本規則很清楚,如果return true,那麼表示該方法消費了此次事件,如果return false,那麼表示該方法並未處理完全,該事件仍然需要以某種方式傳遞下去繼續等待處理。

SDK的解釋:
public boolean onInterceptTouchEvent (MotionEvent ev)
Since: API Level 1

Implement this method to intercept all touch screen motion events. This allows you to watch events as they are dispatched to your children, and take ownership of the current gesture at any point.

Using this function takes some care, as it has a fairly complicated interaction with View.onTouchEvent(MotionEvent), and using it requires implementing that method as well as this one in the correct way. Events will be received in the following order:
You will receive the down event here.
The down event will be handled either by a child of this view group, or given to your own onTouchEvent() method to handle; this means you should implement onTouchEvent() to return true, so you will continue to see the rest of the gesture (instead of looking for a parent view to handle it). Also, by returning true from onTouchEvent(), you will not receive any following events in onInterceptTouchEvent() and all touch processing must happen in onTouchEvent() like normal.
For as long as you return false from this function, each following event (up to and including the final up) will be delivered first here and then to the target's onTouchEvent().
If you return true from here, you will not receive any following events: the target view will receive the same event but with the action ACTION_CANCEL, and all further events will be delivered to your onTouchEvent() method and no longer appear here.
Parametersev The motion event being dispatched down the hierarchy.

Returns
Return true to steal motion events from the children and have them dispatched to this ViewGroup through onTouchEvent(). The current target will receive an ACTION_CANCEL event, and no further messages will be delivered here.

由於onInterceptTouchEvent()的機制比較複雜,上面的說明寫的也比較複雜,總結一下,基本的規則是:

1. down事件首先會傳遞到onInterceptTouchEvent()方法

2. 如果該ViewGroup的onInterceptTouchEvent()在接收到down事件處理完成之後return false,那麼後續的move, up等事件將繼續會先傳遞給該ViewGroup,之後才和down事件一樣傳遞給最終的目標view的onTouchEvent()處理。

3. 如果該ViewGroup的onInterceptTouchEvent()在接收到down事件處理完成之後return true,那麼後續的move, up等事件將不再傳遞給onInterceptTouchEvent(),而是和down事件一樣傳遞給該ViewGroup的onTouchEvent()處理,注意,目標view將接收不到任何事件。

4. 如果最終需要處理事件的view的onTouchEvent()返回了false,那麼該事件將被傳遞至其上一層次的view的onTouchEvent()處理。

5. 如果最終需要處理事件的view 的onTouchEvent()返回了true,那麼後續事件將可以繼續傳遞給該view的onTouchEvent()處理。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.