1

我有两个 ViewPager——Pager1 和 Pager2。我向 Pager1 添加了一个 OnPageChangeListener 并在 onPageScrolled 回调中调用 Pager2.scrollTo(x, y) 来移动它。两个 ViewPager 都可以平滑滚动并且是同步的,但问题是 Pager2 的内容没有改变。我用 LogCat 检查了它——根本没有调用 Pager2 的 instantiateItem() 。

作为一种解决方法,我将 Pager2.setCurrentItem() 添加到 Pager1 的 onPageSelected() 回调中。虽然这确实滚动了两个视图,但它不与像素同步。我想知道是否有一种方法可以实现这种效果而不必覆盖实际的 ViewPager 类。

4

2 回答 2

1

最适合我的解决方案是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));

请注意,此解决方案仅在两个寻呼机具有相同方向时才有效。如果您需要它适用于不同的方向 - 调整syncEventY 坐标而不是 X。

我们还需要考虑一个问题——最小的投掷速度和距离,这可能会导致只有一个寻呼机改变页面。

它可以通过添加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 回答