1

Pager1 と Pager2 の 2 つの ViewPager があります。OnPageChangeListener を Pager1 に追加し、onPageScrolled コールバックで Pager2.scrollTo(x, y) を呼び出して移動します。どちらの ViewPager もスムーズにスクロールし、同期していますが、問題は Pager2 の内容が変化しないことです。LogCat で確認しました -- Pager2 の instantiateItem() はまったく呼び出されません。

回避策として、Pager1 の onPageSelected() コールバックに Pager2.setCurrentItem() を追加しました。これは両方のビューをスクロールしますが、ピクセルには同期されません。実際の ViewPager クラスをオーバーライドせずにこの効果を達成する方法があるかどうか疑問に思っています。

4

2 に答える 2

1

私にとって最も効果的な解決策は、インスタンス間で渡すことMotionEventでしたOnTouchListenerViewPager偽のドラッグを試みましたが、常にラグがあり、バグがありました。スムーズで視差のような効果が必要でした。

したがって、私の解決策は を実装することでしたView.OnTouchListenerMotionEvent幅の違いを補うために、 をスケーリングする必要があります。

public class SyncScrollOnTouchListener implements View.OnTouchListener {

private final View syncedView;

public SyncScrollOnTouchListener(@NonNull View syncedView) {
    this.syncedView = syncedView;
}

@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
    MotionEvent syncEvent = MotionEvent.obtain(motionEvent);
    float width1 = view.getWidth();
    float width2 = syncedView.getWidth();

    //sync motion of two view pagers by simulating a touch event
    //offset by its X position, and scaled by width ratio
    syncEvent.setLocation(syncedView.getX() + motionEvent.getX() * width2 / width1,
            motionEvent.getY());
    syncedView.onTouchEvent(syncEvent);
    return false;
}
}

次に、それをあなたに設定しますViewPager

    sourcePager.setOnTouchListener(new SyncScrollOnTouchListener(targetPager));

このソリューションは、両方のポケットベルの向きが同じ場合にのみ機能することに注意してください。異なる向きで動作させる必要がある場合syncEventは、X 座標ではなく Y 座標を調整してください。

考慮しなければならない問題がもう 1 つあります。1 つのポケットベルだけでページが変わる可能性がある最小フリング速度と距離です。

OnPageChangeListenerページャーにを追加することで簡単に修正できます

sourcePager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset,
                                   int positionOffsetPixels) {
            //no-op
        }

        @Override
        public void onPageSelected(int position) {
            targetPager.setCurrentItem(position, true);
        }

        @Override
        public void onPageScrollStateChanged(int state) {
            //no-op
        }
    }); 
于 2017-04-27T12:19:48.710 に答える
0

試しましたbeginFakeDrag()か?

于 2012-12-20T04:53:29.743 に答える