簡體   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