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>
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描述: * 测试Touch事件的传递,代码结构如下: * 1 定义一个Button 重写onTouchEvent()方法 * 2 在Activity中为该Button设置OnTouchListener * 3 重写Activity的onTouchEvent() * 注意: * 在以上的三步的结尾处均返回false,表示未处理完事件继续传播 * * 运行测试结果,输出的顺序为: * 1 EventButton OnTouchListener in MainActivity * 2 EventButton onTouchEvent * 3 MainActivity onTouchEvent * * 即Touch事件的处理顺序为: * 1 自定义button的listener * 2 自定义button的onTouchEvent()方法 * 3 Activity的onTouchEvent() * 所以,按照这个处理顺序只要在对于的方法结尾处返回true. * 那么对于该事件的处理就不会继续传递下去. * */ 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("---> EventButton OnTouchListener in MainActivity "); return false; } }); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); System.out.println("---> MainActivity onTouchEvent"); return false; } }
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 onTouchEvent(MotionEvent event) { super.onTouchEvent(event); System.out.println("---> EventButton onTouchEvent"); return false; } }