画像をロードする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;
}
以下は、スクロールできる限り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
のViewPager
メソッドを参照してください here )。これが正しく処理されるように実装が変更された場合、正確にはわかりません。Android Gingerbread(2.3.x)以前でも、上記のコードが必要です。