在ViewPager中水平滚动webview

时间:2011-10-14 23:35:08

标签: 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;
}

2 个答案:

答案 0 :(得分:41)

以下是一个真正有效的解决方案,只要它可以滚动,它就会在水平滑动上滚动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;
        }
    }
}

重要提示:请记住在您的布局文件中引用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);
        }
    }
}

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

就是这样!

更新2012/07/08:我最近注意到,在使用ViewPager的“当前”实施时,似乎不再需要上面显示的内容。 “当前”实现似乎在捕获滚动事件之前正确检查子视图(请参阅canScroll hereViewPager方法)。不确切地知道,当实现被更改为正确处理时 - 我仍然需要Android Gingerbread(2.3.x)及之前的代码。

答案 1 :(得分:-1)

虽然Sven提到布局文件我想添加细节。在扩展Webview和ViewPager类之后,

在您的活动中,您将投射到您的扩展类:

web = (MyWebView) findViewById(R.id.webview);

在布局文件中,如下所示:

<your.package.name.MyWebView
  android:id="@+id/webview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" 
 />