實現ViewPager的Fragment之間切換動畫
阿新 • • 發佈:2019-01-09
整體思路:
建立一個類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.