28

ViewPager内に画像をロードするWebViewを配置しました。画像を水平方向にスクロールしようとすると、画像をスクロールする代わりに次のビューに移動します。

次のビューに移動する前に、画像の最後までスクロールさせることはできますか?

@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;
}
4

2 に答える 2

44

以下は、スクロールWebViewできる限り水平スワイプでスクロールする実際の実用的なソリューションです。がそれ以上スクロールできない場合WebView、次の水平スワイプはViewPagerページを切り替えるために消費されます。

の拡張WebView

API-Level 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を参照)。これを正しく処理するために実装がいつ変更されたのか正確にはわかりません - Android Gingerbread (2.3.x) 以前でも上記のコードが必要です。ViewPager

于 2012-03-29T13:07:28.137 に答える