dispatchTouchEvent事件分发浅析(八)简单解决ScrollView 与 WebView 的冲突


简单解决ScrollView 与 WebView 的冲突

上一篇,简单叙述了一下对应的想法 这篇也只是选读,没有太多实在意义,只是叙述一下对应的解决过程 这里简单录制gif,好理解一点


前提描述

这里就一个简单的ScrollView中,包含一个自定义的WebView WebView什么都没有做,也只是正常的,空的WebView 我们通过修改MyWebView,来理解对应的事件分发

而具体的实现, 写了一个 内部枚举类 的enum DoType 分别有4种情况 这个时候,通过传入枚举类型,来调用对应的实现。 而调用,只是简单在 @Override 的 onInterceptTouchEvent 方法中设置

其实,对应的实现 也只是简单的调用了对应的方法而已(这里为了说明顺序,只是用0123这样的名字,所以就没有按意义给方法命名)


0. ScrollView 与 WebView 的冲突

上一篇已经分析和叙述了冲突的原因,具体原因可以看上一篇 这里只是简单描述外部的现象 我们先看一下

doSth(DoType.noting0, ev);

的情况, 这个时候,我们是什么都没有做的

我们看一下对应的现象

我们可以发现,对应的MyWebView,只是做了显示作用 里面是不能进行滑动的 无论怎么操作,都只是外面的ScrollView拿到和消费了事件


1. 简单解决冲突

这个时候,我们的目标是,

  • 在操作MyWebView的时候,控制MyWebView
  • 操作外面的时候,控制控制ScrollView

这个时候,我们调用

doSth(DoType.Disallow1, ev);

也就是直接调用 this.requestDisallowInterceptTouchEvent(true);

我们来看一下效果

这样我们就可以让这2个控件和谐的相处了


2. 让WebView处理,但是最底端的时候由ScrollView处理

但是,如果上面的MyWebView太大, 占据了整个屏幕 (其实一般是不会发生这种情况的,通常这样解决就可以了,这里只是说明另一种实现) 我们最好可以通过判断是否在最底端了, 在最底端的时候,让外面的ScrollView进行滑动

这个时候,我们调用

doSth(DoType.DisallowEnd2, ev);

也就是

通过计算,来判断是否到最低端了 最底端设置false,不让WebView处理 否则,和上面一样,由WebView处理

我们可以看见对应的效果


3. 让WebView处理,但是最底端,最顶端由ScrollView处理

我们看见上面这里,解决了在WebView中,拉到底部以后 可以继续下拉的情况 但是,当拉到底部以后,发现当我们上拉的时候,还是ScrollView在处理 我们其实想达到的目标是:

  • 到底部以后,如果是下拉,则ScrollView处理
  • 到底部以后,如果是上拉,则WebView处理

同时,我也要考虑到,到达顶部以后:

  • 到顶部以后, 如果是下拉, 则WebView处理
  • 到顶部以后, 如果是上拉,则ScrollView处理

这里自己没有参考过别人的代码,可能处理的时候有点麻烦,仅供参考

  • 自己写一个内部类,记录对应的位置,状态等
  • X,Y的位置, 是向上还是向下, 是向左还是向右,是否在滑动

这样,每次触发会去对比前一个事件,来确定是对应的操作类型 再根据对应的类型,做对应的处理 (这里就不贴代码了, 可以参考https://github.com/2954722256/demo_event中 disallowintercept 的 Module)

这里贴一下效果 这里可能第一次触发的时候,会稍微卡顿一下,因为只是简单理解,就不去处理了,有兴趣可以解决一下这个小bug


参考代码

这里只是简单理解,代码没有太多实用的地方 如果要了解具体代码 可以参考https://github.com/2954722256/demo_event中 disallowintercept 的 Module

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

我的VS2010+VAssistX

最近越来越觉得VAssistX好用,可能是以前没有去仔细研究过吧,也可能是因为我是个快捷键控吧,不管怎样,用或不用,方便或不方便,它就是那里,一动也不动,进入...

19810
来自专栏数据的力量

职场人必备的WORD排版十大技巧

23370
来自专栏一个会写诗的程序员的博客

h5中performance.timing轻松获取网页各个数据 如dom加载时间 渲染时长 加载完触发时间

在控制台中输入window.performance.timing(html5的属性);

75510
来自专栏五毛程序员

五毛的cocos2d-x学习笔记06-处理用户交互

16220
来自专栏圣杰的专栏

Asp.net mvc 知多少(四)

本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- By Shailendra Chauhan,想...

24090
来自专栏前端架构

vue2.x入坑总结—回顾对比angularJS/React的一统

从感性的角度讲,我是不屑于用VUE,觉得react套件用起来更顺手,但是vue现在越来火,所以也不得入vue(杂烩汤)的坑。

17120
来自专栏狮乐园

高级 Angular 组件模式 (6)

Render Props最近在React社区中引起了轰动,但是与之类似的模式在Angular中似乎并没有得到太多关注。我在之前写的文章提及过,TemplateR...

11510
来自专栏编程

AngularJS中使用表单输入的应用设计

在Angular中使用表单元素非常方便。正如我们在前面几个例子中看到的,你可以使用ng-model属性把元素绑定到你的模型属性上。这一机制对于所有标准的表单元素...

19060
来自专栏前端儿

pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新

再通过 onhashchange 事件监听hash锚点的变化,手动进行前进后退操作,浏览器支持度

20310
来自专栏黑泽君的专栏

java基础学习_GUI_如何让Netbeans的东西Eclipse能访问、GUI(图形用户接口)_day25总结

java基础学习_GUI_如何让Netbeans的东西Eclipse能访问、GUI(图形用户接口)_day25总结

10520

扫码关注云+社区

领取腾讯云代金券