View的滑动冲突(通用解决方式)
2016-07-26 17:51
525 查看
View的滑动冲突
产生:界面中存在内外两层同时可以滑动的View滑动冲突的场景
场景一:外部滑动方向和内部滑动方向不一致场景二:外部滑动方向和内部滑动方向一致
场景三:上面两种情况的嵌套
滑动冲突的处理规则
根据滑动是水平滑动还是竖直滑动来判断到底由谁来拦截事件(适用场景一)当处于某种状态时需要外部View响应用户的滑动,而处于另外一种状态时则需要内部View来响应View的滑动(适用场景二和场景三)
滑动冲突的解决方式
外部拦截法和内部拦截法外部拦截法:事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要就不拦截。外部拦截法需要重写父容器的onInterceptTouchEvent方法
//分别记录上次滑动的坐标(onInterceptTouchEvent) private int mLastXIntercept = 0; private int mLastYIntercept = 0; public boolean onInterceptTouchEvent(MotionEvent event){ boolean intercepted = false; int x = (int)event.getX(); int y = (int)event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: intercepted = false; break; case MotionEvent.ACTION_MOVE: int deltaX = x - mLastXIntercept; int deltaY = y - mLastYIntercept; if(父容器需要当前点击事件){ intercepted = true; }else{ intercepted = false; } break; case MotionEvent.ACTION_UP: intercepted = false; break; default: break; } mLastXIntercept = x; mLastYIntercept = y; return intercepted; }
上述代码是外部拦截法的典型逻辑,针对不同的滑动冲突只需修改“父容器需要当前点击事件”这个条件即可
内部拦截法:指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就消费,否则就交由父容器进行处理。这种方法需要配合requestDisallowInterceptTouchEvent方法才能正常工作
//分别记录上次滑动的坐标 private int mLastX = 0; private int mLastY = 0; public boolean dispatchTouchEvent(MotionEvent event){ int x = (int)event.getX(); int y = (int)event.getY(); switch(event.getAction()){ case MotionEvent.ACTION_DOWN: parent.requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_MOVE: int deltaX = x - mLastX; int deltaY = y - mLastY; if(父容器需要此类点击事件){ parent.requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: break; default: break; } mLastX = x; mLastY = y; return super.dispatchTouchEvent(event); }
上述代码是内部拦截法的典型代码,面对不同的滑动策略时只需要更改“父容器需要此类点击事件”这个条件即可
父元素所做的修改如下
public boolean onInterceptTouchEvent(MotionEvent event){ int action = event.getAction(); if(action == MotionEvent.ACTION_DOWN){ return false; }else{ return true; } }
相关文章推荐
- idea 使用注意
- linux中动态库和静态库
- spring整合hibernate扫描多个不同包下的实体类
- 重学 以太网的mac协议的CSMA/CD
- hdu 5752 Sqrt Bo 水题
- Object中的finalize方法的使用
- Android for arm上的so注入(inject)和挂钩(hook)
- 对象序列化
- 提高Linux工作效率的十大bash技巧
- nginx用户认证
- 微信的redirect_uri参数错误解决办法
- 我与IDEA的不舍情缘
- 利用red5搭建一个简单的流媒体直播系统(ubuntu 12.10)
- java过滤敏感词实现字符串替换功能
- 面试准备之---排序
- 简单的tab切换(jquery)
- css重置
- 轻松搞定JSONP跨域请求
- 【杭电】[4004]The Frog's Games
- device_create分析