Я пытаюсь настроить круговой вертикальный (см. Класс ниже) видовой пейджер, но он не совсем работает так, как я хочу.
Используйте ссылку 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));
}
}