ScrollView嵌套WebView滑动冲突问题

前言:

想必大家都是奔着标题而来的,那么不管实际开发中是否有遇到过,这个确实是一个坑点!!!

问题描述:

在Android开发中难免遇到Android与Js交互,要想实现交互,第一步就得使用WebView去加载一个html页面,这样才会有许多接下来的操作,使用WebView加载的时候难面遇到一屏幕元素多,但是还得让WebView的界面可滑动时,那外层布局就必须得套一层ScrollView,这样就会发现你你内部的WebView不可滑动了,只可以滑动ScrollView。

解决思路:

就是控制touch事件的分发,当WebView的touch事件收到了ACTION_UP事件时,就控制该事件由WebView接收,不在向下分发了,当WebView的touch事件检测非ACTION_UP事件时,则向下分发,交由ScrollView处理,这样就避免了touch事件分发下去WebView无滑动响应的问题。

           mWebView.setOnTouchListener(new View.OnTouchListener() {
              @Override
              public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_UP) {
                  mWebView.requestDisallowInterceptTouchEvent(false);
                } else {
                  mWebView.requestDisallowInterceptTouchEvent(true);
                }
                return false;
              }
            });

2023.7.19补充
因在webview内部控制了touch事件不在向下分发,就会导致在此区域滑动到顶或底不在触发scrollView滑动,也会很奇怪,所以重新了WebView的onOverScrolled方法监听内部view滑动来释放焦点,下面是完整代码!

public class MWebView extends WebView {

  public MWebView(Context context) {
    this(context, null);
  }

  public MWebView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  @SuppressLint("ClickableViewAccessibility")
  public MWebView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setOnTouchListener((v, event) -> {
      requestDisallowInterceptTouchEvent(
          event.getAction() != MotionEvent.ACTION_UP);
      return false;
    });
  }
  //判断webview内部滑动到极限后释放touch事件
  @Override
  protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolean clampedY) {
    super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
    if (scrollY == 0 && clampedY) {
      requestDisallowInterceptTouchEvent(false);
    }
  }

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值