21

多くの子ビューを含むビューページャーがあります。各子ビューは Web ビューです。各 Web ビューには、ユーザーが操作できる HTML オブジェクトがいくつかあります。たとえば、スワイプ ジェスチャで動作するスライドショーや、ユーザーが HTML キャンバス内を移動できるドラッグ可能な円などです。

問題は、ユーザーがこれらの HTML オブジェクトに対してジェスチャを実行すると、viewpager が次のビューにスクロールすることです。ユーザーがHTMLオブジェクトを操作したときにHTMLオブジェクトが機能し(ビューページャーがスクロールしない)、ユーザーが他の場所をスワイプしたときにビューページャーがスクロールするようにします。どうやってやるの?

Viewpager 内の Webview

PS私は、HTMLスライドショーのJavaScriptで、Webビューがタッチイベントを親ビューページャーに渡さないことを期待して使用event.preventDefault()しました。event.stopPropagation()

4

3 に答える 3

4

"canScroll"のメソッドをオーバーライドしViewPager、ビューが のインスタンスでない場合にのみスクロールを許可しますWebView

サンプル:

public class MyViewPager extends ViewPager {

    public MyViewPager (Context context) {
        super(context);
    }

    public MyViewPager (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if(v instanceof WebView){
            return true;
        }
        return super.canScroll(v, checkV, dx, x, y);
    }

}
于 2013-10-29T17:24:38.327 に答える
3

ViewPager の独自のサブクラスを作成し、次のように canScroll を上書きします。

class MyViewPager extends ViewPager {
...

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
    if (isInsideSlideShow(x,y)) {
        return true; // allow the slide show its own scrolling
    } else {
        return false; // ViewPager scrolls
    }
}

もちろん、画面のどの部分がスライド ショーで覆われているかを知る必要があります。この知識はメソッド isInsideSlideShow で実装する必要があります。

スライド ショーの x/y 座標を取得できない場合は、別の解決策として、ページング ジェスチャとしてビューの境界線から開始するジェスチャを使用し、スライド ショー ジェスチャとしてより内側の領域で開始するジェスチャを使用することができます。

マップとグラフを表示するビューページャーにこのアプローチを使用しています。どちらも独自のパンニングをサポートしています。しかし、ユーザーが左または右の境界線でジェスチャを開始すると、マップまたはグラフ全体がスライドして離れます。

@Override
protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        int width = getWidth();
        int slideWidth = Math.round(width * 0.15f);
        if (x < slideWidth || x > width - slideWidth) {
            return false;
        }
        return true;
}
于 2013-10-28T21:15:20.727 に答える
2

私のアイデアは、スクロールする部分を決定する Javascript 関数を実装することでした。

function checkScroll(x, y){
    var o = document.elementFromPoint(x, y);
    result = $('div.swiper-container').find(o).length;
    MyAndroidInterface.processReturnValue(result);
}

次に、これら 2 つのメソッドをオーバーライドします。

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    @Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        homepage.callJavascript("checkScroll(" + Math.round(ev.getX()) + "," + Math.round(ev.getY()) + ")");
        return super.onTouchEvent(ev);
    case MotionEvent.ACTION_MOVE:
        if (homepage.scrollSlideshowLock())
            return false;
于 2014-03-13T09:31:41.763 に答える