ViewPagerIndicator не разрешает setBackgroundResource на ViewPager

Я пытаюсь использовать ParallaxViewPager (https://github.com/andraskindler/parallaxviewpager) вместе с индикатор ViewPagerIndicator (https://github.com/JakeWharton/Android-ViewPagerIndicator). Проблема, с которой я столкнулся, заключается в том, что я устанавливаю фоновый ресурс для ViewPager, и он работает правильно, если я не устанавливаю индикатор страницы. Но мне нужно, чтобы индикатор viewpager работал с ParallaxViewPager.

Код, который я использую,

    final ParallaxViewPager parallaxViewPager = (ParallaxViewPager) rootView.findViewById(R.id.authentication_opening_fragment_viewpager);
    PageIndicator pageIndicator = (CirclePageIndicator) rootView.findViewById(R.id.authentication_opening_fragment_indicator);

    parallaxViewPager.setAdapter(new AuthenticationOpeningPageAdapter(context.getFragmentManager()));
    parallaxViewPager.setBackgroundResource(R.drawable.bg_opening);

    pageIndicator.setViewPager(parallaxViewPager); 

Если я не использую последнюю строку, фоновое изображение параллакса работает правильно, но тогда у меня не будет индикатора. Если я использую .setViewPager(), то мой viewpager будет иметь только пустой фон.

При отладке я обнаружил, что "аннулирует" setBackgroundResource эта строка в библиотеке ViewPagerIndicator (в файле CirclePageIndicator):

mViewPager.setOnPageChangeListener(this);

Есть ли обходной путь или что-то, что я могу сделать, чтобы решить эту проблему?


person guimellon    schedule 18.08.2014    source источник
comment
У меня точно такая же проблема. Вы придумали, как это решить?   -  person suresh cheemalamudi    schedule 03.09.2014


Ответы (1)


Чтобы это работало, вам нужно немного изменить ParallaxViewPager вот так

private void init() {
    source = new Rect();
    destination = new Rect();
    scaleType = FIT_HEIGHT;
    overlap = OVERLAP_HALF;
    listener = new PageChangeParallaxListener();
    setOnPageChangeListener(listener);
}

public PageChangeParallaxListener listener;

public ViewPager.OnPageChangeListener getPageChangeListener() {
    return listener;
}

public class PageChangeParallaxListener implements
        ViewPager.OnPageChangeListener {

    @Override
    public void onPageScrolled(int position, float positionOffset,
            int positionOffsetPixels) {
        if (bitmap != null) {
            source.left = (int) Math
                    .floor((position + positionOffset - CORRECTION_PERCENTAGE)
                            * chunkWidth);
            source.right = (int) Math
                    .ceil((position + positionOffset + CORRECTION_PERCENTAGE)
                            * chunkWidth + projectedWidth);
            destination.left = (int) Math
                    .floor((position + positionOffset - CORRECTION_PERCENTAGE)
                            * getWidth());
            destination.right = (int) Math.ceil((position + positionOffset
                    + 1 + CORRECTION_PERCENTAGE)
                    * getWidth());
            invalidate();
        }

        if (secondOnPageChangeListener != null) {
            secondOnPageChangeListener.onPageScrolled(position,
                    positionOffset, positionOffsetPixels);
        }
    }

    @Override
    public void onPageSelected(int position) {
        if (secondOnPageChangeListener != null) {
            secondOnPageChangeListener.onPageSelected(position);
        }
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        if (secondOnPageChangeListener != null) {
            secondOnPageChangeListener.onPageScrollStateChanged(state);
        }
    }

}

И при реализации CirclePageIndicator вы должны сделать это

ParallaxViewPager viewPager;
CirclePageIndicator circlePageIndicator;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(your layout);
    //do you view initialization by ID 
    viewPager.setAdapter(your adapter);
    circlePageIndicator.setOnPageChangeListener(viewPager
            .getPageChangeListener());
    circlePageIndicator.setViewPager(viewPager);
    viewPager.setBackgroundResource(R.drawable.parallax_bg);
}
person laaptu    schedule 22.10.2014
comment
Начиная с версии 0.3.1 библиотеки параллакса, некоторые переменные помечены как private и поэтому больше не могут расширяться от ParallaxViewPager =/ - person Tommy Chan; 31.03.2015