我把一个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;
}
答案 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
here的ViewPager
方法)。不确切地知道,当实现被更改为正确处理时 - 我仍然需要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"
/>