私にとって最も効果的な解決策は、インスタンス間で渡すことMotionEvent
でしたOnTouchListener
。ViewPager
偽のドラッグを試みましたが、常にラグがあり、バグがありました。スムーズで視差のような効果が必要でした。
したがって、私の解決策は を実装することでしたView.OnTouchListener
。MotionEvent
幅の違いを補うために、 をスケーリングする必要があります。
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
}
});