常见的滑动冲突场景及解决方案

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

常见的滑动冲突场景可以简单分为以下三种:


  • 对于场景1,它的处理规则是:当用户左右滑动时,需要让外部的view拦截点击事件,当用户上下滑动时,需要让内部view拦截点击事件,这个时候我们可以根据他们的特征来解决滑动冲突,具体来说就是:根据滑动时水平滑动还是竖直滑动来判断到底由谁来拦截事件。如何知道滑动谁水平滑动还是竖直滑动呢?我们可以通过两点之间的坐标,依据滑动路径和水平方向所形成的夹角,也可以依据水平方向和竖直方向上的距离差来判断,某些时候还可以依据水平和竖直方向的速度差来做判断。
  • 对于场景2,比较特殊,它无法根据滑动的角度、距离差以及速度差来做判断,但是这个时候一般都能在业务上找到突破点,比如业务上规定:当处于某种状态时需要外部view响应用户的滑动,而处于另一种状态时则需要内部view来响应view的滑动,根据这种业务上的需求我们能得出相应的处理规则。
  • 对于场景3,它的滑动规则更复杂,它也无法直接根据滑动的角度、距离差以及速度差来做判断,同样还是只能从业务上找到突破点。和场景1、2的解决思想一致,只需要解决每层之间的滑动冲突即可。

滑动冲突的解决方式:


1、外部拦截法

外部拦截法需要重写父容器的onInterceptTouchEvent方法,在内部做相应的拦截即可,如下面伪代码所示:

[java]   view plain  copy
  1. <span style="white-space:pre;"> </span>@Override  
  2.     public boolean onInterceptTouchEvent(MotionEvent event) {  
  3.         boolean intercepted = false;  
  4.         int x=(int) event.getX();  
  5.         int y=(int) event.getY();  
  6.         switch (event.getAction()) {  
  7.         case MotionEvent.ACTION_DOWN:  
  8.             intercepted=false;  
  9.             break;  
  10.   
  11.         case MotionEvent.ACTION_MOVE:  
  12.             if(父容器需要点击事件){  
  13.                 intercepted=true;  
  14.             }else{  
  15.                 intercepted=false;  
  16.             }  
  17.             break;  
  18.               
  19.         case MotionEvent.ACTION_UP:  
  20.             intercepted=false;  
  21.             break;  
  22.         default:  
  23.             break;  
  24.         }  
  25.   
  26.         return intercepted;  
  27.     }  

在父容器的onInterceptTouchEvent方法中,首先是ACTION_DOWN事件,父容器必须返回false,即不拦截ACTION_DOWN事件,这是因为一旦父容器拦截者这个事件,那么后续的ACTION_MOVE和ACTION_UP事件都会直接交由父容器处理,这个时候就没法传递给子元素了;其次是ACTION_MOVE事件,这个事件可以根据需要来决定是否拦截;最后是ACTION_UP,这里必须返回false,如果父容器返回true,就会导致子元素无法接收到ACTION_UP事件,这个时候onClick事件就无法触发。


2、内部拦截法

内部拦截法是指父容器不拦截任何事件,所有事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器处理。我们需要重写子元素的dispatchTouchEvent方法,一下是伪代码:

[java]   view plain  copy
  1. @Override  
  2. public boolean dispatchTouchEvent(MotionEvent event) {  
  3.     int x = (int) event.getX();  
  4.     int y = (int) event.getY();  
  5.     switch (event.getAction()) {  
  6.     case MotionEvent.ACTION_DOWN:  
  7.         parent.requestDisallowInterceptTouchEvent(true);// 表示不拦截  
  8.         break;  
  9.   
  10.     case MotionEvent.ACTION_MOVE:  
  11.         if (父容器需要点击事件) {  
  12.             parent.requestDisallowInterceptTouchEvent(false);// 表示拦截  
  13.         }  
  14.         break;  
  15.   
  16.     case MotionEvent.ACTION_UP:  
  17.         break;  
  18.     default:  
  19.         break;  
  20.     }  
  21.   
  22.     return super.dispatchTouchEvent(event);  
  23. }  

