MainActivity如下:
package com.cn; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; /** * Demo描述: * http://blog.csdn.net/lfdfhl/article/details/8921438 * 在此基础上继续学习和认识Android事件传递机制 * 认识事件传递的详细过程 * * Demo构成: * 一个普通的Activity,自定义Button. * 在自定义Button中覆写dispatchTouchEvent和onTouchEvent * 其返回值均为默认值,所以均为true. * 在Activity中为自定义Button注册TouchListener.并且覆写 * 该Activity的dispatchTouchEvent和onTouchEvent. * 因为自定义Button的onTouchEvent默认返回为true. * 表示事件已经消耗,不会继续传递,所以Activity中的 * onTouchEvent方法不会调用 * * * 即Touch事件的处理顺序为: * 1 Activity的dispatchTouchEvent()方法 * 2 自定义Button的dispatchTouchEvent()方法 * 3 Activity中自定义Button的TouchListener执行 * 4 自定义Button的onTouchEvent()方法 * * 若把1中的现在的返回值取反,那么2,3,4不会执行 * 同理,若把2中的现在的返回值取反,那么后续的3,4不会执行 * 同理,若把3中的现在的返回值取反,那么后续的4不会执行 * * 常量对应: * down--->0 * up----->1 * move--->2 * */ public class MainActivity extends Activity { private EventButton mEventButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); init(); } private void init(){ mEventButton=(EventButton) findViewById(R.id.button); mEventButton.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { System.out.println("---> MainActivity中EventButton的OnTouchListener "+event.getAction()); return false; } }); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { System.out.println("---> MainActivity dispatchTouchEvent "+ev.getAction()+" , it defaulst is true"); return super.dispatchTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { System.out.println("---> MainActivity onTouchEvent "+event.getAction()+" , it defaulst is false"); return super.onTouchEvent(event); } }
EventButton如下:
package com.cn; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.Button; public class EventButton extends Button { public EventButton(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent event) { System.out.println("---> EventButton dispatchTouchEvent , it defaulst is true"); return super.dispatchTouchEvent(event); } @Override public boolean onTouchEvent(MotionEvent event) { System.out.println("---> EventButton onTouchEvent , it defaulst is true"); return super.onTouchEvent(event); } }
main.xml如下:
<RelativeLayout 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" tools:context=".MainActivity" > <com.cn.EventButton android:id="@+id/button" android:layout_width="250dip" android:layout_height="250dip" android:layout_centerInParent="true" android:text="Touch me" /> </RelativeLayout>