Android 事件分发 OnClickListener 和 OnTouchListener 的事件处理原理简单描述

声明:下文是在看过这篇文章 http://blog.csdn.net/guolin_blog/article/details/9097463 的一个总结,所以有需要做进一步了解者,可以直接去看一下

在这次的实验练习中,我们只采用了一个 Button 的事件来做分析

1.先给Button添加相应的事件:

private Button testBtn;
testBtn = (Button)findViewById(R.id.testBtn);
		testBtn.setOnClickListener(new MyClickListener());
		testBtn.setOnTouchListener(new MyTouchListener());

	class MyTouchListener implements OnTouchListener {

		@Override
		public boolean onTouch(View v, MotionEvent event) {
			Log.d("event dispatch", "onTouch : "+event.getAction());
			return true;
		}
		
	}
	
	class MyClickListener implements OnClickListener {

		@Override
		public void onClick(View arg0) {
			Log.d("event dispatch", "onClick");
		}
		
	}


 
  


2.运行结果

把上面的代码写好后,直接运行项目,在 LogCat 中可以看到如下结果


   

在上面两个监听者的事件处理方法中,onTouch 是有返回值的,而 onClick 没有,其实这个返回值决定着 onClick 方法能否被执行,上面代码中返回值为false,下面我们把这个返回值改成true,再次运行之后会发现如下结果


现在,我们就可以清楚的看到,如果 onTouch 返回值是 true 时,onClick 方法将不被执行,下面我们讲一下原理(可能描述不是太准确,不过大概是那么回事)


3. 逻辑描述

其实在 View 这个类里面,有个方法叫做 dispatchTouchEvent(Event),当你点击 Button 时就会触发了这个方法(Button 间接继承于 View),dispatchTouchEvent 会先去回调我们添加到 Button 上的OnTouchListener 的 onTouch 方法(如果有添加的话),然后根据方法返回值来确定是否调用 View 自身的onTouchEvent 方法, 而OnClickListener 的 onClick 方法是要通过 onTouchEvent 方法才能被调用,如上所演示的:返回值为 true 不会回调 onClick,返回 false 时才会回调(如果没有注册添加到 OnTouchListener ),即只有当 onTouch 返回的是 false, onTouchEvent 方法才会被调用,估计看到这里大家都要晕了,下面附一张图,应该就会清晰。。。

Android 事件分发 OnClickListener 和 OnTouchListener 的事件处理原理简单描述_第1张图片

你可能感兴趣的:(Android)