天天看点

android事件传递

创建layout1继承relabiveLayout:

public class Layout1 extends RelativeLayout{
	private final String logTag="Layout1";
	public Layout1(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		Log.d(logTag, ev.getAction()+"onInterceptTouchEvent");
		return super.onInterceptTouchEvent(ev);
	}
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		Log.d(logTag, ev.getAction()+"dispatchTouchEvent");
		return super.dispatchTouchEvent(ev);
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.d(logTag, event.getAction()+"onTouchEvent");
		return super.onTouchEvent(event);
	}
}
           

创建layout2继承relabiveLayout:

public class Layout2 extends RelativeLayout{
	private final String logTag="Layout2";
	public Layout2(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		Log.d(logTag, ev.getAction()+"onInterceptTouchEvent");
		return super.onInterceptTouchEvent(ev);
	}
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		Log.d(logTag, ev.getAction()+"dispatchTouchEvent");
		return super.dispatchTouchEvent(ev);
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.d(logTag, event.getAction()+"onTouchEvent");
		return super.onTouchEvent(event);
	}
}
           

创建view1继承view:

public class view1 extends View{
	private final String logTag="view1";
	public view1(Context context, AttributeSet attrs) {
		super(context, attrs);
	}
	
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		Log.d(logTag, ev.getAction()+"dispatchTouchEvent");
		return super.dispatchTouchEvent(ev);
	}
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		Log.d(logTag, event.getAction()+"onTouchEvent");
		return super.onTouchEvent(event);
	}
}
           

布局xml

<com.example.and_test.Layout1 
	            android:layout_width="400dp"
	            android:layout_height="400dp"
	            android:background="#0f0">
	            <com.example.and_test.Layout2 
	                android:id="@+id/layout2"
	                android:layout_width="200dp"
	                android:layout_height="200dp"
	                android:background="#ff0">
	                <com.example.and_test.view1 
	                    android:layout_width="100dp"
	                    android:layout_height="100dp"
	                    android:background="#0ff"/>
	            </com.example.and_test.Layout2>
	        </com.example.and_test.Layout1>
           

页面效果:

android事件传递
android事件传递

控制台输出

android事件传递
android事件传递

为layout2添加touchlistener

findViewById(R.id.layout2).setOnTouchListener(new View.OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				Log.d("layout2", event.getAction()+"onTouch");
				return false;
			}
		});
           
android事件传递
android事件传递

ontouch返回true

android事件传递
android事件传递

加入onclick事件

findViewById(R.id.layout2).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Log.d("layout2", "onClick");
			}
		});
           

ontouch return true ,onclick 没有执行

android事件传递
android事件传递

将ontouch return false 结果如下

android事件传递
android事件传递
android事件传递