가장 좋은 해결책은 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));
참고로 설정합니다. 다른 방향으로 작업해야하는 경우 - X 대신 syncEvent
Y 좌표를 조정하십시오.
한 번만 호출기가 페이지를 변경할 수있는 최소 이륙 속도와 거리를 고려해야 할 문제가 하나 더 있습니다.
그것은 쉽게 우리 호출기로 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
}
});