在ViewPager中水平滚动webview

Spi*_*iff 27 android scroll android-webview android-viewpager

我把一个WebView加载到ViewPager中的图像.当我尝试水平滚动图像时,我移动到下一个视图而不是滚动图像.

是否可以在移动到下一个视图之前滚动到图像的末尾?

@Override
public Object instantiateItem(View view, int i) {

    WebView webview = new WebView(view.getContext());
    webview.setHorizontalScrollBarEnabled(true);
    webview.loadUrl("http://www.site.with.an/image.gif");
    ((ViewPager) view).addView(webview, 0);

    return webview;
}
Run Code Online (Sandbox Code Playgroud)

sve*_*ven 42

以下是一个真正有效的解决方案,WebView只要它可以滚动,它将在水平滑动上滚动.如果WebView无法进一步滚动,则ViewPager切换页面将消耗下一次水平滑动.

延伸 WebView

使用API​​级别14(ICS)引入了该View方法canScrollHorizontally(),我们需要解决该问题.如果您仅为ICS或更高版本开发,则可以直接使用此方法并跳到下一部分.否则,我们需要自己实现此方法,以使解决方案也适用于ICS之前.

要做到这一点,只需从WebView以下方面派生自己的类:

public class ExtendedWebView extends WebView {
    public ExtendedWebView(Context context) {
        super(context);
    }

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

    public boolean canScrollHor(int direction) {
        final int offset = computeHorizontalScrollOffset();
        final int range = computeHorizontalScrollRange() - computeHorizontalScrollExtent();
        if (range == 0) return false;
        if (direction < 0) {
            return offset > 0;
        } else {
            return offset < range - 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:请记住ExtendedWebView在您的布局文件中引用您的内部而不是标准WebView.

延伸 ViewPager

现在您需要扩展ViewPager以正确处理水平滑动.无论如何,无论您是否使用ICS,都需要这样做:

public class WebViewPager extends ViewPager {
    public WebViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if (v instanceof ExtendedWebView) {
            return ((ExtendedWebView) v).canScrollHor(-dx);
        } else {
            return super.canScroll(v, checkV, dx, x, y);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

重要提示:请记住WebViewPager在您的布局文件中引用您的内部而不是标准ViewPager.

而已!

更新2012/07/08:我最近注意到,使用"当前"实现时,上面显示的内容似乎不再需要了ViewPager."当前"实现似乎在捕获滚动事件之前正确检查子视图(参见此处的canScroll方法).不确切地知道,当实现已经改变以正确处理这个问题 - 我仍然需要Android Gingerbread(2.3.x)及之前的代码.ViewPager

  • 当我尝试这个computerHorizo​​ntalScrollRange()总是返回0.而computerHorizo​​ntalScrollRange()和computerHorizo​​ntalScrollExtent总是返回相同的值(1200.) (2认同)