繁体   English   中英

Android ViewPager同步滚动

[英]Android viewpager synchronized scrolling

我有两个ViewPagers-Pager1和Pager2。 我添加了一个OnPageChangeListener到Pager1,并且在onPageScrolled回调中,我调用Pager2.scrollTo(x,y)来移动它。 两个ViewPagers确实可以平滑滚动并被同步,但是问题是Pager2的内容没有改变。 我用LogCat进行了检查-Pager2的InstantiateItem()根本没有被调用。

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

您是否尝试过beginFakeDrag()

该工作最适合我的解决方案是通过MotionEventOnTouchListener之间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 Y坐标而不是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
        }
    }); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM