28

我已经在 ViewPager 中放置了一个加载图像的 WebView。当我尝试水平滚动图像时,我移动到下一个视图而不是滚动图像。

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

@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;
}
4

2 回答 2

44

以下是一个真正的工作解决方案,WebView只要它可以滚动,它就会在水平滑动时滚动。如果WebView无法进一步滚动,则下一次水平滑动将被ViewPager用于切换页面。

扩展WebView

API-Level 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的方法)。不确切知道,何时更改实现以正确处理此问题 - 我仍然需要 Android Gingerbread (2.3.x) 及之前的代码。ViewPager

于 2012-03-29T13:07:28.137 回答
-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" 
 />
于 2013-11-10T00:28:26.623 回答