web-dev-qa-db-ja.com

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;
}
27
Spiff

以下は、スクロールできる限り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。 「現在の」実装は、それ自体でスクロールイベントをキャプチャする前にサブビューを正しくチェックするようです(canScrollViewPagerメソッドを参照してください here )。これが正しく処理されるように実装が変更された場合、正確にはわかりません。Android Gingerbread(2.3.x)以前でも、上記のコードが必要です。

41
sven