0. 前言  

我们在Android开发——事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备。针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法。

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52600422

1.外部拦截法

外部拦截法是指事件都先经过父控件的拦截处理,这里需要注意的是ACTION_DOWN事件父控件中必须返回false,因为如果父控件拦截了DOWN,后续事件也会交给它处理,子控件就无法拿到事件了,具体原因已经在前言中的链接文中介绍过了。接着就是MOVE事件,如果父控件需要此拦截事件,就拦截,不需要就不拦截。最后在UP事件中也默认返回false。

外部拦截法不需要改写子控件,只需要改写父控件的onInterceptTouchEvent方法,代码如下:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercepted=false;
switch (action) {
case MotionEvent.ACTION_MOVE:
intercepted=false;
break;
case MotionEvent.ACTION_MOVE:{
if(父控件需要处理此事件){
intercepted=true;}
else{
intercepted=false;}
break;
}
case MotionEvent.ACTION_UP: {
intercepted=false;
break;
}
//...
return intercepted;
}

2.内部拦截法

内部拦截法是指父控件设置为不拦截除ACTION_DOWN以外的任何事件,当DOWN传递给子元素时,通过设置getParent().requestDisallowInterceptTouchEvent(false)使父控件不拦截任何事件,此时所有事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则可在ACTION_MOVE中通过设置getParent().requestDisallowInterceptTouchEvent(true)使父控件去拦截MOVE以及UP事件并由自己消耗该事件。

我们需要修改子元素的dispatchTouchEvent方法:

public boolean dispatchTouchEvent(MotionEventevent) {
switch (action) {
case MotionEvent.ACTION_DOWN:{
//使父控件不拦截DOWN以外的一系列事件
getParent().requestDisallowInterceptTouchEvent(true);
break;}
case MotionEvent.ACTION_MOVE:{
if(父控件需要处理此事件){
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
}
case MotionEvent.ACTION_UP: {
break;
}
...
return super.dispatchTouchEvent(event);
} 当然,还需要修改父容器的onInterceptTouchEvent()方法,使其默认拦截除DOWN以外的事件,代码如下:
@Override
publicboolean onInterceptTouchEvent(MotionEvent ev) {
intaction=ev.getAction();
if(action==MotionEvent.ACTION_DOWN){
return false;
}else {
return true;
}
}

以上就是两种解决滑动冲突的解决方案,在其中的条件判断代码里加入自己的业务逻辑判断即可。

转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52600422

Android开发——View滑动冲突解决方案的更多相关文章

  1. Android开发——View滑动的三种实现方式

    0. 前言   Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验.一般View的滑动可以用三种方式实现. 转载请注明出处:http://blog.csdn.net/seu ...

  2. android 开发 View _1_ View的子类们 和 视图坐标系图

    目录: android 开发 View _2_ View的属性动画ObjectAnimator ,动画效果一览 android 开发 View _3_ View的属性动画ValueAnimator a ...

  3. Android View的事件分发机制和滑动冲突解决方案

    这篇文章会先讲Android中View的事件分发机制,然后再介绍Android滑动冲突的形成原因并给出解决方案.因水平有限,讲的不会太过深入,只希望各位看了之后对事件分发机制的流程有个大概的概念,并且 ...

  4. 【朝花夕拾】Android自定义View篇之(七)Android事件分发机制(下)滑动冲突解决方案总结

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/11072989.html],谢谢! 前面两篇文章,花了很大篇幅讲解了Android的事件分发机制 ...

  5. view的滑动冲突解决方案

    一.常见的滑动冲突场景 1.外部滑动方向和内部滑动方向不一致 2.外部滑动方向和内部滑动方向一致 3.上面两种情况的嵌套 二.滑动冲突处理的原则 场景1的处理原则是:当用户左右滑动时,需要让外部的vi ...

  6. 浅谈Android View滑动冲突

    引言 上一篇文章我们从源码的角度介绍了View事件分发机制,这一篇文章我们就通过介绍滑动冲突的规则和一个实例来更加深入的学习View的事件分发机制. 1.外部滑动方向和内部滑动方向不一致 考虑这样一种 ...

  7. [Android UI]View滑动方式总结

    一.前言 在上一篇文章,介绍了View的坐标等基础知识,有了基础知识后,对下面内容的理解也将会容易很多.那么本文介绍的是View滑动的几种方式,这对于View来说,也是需要重要掌握的内容,因为用户无时 ...

  8. android 开发 View _14 MotionEvent和事件处理详解,与实践自定义滑动条View

    转载https://blog.csdn.net/huaxun66/article/details/52352469 MotionEvent MotionEvent对象是与用户触摸相关的时间序列,该序列 ...

  9. android 表情,软键盘冲突解决方案(仿微博等SNS应用)

    之前总想搞一下这个模块,可是由于忙碌总是推迟,现在就把这块好好的弥补过来,下面是我实现的思路.本人才疏学浅,还望大家不要见笑. 首先我们还是先看写示例:            上面应用应该不用我过多介 ...

随机推荐

  1. Android studio 安装与配置【Android学习入门】

    终于下定决心认真学习Android开发了. 之前在很多平台看到很多大牛们学习Android的经验和心得,纸上得来终觉浅. 这里推荐stormzhang老师总结的Android学习之路. 为了防止电脑卡 ...

  2. 学习html5 app项目开发

    这周因为部门接了个小的html5 app case,所以从事android开发的我就接下了这个项目.与其说是项目需要,其实更大部分是我自己想要做html5 app,因为我对这个全新的平台已经好奇很久了 ...

  3. python socket实现多个连接

    socket实现多个连接 前戏很重要~~ 在实现多个连接之前,先实现下多次发送和接收数据. 如果要多次接收数据,那么在服务器端的接收和客户端的发送部分就必须使用循环. 以下代码在python3.5下运 ...

  4. Sql_Server中如何判断表中某字段是否存在

    --比如说要判断表A中的字段C是否存在两个方法: 一, IF EXISTS ( SELECT 1 FROM SYSOBJECTS T1 INNER JOIN SYSCOLUMNS T2 ON T1.I ...

  5. 笨办法学Python(二十八)

    习题 28: 布尔表达式练习 上一节你学到的逻辑组合的正式名称是“布尔逻辑表达式(boolean logic expression)”.在编程中,布尔逻辑可以说是无处不在.它们是计算机运算的基础和重要 ...

  6. Django Field lookups (字段查找)

    字段查找是指定SQL WHERE子句的核心内容的方式. 它们被指定为QuerySet方法filter().exclude()和get()的关键字参数. 1.exact:精确查找.如果为比较提供的值为N ...

  7. IOS NSOperationQueue(线程 封装操作)

    #import "HMViewController.h" @interface HMViewController () @end @implementation HMViewCon ...

  8. 利用API设置桌面背景

    实现效果: 知识运用: API函数SystemParametersInfo 实现代码: [DllImport("user32.dll", EntryPoint = "Sy ...

  9. 5.2 Array类型

    ◆  创建数组的基本方式有两种. ①第一种是使用Array构造函数,new关键字可省略 var colors = new Array(); var colors = new Array(20); // ...

  10. GNOME keyring [(null)] 的密码:

    在ubuntu下执行svn checkout命令时,总是报下面的错误: GNOME keyring [(null)] 的密码:svn: 方法 OPTIONS 失败于 “http://xxxxxxxx/ ...