[英]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.