1. 程式人生 > >實現ViewPager的Fragment之間切換動畫

實現ViewPager的Fragment之間切換動畫

整體思路:

建立一個類MyPagerTransition 實現ViewPager.PageTransition

public class MyPagerTransition implements ViewPager.PageTransformer{

    @Override
    public void transformPage(@NonNull View page, float position) {
        float MIN_SCALE=0.75f;
        float scaleFactor=MIN_SCALE+(1-MIN_SCALE)*(1-Math.abs(position));
        if (position>1||position<-1){
            page.setAlpha(0f);
        }else if (position<=0){
            page.setAlpha(1+position);
            page.setScaleX(scaleFactor);
            page.setScaleY(scaleFactor);
        }else if (position<=1){
            page.setAlpha(1-position);
            page.setScaleX(scaleFactor);
            page.setScaleY(scaleFactor);
        }
    }
}

position代表頁面的位置

-1    左邊頁面

0    當前頁面

1    右邊頁面

不過position不是整型,如果當前頁面完全顯示,那麼其position為1

如果將其拖動一點,例如


上圖是將fragment向左拖拽

圖1position本來是0,但因為向左,所以現在是【-1,0】

圖2position為1,向左,現在為【0,1】

綜上,fragment的position向左移動會減少,向右會增加

而且注意,

  public void transformPage(@NonNull View page, float position)

這個方法只要當你移動了fragment就會隨時呼叫

如果position>1||position<-1,則表示完全看不到該fragment,所以alpha設為0f

如果position為[0,1]||[-1,0]則應該有動畫效果

[0,1]

這裡實現了淡化和縮放

淡化則需要用到,setAlpha()

我們知道,完全顯示是1f,所以這時我們alpha需要設定為

    1-position

縮放則需要用到

  page.setScaleX(scaleFactor);
  page.setScaleY(scaleFactor);

我們首先設定一個最小縮放值

   float MIN_SCALE=0.75f;
當position為0時則不需要縮放,而且正負對縮放應該沒有影響,所以
 float scaleFactor=MIN_SCALE+(1-MIN_SCALE)*(1-Math.abs(position));

這樣,切換動畫就設定好了,然後我們需要設定到對應的ViewPager上

很簡單,只需要這樣就行了

  mPager.setPageTransformer(false,new MyPagerTransition());

第一個引數的含義

true if the supplied PageTransformer requires page views to be drawn from last to first instead of first to last.