requestDisallowInterceptTouchEvent方法通过改变FLAG_DISALLOW_INTERCEPT标记位拦截事件,但是ACTION_DOWN事件不受FLAG_DISALLOW_INTERCEPT这个标记位的控制
Android View滑动冲突处理 一 概述 上一篇文章我们讲述了Android View事件分发机制。如果你对View的事件分发还不熟悉,建议先去看一下 一文读懂Android View事件分发机制 它是我们今天滑动冲突解决的理论基础! 如果你已经对View的事件分发机制了然于胸,那么我们就根据View的事件分发机制,来给大家详细聊一下滑动冲突! 二 滑动冲突常见场景与处理思路 当我们内外两层View都可以滑动时候,就会产生滑动冲突常见滑动冲突场景: 1.外层与内层滑动方向不一致,外层ViewGroup是可以横向滑动的,内层Vie 阅读详情

相关推荐

3分钟搞定,学会Android滑动冲突解决技巧

滑动冲突的解决方式主要有外部拦截法和内部拦截法两种。希望本文能帮助读者解决滑动冲突问题,提高。方法中,我们可以根据事件的类型和位置来判断是否需要拦截事件。如果需要拦截事件,则返回。方法中,我们可以根据事件的类型和位置来判断是否需要拦截事件。如果需要拦截事件,则调用。滑动方向一致,则会导致滑动冲突。同时收到滑动事件,导致无法正常滑动。会根据自己的滑动方向和滑动能力来决定是否拦截事件。滑动冲突的主要解决思想有两种:外部拦截法和内部拦截法。当用户在屏幕上触摸时,事件会首先传递给最顶层的。默认的滑动冲突解决方式。

大模型学习路线 2409

Android开发之滑动冲突解决方案

需要实现的效果:顶部是一个TextView,而这个TextView的内容超出了显示区域,它的内容是可以滑动的。在使用外部拦截法时,需要提前知道不拦截消息的区域,这样才能做好消息处理,所以也只有在子控件的位置和大小是固定的并且能获取到的情况下,外部拦截法才是有用的。所谓外部拦截法,是指点击事件都先经过父控件的拦截处理,如果父控件需要此事件就拦截,如果不需要就不拦截,让消息传递给子控件,这样就可以解决滑动冲突问题。法:根据业务需求,通过下面的拦截与禁止拦截的方法,决定在什么情况下滑动哪个View。

编程小鹏的博客 2166

滑动冲突解决方式总结

一、冲突类型 滑动冲突分为三种类型,第一类是外部和内部滑动方向不一致,第二类是外部和内部滑动方向一致,第三类是前两种嵌套的模式。 处理这三种类型的规则分为两类,对于第一种类型,我们可以根据滑动方向来处理,符合处理方向的分配给对应的控件;对于2、3种类型,必须根据业务上的区别来处理,某种状态的处理事件分发给对应的控件来处理。 对于滑动方向的判别通常使用以下方式,使用终点坐标和起点坐标,计...

流月的博客 3460

【Android】常见滑动冲突场景解决方案

Android滑动冲突解决方案总结 本文介绍了Android开发中常见的三种滑动冲突场景:同向滑动冲突、异向滑动冲突和混合滑动冲突。文章分析了滑动冲突的根本原因在于系统无法判断用户意图让哪一层视图处理滑动事件,并提出了两种主要解决方案: 外部拦截法:通过重写父容器的onInterceptTouchEvent方法,根据业务逻辑决定是否拦截事件。 内部拦截法:通过子视图的dispatchTouchEvent方法配合requestDisallowInterceptTouchEvent(),控制父容器是否拦截事件。

2302_79323248的博客 950

Android滑动事件冲突案例及解决方案总结

前言 转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/11072989.html】,谢谢! 前面两篇文章,花了很大篇幅讲解了Android的事件分发机制的原理性知识。然而,“纸上得来终觉浅,绝知此事要躬行”,前面讲的那些原理,也都是为解决实际问题而服务的。本文将结合实际工作中经常遇到的滑动冲突案例,总结滑动冲突场景以...

我的专栏 2953

Android滑动事件冲突

如果对Android的触摸事件分发不了解的同学,请先了解完事件分发再看此文章比较容易理解。 滑动冲突常见场景 1.外层与内层滑动方向不一致,外层ViewGroup是可以横向滑动的,内层View是可以竖向滑动的(类似ViewPager,每个页面里面是ListView) 2.外层与内层滑动方向一致,外层ViewGroup是可以竖向滑动的,内层View同样也是竖向滑动的(类似ScrollView包裹ListView) 情况1和2的嵌套 如下图就是这三种情况示意图 滑动冲突解决方案 外部拦截法: 父View根

