Круговой (вертикальный) ViewPager - неправильный порядок и проблемы с пользовательским интерфейсом - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь настроить круговой вертикальный (см. Класс ниже) видовой пейджер, но он не совсем работает так, как я хочу.

Используйте ссылку https://github.com/BloodWorking/TestCircularViewPager, чтобы увидеть изображения того, что я имею в виду:

(Downscroll.gif) При запуске / первом понижении прокрутки он снова переходит на страницу 1 вместо страницы 2. После этого первого раза это нормально (страницы с 1 по 2).

(Upscroll.gif) При запуске / первом повышении прокрутки он переходит на страницу 2 вместо страницы 3. Он перепрыгивает через нее.После этого первого раза каждый раз, когда я прокручиваю вверх со страницы 1 до страницы 3, страница 3 видна недолго, а затем исчезает (только видимость).

Я не могу понять, почему и как это исправить.Буду признателен за помощь.

Я думаю, что мое решение для CircularViewPager, возможно, не самое лучшее, поэтому я бы также принял предложения и для других решений;).

    mViewPager.setAdapter(mSectionsPagerAdapter);
    mViewPager.setCurrentItem(1, false);
    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageSelected(int position) {
            mCurrentPosition = position; 
        }

        @Override
        public void onPageScrollStateChanged(int state) {

            if (mCurrentPosition == 0)
                mViewPager.setCurrentItem(lastPageIndex - 1, false); 

           //lastPageIndex is 4 (global variable)

            if (mCurrentPosition == lastPageIndex)
                mViewPager.setCurrentItem(1, false);

        }
    });




public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: return PlaceholderFragment.newInstance(3);
            case 1: return PlaceholderFragment.newInstance(1);
            case 2: return PlaceholderFragment.newInstance(2);
            case 3: return PlaceholderFragment.newInstance(3);
            case 4: return PlaceholderFragment.newInstance(1);
            default: return null;
        }

    }

    @Override
    public int getCount() {
        return 5;
    }
}

VerticalViewPager:

public class VerticalViewPager extends ViewPager {
    public VerticalViewPager(Context context) {
        super(context);
        init();
    }

    public VerticalViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        setPageTransformer(true, new VerticalPageTransformer());
        setOverScrollMode(OVER_SCROLL_NEVER);
    }

    private class VerticalPageTransformer implements ViewPager.PageTransformer {

        @Override
        public void transformPage(@NonNull View view, float position) {

            if (position < -1) {
                view.setAlpha(0);
            } else if (position <= 1) {
                view.setAlpha(1);

                view.setTranslationX(view.getWidth() * -position);

                float yPosition = position * view.getHeight();
                view.setTranslationY(yPosition);
            } else {
                view.setAlpha(0);
            }
        }
    }

    private MotionEvent swapXY(MotionEvent ev) {
        float width = getWidth();
        float height = getHeight();

        float newX = (ev.getY() / height) * width;
        float newY = (ev.getX() / width) * height;

        ev.setLocation(newX, newY);

        return ev;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        boolean intercepted = super.onInterceptTouchEvent(swapXY(ev));
        swapXY(ev);
        return intercepted;
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return super.onTouchEvent(swapXY(ev));
    }

}
...