Android webview:阻止将触摸手势传递给父viewpager

Hoa*_*ynh 20 html android webview swipe android-viewpager

我有一个包含许多子视图的viewpager; 每个子视图都是一个webview.每个webview都有一些用户可以与之交互的HTML对象; 例如,可以在滑动手势或可拖动的圆圈上工作的幻灯片,用户可以在HTML画布上移动.

问题是当用户对这些HTML对象执行手势时,viewpager会滚动到下一个视图.我希望HTML对象在用户与它们交互时工作(viewpager不滚动),以及当用户在其他地方滑动时滚动的viewpager.我怎样才能做到这一点?

Viewpager中的Web视图

PS我已经使用event.preventDefault()event.stopPropagation()在HTML幻灯片与希望的JavaScript代码的网页流量不会通过触摸事件父viewpager.

Moh*_*hna 5

重写"canScroll"您的方法ViewPager并仅当视图不是 的实例时才允许滚动WebView

样本:

public class MyViewPager extends ViewPager {

    public MyViewPager (Context context) {
        super(context);
    }

    public MyViewPager (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if(v instanceof WebView){
            return true;
        }
        return super.canScroll(v, checkV, dx, x, y);
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 问题是,当用户在 HTML 幻灯片之外但在 WebView 内滑动时,“ViewPager”仍应滚动。 (7认同)

use*_*624 3

创建您自己的 ViewPager 子类并覆盖 canScroll,如下所示。

class MyViewPager extends ViewPager {
...

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (isInsideSlideShow(x,y)) {
        return true; // allow the slide show its own scrolling
    } else {
        return false; // ViewPager scrolls
    }
}
Run Code Online (Sandbox Code Playgroud)

您当然需要知道幻灯片放映覆盖了屏幕的哪一部分。这些知识必须在 isInsideSlideShow 方法中实现。

如果您无法获取幻灯片放映的 x/y 坐标,另一种解决方案可能是使用从视图边界开始的手势作为分页手势,以及使用从内部区域开始的手势作为幻灯片放映手势。

我将这种方法用于显示地图和图表的视图寻呼机。两者都支持自己的平移。但是当用户在左边界或右边界开始手势时,整个地图或图形就会滑开:

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        int width = getWidth();
        int slideWidth = Math.round(width * 0.15f);
        if (x < slideWidth || x > width - slideWidth) {
            return false;
        }
        return true;
}
Run Code Online (Sandbox Code Playgroud)