Android 事件分发 OnClickListener 和 OnTouchListener 的事件处理原理简单描述
2014-05-03 15:45
489 查看
声明:下文是在看过这篇文章 /article/1562152.html 的一个总结,所以有需要做进一步了解者,可以直接去看一下
在这次的实验练习中,我们只采用了一个 Button 的事件来做分析
1.先给Button添加相应的事件:
2.运行结果
把上面的代码写好后,直接运行项目,在 LogCat 中可以看到如下结果
![](http://img.blog.csdn.net/20140503151959671?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29taW5nX2NoZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
在上面两个监听者的事件处理方法中,onTouch 是有返回值的,而 onClick 没有,其实这个返回值决定着 onClick 方法能否被执行,上面代码中返回值为false,下面我们把这个返回值改成true,再次运行之后会发现如下结果
![](http://img.blog.csdn.net/20140503152103093?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY29taW5nX2NoZW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
现在,我们就可以清楚的看到,如果 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 方法才会被调用,估计看到这里大家都要晕了,下面附一张图,应该就会清晰。。。
在这次的实验练习中,我们只采用了一个 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的事件分发onInterceptTouchEvent与onTouchEvent、OnClickListener、OnLongClick
- [置顶] Android开发知识(七):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(上)
- [置顶] Android开发知识(八):Android事件处理机制:事件分发、传递、拦截、处理机制的原理分析(中)
- Android View 的事件处理和分发原理简析
- Android事件分发与处理简单整理
- Android 关于setOnclickListener 对事件分发的影响
- Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发
- 浅谈android 点击事件分发处理流程
- Android添加事件android:onClick vs setOnClickListener
- Android事件分发底层原理
- Android触摸事件分发处理机制详解与源码分析一(View篇)
- Android的Touch事件分发机制简单分析
- Android 处理简单单击事件的监听方法
- 【Android】RecyclerView的OnItemClickListener点击事件处理
- android onClickListener onLongClickListener事件冲突
- android view点击事件无效 OnClickListener
- Android开发之事件分发和Listener
- Android 事件分发和处理机制
- android事件分发机制的实现原理
- Android事件分发、View事件Listener全解析