ruanyandong的博客 758

安卓View—滑动冲突(三)

安卓View—滑动冲突 文章目录安卓View—滑动冲突一、前言二、常见滑动冲突场景场景1场景2场景3三、滑动冲突的处理规则场景1处理规则:场景2处理规则:场景3处理规则:四、滑动冲突的解决方式1.外部拦截法2.内部拦截法 一、前言 滑动冲突在开发过程中遇到的情况还挺多的,我以前开发 码助 等项目的时候遇到过,当然在使用抖音的时候也遇到过(当场给学姐提交BUG,结果修复的还挺快),我以前解决滑动冲...

睡客的博客 635

View的滑动冲突

Running&H的博客 177

Android View 的滑动冲突

滑动冲突是如何产生的呢? 其实在界面中只要内外层同时可以滑动,这个时候就产生滑动冲突。一、滑动冲突常见场景常见滑动冲突场景可以简单分为以下三种。场景1:外部滑动方向和内部滑动方向不一致; 外层的ViewGroup可以横向滑动,内层的View可以竖向滑动,如ViewPager内每个页面是ListView (ViewPager 已经处理了滑动冲突,所以在使用中并没有出现滑动冲突)场景2:外部滑动方向...

Superior's Blog 325

Android的事件分发机制以及滑动冲突的解决

声明: 本文主要涉及VIew的事件分发与滑动冲突的解决,关于View的事件分发流程的部分内容参考自: Android事件分发机制详解:史上最全面、最易懂 个人感觉该文较全面,总结也很好,但略显冗长,且源码基于Android5.0以前的版本。本文中简化了核心原理,再补充了一些必要知识点,并使用最新的源码重新做了分析。 基础知识 事件分发的对象 MontionEvent...

未子涵的博客 3470

View体系与自定义View(六)—— View的滑动冲突

1 常见滑动冲突场景 常见滑动冲突场景可以简单分为以下三种: 外部滑动方向和内部滑动方向不一致 外部滑动方向和内部滑动方向一致 上面两种情况的嵌套 场景1:主要是将ViewPager和Fragment配合使用所组成的页面滑动效果。在这种效果中,可以通过左右滑动来切换页面,而每个页面内部往往又是一个ListView。本来这种情况下是有滑动冲突的,但是ViewPager内部处理了这种滑动冲突,如果采用的是ScrollView,那么就必须手动处理滑动冲突,否则造成的后果就是内外两层只能有一层滑动,这是因

xingyu19911016的博客 502

view 的滑动冲突

滑动冲突:顾名思义,就是滑动时产生的冲突。 原因:界面中有两层或者多层可以滑动常见滑动冲突场景:1、外部滑动方向和内部滑动方向不一致 常见滑动冲突场景: 1、外部的滑动方向和内部的滑动方向不一致 2、外部的滑动方向跟内部的滑动方向一致 3、上面两种情况的嵌套 滑动冲突处理规则: 1、对于场景一,它的处理规则是:当用户左右滑动时,需要让

二丁目的丰功笔记 421

NestedScrollingParent 和 NestedScrollingChild 嵌套滑动原理介绍

在介绍NestedScrollingParent 和 NestedScrollingChild 嵌套滑动之前,先介绍下View的事件分发机制,因为NestedScrollingParent 和 NestedScrollingChild 主要是很好地解决了View滑动冲突问题。 View的事件分发机制 一次点击事件由三个重要的方法来共同完成:dispatchTouchEvent、onIntercep...

wangjiang 6619

Android滑动冲突解决

1、滑动冲突场景 (1) 外部滑动方向和内部滑动方向不一致; (2) 外不滑动方向和内部滑动方向一致; (3) 上边两种情况的集合 图解如下: 场景1: 主要是将viewpage和fragment配合使用所组成的滑动效果,主流应用几乎都会使用这个效果,在这个效果中可以通过左右滑动来切换页面,而每个页面内部都有listview,但是因为这种情况viewpage已经做了滑动

qq_28273051的博客 491
上一篇: Android开发 GitHub 常用开源框架汇总
下一篇: Android开发笔记之notification消息推送 通知栏的实现
System_err
博客等级 码龄10年 52粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值