在ViewPager中水平滚动webview

我已经把一个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; } 

下面是一个真正的工作解决scheme,只要滚动,就可以在水平滑动的情况下滚动WebView 。 如果WebView无法进一步滚动,则ViewPager将使用下一个水平滑动来切换页面。

扩展WebView

在API-Level 14(ICS)中,引入了View方法canScrollHorizontally() ,这是我们需要解决的问题。 如果仅为ICS或以上开发,则可以直接使用此方法并跳到下一节。 否则,我们需要自行实施这个方法,以使解决scheme也可以在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的“当前”实现时,上面显示的东西似乎不再需要。 “当前”实现似乎在捕获自己的滚动事件之前正确地检查子视图(请参阅ViewPager canScroll方法)。 不知道确切地说,当实现已经改变,以正确处理 – 我仍然需要上面的Android姜饼(2.3.x)和以前的代码。

虽然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" />