標籤: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事件分析