Android Viewpager与WebView轮播滑动冲突的解决方案

本文介绍了解决WebView中的轮播控件与ViewPager滑动冲突的问题。通过网页与Android端配合,利用JS接口获取轮播控件位置,再通过自定义OnTouchListener处理WebView的Touch事件,最终实现WebView轮播正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在进行混合开发过程中,用viewpager+fragment的方式在基本框架,在里面fragment中包含webview,而在webview中存在一个横屏轮播的控件,导致在执行webview轮播滑动时,会触发viewpager的滑动,导致webview的轮播失效,经过一番对该问题的搜索和实践,最后将问题解决。该方法需要网页与Android两端配合使用。

解决的方法:

首先需要在网页端写js接口,获取轮播控件的宽高以及相对于原点的位置,获取轮播宽高的坐标的实际也比较重要,需要在页面刚加载获取一次,现在轮播控件的宽高,并且调起写好的js调Android的方法,同时也需要Android端定义好对应的接口,并且在上下滑动的时候也需要去计算现在轮播控件的宽高,并且给Android端发送过去。

由于我主要开发的Android端,所以不知道网页端js的代码,如有需要自行查找:

window.onload = function(){ ... } window.onscroll = function(){ ... }

在Android端的主要代码:

首先需要定义一个类来接收js接口返回的坐标值

public class PagerDesc {
    private int top;
    private int left;
    private int right;
    private int bottom;

    //get set方法

    public PagerDesc(int top, int left, int right, int bottom) {
        this.top = top;
        this.bottom = bottom;
    }
}
定义js接口,用PagerDesc类来接收返回的原点坐标和宽高值


当解决完以上的内容,接下来是根据Android的机制来进行在webview的onTouch事件进行处理

详细代码:

webView.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    //获取y轴坐标
                    float y = event.getRawY();
                    switch (event.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            if (null != mPagerDesc) {
                                int top = mPagerDesc.getTop();
                                int bottom = top + (mPagerDesc.getBottom() - mPagerDesc.getTop());
                                //将css像素转换为android设备像素并考虑通知栏高度
                                DisplayMetrics metric = context.getResources().getDisplayMetrics();
                                top = (int) (top * metric.density) + ScreenUtil.getStatusBarHeight(getActivity());
                                bottom = (int) (bottom * metric.density) + ScreenUtil.getStatusBarHeight(getActivity());
                                //如果触摸点的坐标在轮播区域内,则由webview来处理事件,否则由viewpager来处理
                                if (y > top&& y<bottom){
                                    webView.requestDisallowInterceptTouchEvent(true);
                                }else{
                                    webView.requestDisallowInterceptTouchEvent(false);
                                }
                            } break;
                        case MotionEvent.ACTION_UP:
                            break;
                        case MotionEvent.ACTION_MOVE:
                            break;
                    }
                    return false;
                }
            });
这样基本就可以了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值