美文网首页android杂Android自定义ViewAndroid知识
dispatchTouchEvent事件分发浅析(八)简单解决S

dispatchTouchEvent事件分发浅析(八)简单解决S

作者: dodo_lihao | 来源:发表于2016-09-24 15:32 被阅读630次

简单解决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

相关文章

网友评论

  • cf3141d555a7:那个卡顿怎么解决?
    cf3141d555a7:@dodo_lihao 项目中应该怎么去设计这一块呢。我的项目中就存在这种嵌套
    dodo_lihao:@cf3141d555a7 一般也不会去用scrollview套webview,这里只是理解前面的知识而已
    dodo_lihao:@cf3141d555a7 这里只是简单理解,项目中,不会去用这种方式实现的

本文标题:dispatchTouchEvent事件分发浅析(八)简单解决S

本文链接:https://www.haomeiwen.com/subject/ipyxyttx.html