Android WebView与ViewPager的滑动冲突分析

前言

如题所述,我使用的架构是ViewPager+Fragment+WebView进行开发的,由于WebView的html页面代码是第三方的,这里不好放出来,所以只能放一个大致的架构图,如图所示,ViewPager包含了两个fragment,可以左右滑动的,左边Fragment的WebView顶部包含了一个banner,这种情况下就会引起banner与ViewPager的滑动冲突。这个问题已经有人有解决方案了,见Viewpager与webview滑动冲突的解决方案,但是这个解决方案需要前端配合,有点麻烦,所以我自己想了个解决方案

问题点

  1. WebView虽然是继承自AbsoluteLayout的但是却不能获取到它的子View
  2. 我的这个WebView是一个音乐展示页面,所以上滑会加载更多
  3. 如何获得banner的高度

解决方案

由于问题点1的存在,无法使用获取子View方式来获取到banner,只能通过获取banner的那一段区域,然后通过WebView的onTouchListener设置requestDisallowInterceptTouchEvent()来进行解决,代码如下:

mWebView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //Rect用于描述WebView的在整个界面坐标,它的left,top,bottom,right四个属性就是描述一个View相对于参照物(如父布局的)的距离
            Rect rect = new Rect();
            //v即是mWebView,getLocalVisibleRect(rect),是把WebView的相对于父布局的坐标描述出来并放入Rect中
            v.getLocalVisibleRect(rect);
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    //rect.top == 0表示滑动到顶部
                    if (rect.top == 0 && event.getY() >= 0 && event.getY() < dpToPx(162)) {
                        mWebView.requestDisallowInterceptTouchEvent(true);
                    } else {
                        mWebView.requestDisallowInterceptTouchEvent(false);
                    }
                    break;
            }
            return false;

        }
});

int dpToPx(int dp) {
    float scale = getResources().getDisplayMetrics().density;
    return (int) (dp * scale + 0.5f);
}
复制代码

这里没有直接使用event.getY()或者是event.getRawY()是因为问题点2的存在,因为滑过了banner之后会出现这两个值还是处于有效的阶段,必须要添加banner处于显示状态的条件。这个地方使用的getLocalVisibleRect方法,关于这个方法我是参照的这个地方,getGlobalVisibleRect和getLocalVisibleRect,直接看最后的结论即可。
最后一个问题点3是关于如何获取banner高度的问题,有两种方式,第一种是直接找前端问, 但是我问的前端不是很靠谱,给的是错的。另一种,自己算,我用的是Android Monitor,AndroidStudio 2.3.3之后好像就没了,只能在SDK目录/tools/monitor打开了,然后截图工具Dump View Hierarchy for UI Automator找到banner对应的View,计算高度

(0,1080)代表的是宽度,(193, 676)代表的是高度,最后计算出来banner的高度是483,单位是px,需要转换为dp。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值