2

Я положил ViewPager с прозрачным фоном над другим фоном зрением, и когда свитки ViewPager, я изменить цвет фона Вида с гладким переходом цвета, например:Почему анимация перехода цвета неправильна, когда ViewPager прокручивается влево?

  1. На странице 1, фон красный.
  2. Когда ViewPager прокручивается со страницы 1 на страницу 2, я заменяю фон LayerDrawable, RED сверху, BLUE внизу.
  3. Во время прокрутки я уменьшил альфа верхнего слоя, показывая переход от красного к СИНИМ.
  4. Наконец, на стр. 2, после прокрутки заканчивается, я меняю фон на СИНИЙ.

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

Вот мой код:

private int[] colors = {Color.BLUE, Color.RED, Color.GREEN, Color.CYAN}; 
private int currentPage; 
private LayerDrawable layersDrawable; 
@Override 
public void onPageScrollStateChanged(int state) { 
    if(state==ViewPager.SCROLL_STATE_DRAGGING){ 

    }else if(state==ViewPager.SCROLL_STATE_IDLE){ 
     currentPage = pager.getCurrentItem(); 
     setBackground(new ColorDrawable(colors[currentPage%4])); 
     layersDrawable = null; 
    } 
} 
@Override 
public void onPageScrolled(int pos, float positionOffset, int positionPixels) { 
    if(positionOffset==0) return; 
    if(layersDrawable==null){ 
     int bottomColor; 
     Log.i("POSITION", currentPage+" "+pos); 
     if(pos<currentPage){ 
      //scroll left 
      bottomColor = colors[(currentPage+3)%4]; 
     }else{ 
      bottomColor = colors[(currentPage+1)%4]; 
     } 
     ColorDrawable bottom = new ColorDrawable(bottomColor); 
     ColorDrawable top = new ColorDrawable(colors[currentPage%4]); 
     Log.i("COLOR", "TOP:"+colors[currentPage%4]); 
     Drawable[] layers = {bottom, top}; 
     layersDrawable = new LayerDrawable(layers); 
     setBackground(layersDrawable); 
    } 
    ColorDrawable top = (ColorDrawable)layersDrawable.getDrawable(1); 
    top.setAlpha((int)(255*(1-positionOffset))); 
} 

Это действительно странно ... Можете ли вы понять, что я сделал не так?

ответ

1

Это было глупо с моей стороны, я узнал, что positionOffset на самом деле процент страницы слева показано, так что, когда прокрутка влево,

top.setAlpha((int)(255*(1-positionOffset))); 

должен быть изменен на:

top.setAlpha((int)(255*positionOffset)); 
Смежные вопросы