在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" />