[英]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()
?
该工作最适合我的解决方案是通过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
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.