Android中dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent事件分析

來源:互聯網
上載者:User

標籤:android   style   blog   http   io   ar   color   sp   on   

因為觸摸事件一定會觸發的ACTION是DOWN,這個也是最先觸發的,所以標題中的三個方法研究的也就是這個DOWN事件的傳遞情況。

下面直接貼出測試代碼,邊看邊講:

一個Activity,Activity中只有dispatchTouchEvent和onTouchEvent方法。

public class MainActivity extends Activity{    @Override    protected void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " dispatchTouchEvent");        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " onTouchEvent");        return super.onTouchEvent(event);    }}

三個自訂的控制項,前兩個是ViewGroup類型,後一個是view類型。

ViewGroup有dispatchTouchEvent,onInterceptTouchEvent和onTouchEvent方法。

public class MyLinearLayout1 extends LinearLayout{    public MyLinearLayout1(Context context)    {        super(context);        // TODO Auto-generated constructor stub    }    public MyLinearLayout1(Context context, AttributeSet attrs, int defStyle)    {        super(context, attrs, defStyle);        // TODO Auto-generated constructor stub    }    public MyLinearLayout1(Context context, AttributeSet attrs)    {        super(context, attrs);        // TODO Auto-generated constructor stub    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " dispatchTouchEvent");        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " onInterceptTouchEvent");        return super.onInterceptTouchEvent(ev);    }    @Override    public boolean onTouchEvent(MotionEvent event)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " onTouchEvent");        return super.onTouchEvent(event);    }}
public class MyLinearLayout2 extends LinearLayout{    public MyLinearLayout2(Context context)    {        super(context);        // TODO Auto-generated constructor stub    }    public MyLinearLayout2(Context context, AttributeSet attrs, int defStyle)    {        super(context, attrs, defStyle);        // TODO Auto-generated constructor stub    }    public MyLinearLayout2(Context context, AttributeSet attrs)    {        super(context, attrs);        // TODO Auto-generated constructor stub    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " dispatchTouchEvent");        return super.dispatchTouchEvent(ev);    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " onInterceptTouchEvent");        return true;    }    @Override    public boolean onTouchEvent(MotionEvent event)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " onTouchEvent");        return true;    }}
public class MyTextView extends TextView{    public MyTextView(Context context)    {        super(context);        // TODO Auto-generated constructor stub    }    public MyTextView(Context context, AttributeSet attrs, int defStyle)    {        super(context, attrs, defStyle);        // TODO Auto-generated constructor stub    }    public MyTextView(Context context, AttributeSet attrs)    {        super(context, attrs);        // TODO Auto-generated constructor stub    }    @Override    public boolean dispatchTouchEvent(MotionEvent event)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " dispatchTouchEvent");        return super.dispatchTouchEvent(event);    }    @Override    public boolean onTouchEvent(MotionEvent event)    {        // TODO Auto-generated method stub        System.out.println(getClass().getSimpleName() + " onTouchEvent");        return super.onTouchEvent(event);    }}
<com.testtouchevent.MyLinearLayout1 xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center"    android:orientation="vertical" >    <com.testtouchevent.MyLinearLayout2        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@android:color/darker_gray"        android:orientation="vertical"        android:padding="20dp" >        <com.testtouchevent.MyTextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:background="@android:color/white"            android:gravity="center"            android:padding="20dp"            android:text="me is textview" />    </com.testtouchevent.MyLinearLayout2></com.testtouchevent.MyLinearLayout1>

以上代碼中各控制項的相關方法執行順序是這樣的:

MainActivity                MyLinearLayout1                                             MyLinearLayout2                                            MyTextView

dispatchTouchEvent->dispatchTouchEvent->onInterceptTouchEvent->dispatchTouchEvent->onInterceptTouchEvent->dispatchTouchEvent

onTouchEvent<-        onTouchEvent<-                                                     onTouchEvent<-                                    onTouchEvent

dispatchTouchEvent:決定了事件是否繼續分發下去和是否響應事件,false:繼續分發,true:不繼續分發,此次事件到此結束,也不會有任何控制項執行onTouchEvent方法。

onInterceptTouchEvent:決定了是否攔截該事件,false:不攔截,true:攔截,此時當前控制項執行onTouchEvent方法。

onTouchEvent:決定了是否消費該事件,false:不消費,true:消費。

Android中dispatchTouchEvent、onInterceptTouchEvent和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.