Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
来源:互联网 发布:中国地质大学武汉知乎 编辑:程序博客网 时间:2024/06/05 19:39
事件分发机制分为2种:View事件的分发和ViewGroup事件分发机制先看简单的View事件分发机制//子控件的ontouch方法影响子控件的函数//onTouch====onTouchEvent====onClick;/** * 检验view的事件分发顺序,点击---dispatch- Ontouch返回值为ture 不执行---ontouchEvent---onclick */button1.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TAG", "button1 on touch"+event.getAction()); return true; }});/** * 检验view的事件分发顺序, 点击---dispatch- Ontouch返回值为false执行---ontouchEvent---onclick */button2.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TAG", "button1 on touch" + event.getAction()); return false; }});
然后我们来看一下View中dispatchTouchEvent方法的源码:
public boolean dispatchTouchEvent(MotionEvent event) { if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event);}
1、整个View的事件转发流程是:
View.dispatchEvent->View.setOnTouchListener->View.onTouchEvent
在dispatchTouchEvent中会进行OnTouchListener的判断,如果OnTouchListener不为null且返回true,则表示事件被消费,onTouchEvent不会被执行;否则执行onTouchEvent。
onClick方法是在onTouchEvent方法里调用的
2个Button的onTouch返回值验证了以下:onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
Button和ImageView效果不一样:一个是自带点击,一个是要自己控制点击
onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。
/**ImageView默认是不能点击事件的,要想点击的话必须手动设置*/imageView.setClickable(true);imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("TAG","imageView setOnTouchListener"); }});
/**默认为false,不拦截子控件的监听*/@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) { return false;}
public boolean dispatchTouchEvent(MotionEventev); //用来分派eventpublic boolean onInterceptTouchEvent(MotionEventev);//用来拦截eventpublic boolean onTouchEvent(MotionEventev);//用来处理event
1. Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
2. 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
3.拦截的好好处在于调用谁的dispatchTouchEvent的方法,谁出来点击事件
4. 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
1. onTouch和onTouchEvent有什么区别,又该如何使用?
从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。
思考的问题:
1.View的dispatchTouchEvent重写了会怎么样,View的onTouchEvent重写了会怎样?
2.ViewGroup的dispatchTouchEvent重写了会怎么样,ViewGroup的onTouchEvent重写了会怎样?
3.ListView上的button,点击button2个控件同时要有相应,应该怎么处理?
4.
参考博客:http://blog.csdn.net/guolin_blog/article/details/9097463http://blog.csdn.net/lmj623565791/article/details/38960443事件分发机制分为2种:View事件的分发和ViewGroup事件分发机制先看简单的View事件分发机制//子控件的ontouch方法影响子控件的函数//onTouch====onTouchEvent====onClick;/** * 检验view的事件分发顺序,点击---dispatch- Ontouch返回值为ture 不执行---ontouchEvent---onclick */button1.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TAG", "button1 on touch"+event.getAction()); return true; }});/** * 检验view的事件分发顺序, 点击---dispatch- Ontouch返回值为false执行---ontouchEvent---onclick */button2.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Log.d("TAG", "button1 on touch" + event.getAction()); return false; }});
然后我们来看一下View中dispatchTouchEvent方法的源码:
public boolean dispatchTouchEvent(MotionEvent event) { if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED && mOnTouchListener.onTouch(this, event)) { return true; } return onTouchEvent(event);}
1、整个View的事件转发流程是:
View.dispatchEvent->View.setOnTouchListener->View.onTouchEvent
在dispatchTouchEvent中会进行OnTouchListener的判断,如果OnTouchListener不为null且返回true,则表示事件被消费,onTouchEvent不会被执行;否则执行onTouchEvent。
onClick方法是在onTouchEvent方法里调用的
2个Button的onTouch返回值验证了以下:onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
假如onTouch方法返回false会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
Button和ImageView效果不一样:一个是自带点击,一个是要自己控制点击
onTouch能够得到执行需要两个前提条件,第一mOnTouchListener的值不能为空,第二当前点击的控件必须是enable的。因此如果你有一个控件是非enable的,那么给它注册onTouch事件将永远得不到执行。对于这一类控件,如果我们想要监听它的touch事件,就必须通过在该控件中重写onTouchEvent方法来实现。
/**ImageView默认是不能点击事件的,要想点击的话必须手动设置*/imageView.setClickable(true);imageView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.e("TAG","imageView setOnTouchListener"); }});
/**默认为false,不拦截子控件的监听*/@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) { return false;}
public boolean dispatchTouchEvent(MotionEventev); //用来分派eventpublic boolean onInterceptTouchEvent(MotionEventev);//用来拦截eventpublic boolean onTouchEvent(MotionEventev);//用来处理event
1. Android事件分发是先传递到ViewGroup,再由ViewGroup传递到View的。
2. 在ViewGroup中可以通过onInterceptTouchEvent方法对事件传递进行拦截,onInterceptTouchEvent方法返回true代表不允许事件继续向子View传递,返回false代表不对事件进行拦截,默认返回false。
3.拦截的好好处在于调用谁的dispatchTouchEvent的方法,谁出来点击事件
4. 子View中如果将传递的事件消费掉,ViewGroup中将无法接收到任何事件。
1. onTouch和onTouchEvent有什么区别,又该如何使用?
从源码中可以看出,这两个方法都是在View的dispatchTouchEvent中调用的,onTouch优先于onTouchEvent执行。如果在onTouch方法中通过返回true将事件消费掉,onTouchEvent将不会再执行。
思考的问题:
1.View的dispatchTouchEvent重写了会怎么样,View的onTouchEvent重写了会怎样?
2.ViewGroup的dispatchTouchEvent重写了会怎么样,ViewGroup的onTouchEvent重写了会怎样?
3.ListView上的button,点击button2个控件同时要有相应,应该怎么处理?
4.
- Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
- android 事件分发 拦截 (onInterceptTouchEvent dispatchTouchEvent onTouchEvent)
- Android 事件分发(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- dispatchTouchEvent(),onInterceptTouchEvent()和onTouchEvent()的事件分发
- Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)dispatchtouchevent,ontouch,ontouchevent,onclick
- Android触摸屏事件派发机制详解与源码分析三(Activity篇)dispatchtouchevent,ontouch,ontouchevent,onclick
- android dispatchTouchEvent()事件分发机制
- Android事件传递dispatchTouchEvent,ontouch,onInterceptTouchEvent,onTouchEvent,onClick,onLongClick,
- 从源码角度带你分析 Android View 事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程(一)
- 从源码角度带你分析 Android View 事件分发 dispatchTouchEvent,onTouch,onTouchEvent,onClick逻辑顺序过程
- Android事件传递机制(dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent)
- Android进阶——Android事件分发机制之dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent
- dispatchTouchEvent以及onTouchEvent事件分发
- 编程下 Touch 事件的分发和消费机制dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- dispatchTouchEvent和onTouchEvent事件
- Android 触屏事件 OnTouch onClick onTouchEvent对于触屏事件的处理和分发
- 事件分发系列—View中的dispatchTouchEvent和onTouchEvent分析
- android ViewGoup事件分发机制dispatchTouchEvent
- 输入三个字符串,允许有空格,输出最大公共子串 例如输入: what your name my name is ABC
- iframe和frame的区别
- IOS 委托代理(delegate)实现页面传值
- 自己的第一个博客
- Eclipse快捷键 10个最有用的快捷键
- Android 3步搞定事件分发机制,再也不用担心onTouch和onTouchEvent&dispatchTouchEvent
- Fragment系列(一)
- 慕课-程序设计与算法(大学先修课)-郭炜-第六周练习题
- 在不同环境下,没有被初始化的对象成员的值是多少(原理未知)
- Android 自定义View 测量控件大小onMeasure中MeasureSpec作用
- spring boot
- netty 混淆配置proguard
- 顺序结构程序设计实例
- 基础最短路 二 POJ 2253