View滑动冲突的两种解决方式
来源:互联网 发布:go并发编程实战 高清 编辑:程序博客网 时间:2024/06/05 20:25
转载请注明出处
http://blog.csdn.net/guodongAndroid/article/details/52530227
本文来自【孫小逗的博客】
View滑动冲突的两种解决方式
1、外部拦截法
所谓外部拦截法是指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要此事件就不拦截,这样就可以解决滑动冲突问题,这种方法比较符合点击事件的分发机制。外部拦截法需要重写父容器的onInterceptTouchEvent方法,在内部做相应的拦截即可,这种方法的伪代码如下所示:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean intercepted = false; int x = (int) ev.getX(); int y = (int) ev.getY(); int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: { intercepted = false; break; } case MotionEvent.ACTION_MOVE: { if (父容器需要当前点击事件) { intercepted = true; } else { intercepted = false; } break; } case MotionEvent.ACTION_UP: { intercepted = false; break; } default: break; } mLastXIntercept = x; mLastYIntercept = y; return intercepted; }
上述代码是外部拦截法的典型逻辑,针对不同的滑动冲突,只需要修改父容器需要当前点击事件的条件即可,其他均不需要修改而且也不能修改。在onInterceptTouchEvent方法中,首先是ACTION_DOWN这个事件,父容器必须返回false,即不拦截DOWN事件,这是因为一旦父容器拦截了DOWN事件,那么后续的MOVE和UP事件都会直接交由父容器处理,这个时候事件没法再传递给子元素了;其次是ACTION_MOVE事件,这个事件可以根据需求来决定是否拦截,如果父容器需要拦截就返回true,否则返回false;最后是ACTION_UP事件,这里必须返回false。
2、内部拦截法
内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器进行处理,这种方法不符合事件分发机制,需要配合requstDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显复杂,需要重写子元素的dispatchTouchEvent方法,这种方法的伪代码如下所示:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { int x = (int) ev.getX(); int y = (int) ev.getY(); int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: { parentView.requestDisallowInterceptTouchEvent(true); // parentView为父容器 break; } case MotionEvent.ACTION_MOVE: { int deltaX = x - mLastDiapatchX; int deltaY = y - mLastDiapatchY; if (父容器需要此点击事件) { parentView.requestDisallowInterceptTouchEvent(false); // parentView为父容器 } break; } case MotionEvent.ACTION_UP: break; default: break; } mLastDiapatchX = x; mLastDiapatchY = y; return super.dispatchTouchEvent(ev); }
上述代码是内部拦截法的典型代码,当面对不同的滑动冲突时只需要修改里面的条件即可,其他不需要改动而且也不能改动。除了子元素需要做处理以外,父容器也需要默认拦截除了ACTION_DOWN以外的其他事件,这样当子元素调用parentView.requestDisallowInterceptTouchEvent(false)
方法时,父容器才能继续拦截所需事件。父容器为什么不拦截DOWN事件已在外部拦截法中叙述,父容器的改动如下所示:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { int action = ev.getAction(); if (action == MotionEvent.ACTION_DOWN) return false; else return true; }
- View滑动冲突的两种解决方式
- View的滑动冲突(通用解决方式)
- android View滑动冲突的解决方式
- View的滑动冲突解决
- view的滑动冲突解决
- 滑动冲突的解决方式
- android中view手势滑动冲突的两种解决方法
- View的滑动方式及冲突处理
- View滑动冲突解决的套路
- Android读书笔记----滑动冲突的解决方式
- Android解决滑动冲突的方式
- requestDisallowInterceptTouchEvent解决子View和父View滑动的冲突
- 自定义View---怎么解决View的滑动冲突
- 自定义View解决滑动冲突
- android View滑动冲突解决
- 自定义View解决滑动冲突
- view 的滑动冲突
- View的滑动冲突
- 数据类型及其应用
- linux设备驱动程序之时钟管理(3)----我的那块儿蛋糕
- 八、栈和队列
- 51nod 1134 最长递增子序列(LIS)
- linux设备驱动程序之时钟管理(4)----原来是孩儿他爹娘
- View滑动冲突的两种解决方式
- jQuery插件之ajaxFileUpload
- 进程和线程关系及区别
- 文章标题
- 【单片机】时钟(不利用中断中断)
- 小蜜常见问题与解决方法
- 输入指令——Console.ReadLine()
- 自学pyton002
- 如何查看linux已安装的编译器及其版本