1. 程式人生 > >ViewPager滑動動畫

ViewPager滑動動畫

Android從3.0開始,就添加了很多動畫,ViewPager當然也不例外,相對於非常平庸的預設切換動畫,Google給我們展示了兩個動畫例子:DepthPageTransformer和ZoomOutPageTransformer,實際上我們也可以通過實現ViewPager.PageTransformer來做出完全不同的切換動畫效果。關鍵是要理解transformPage(View view, float position)的引數。view理所當然就是滑動中的那個view,position這裡是float型別,不是平時理解的int位置,而是當前滑動狀態的一個表示,比如當滑動到正全屏時,position是0,而向左滑動,使得右邊剛好有一部被進入螢幕時,position是1,如果前一頁和下一頁基本各在螢幕佔一半時,前一頁的position是-0.5,後一頁的posiotn是0.5,所以根據position的值我們就可以自行設定需要的alpha,x/y資訊。

下面,我們來看看Google官方提供的兩種動畫效果的程式碼,很簡單,相信每個人看過之後,都能自己實現一種動畫效果,

DepthPageTransformer:

  1. publicclassDepthPageTransformerimplementsPageTransformer{
  2. privatestaticfloat MIN_SCALE =0.75f;
  3. @SuppressLint("NewApi")
  4. @Override
  5. publicvoid transformPage(View view,float position){
  6. int pageWidth = view.getWidth();
  7. if(position
    <-1){// [-Infinity,-1)
  8. // This page is way off-screen to the left.
  9. view.setAlpha(0);
  10. }elseif(position <=0){// [-1,0]
  11. // Use the default slide transition when
  12. // moving to the left page
  13. view.setAlpha(1);
  14. view.setTranslationX(0);
  15. view.setScaleX(1);
  16. view.setScaleY
    (1);
  17. }elseif(position <=1){// (0,1]
  18. // Fade the page out.
  19. view.setAlpha(1- position);
  20. // Counteract the default slide transition
  21. view.setTranslationX(pageWidth *-position);
  22. // Scale the page down (between MIN_SCALE and 1)
  23. float scaleFactor = MIN_SCALE +(1- MIN_SCALE)
  24. *(1-Math.abs(position));
  25. view.setScaleX(scaleFactor);
  26. view.setScaleY(scaleFactor);
  27. }else{// (1,+Infinity]
  28. // This page is way off-screen to the right.
  29. view.setAlpha(0);
  30. }
  31. }
  32. }

ZoomOutPageTransformer:

  1. publicclassZoomOutPageTransformerimplementsPageTransformer{
  2. privatestaticfloat MIN_SCALE =0.85f;
  3. privatestaticfloat MIN_ALPHA =0.5f;
  4. @Override
  5. publicvoid transformPage(View view,float position){
  6. int pageWidth = view.getWidth();
  7. int pageHeight = view.getHeight();
  8. if(position <-1){// [-Infinity,-1)
  9. // This page is way off-screen to the left.
  10. view.setAlpha(0);
  11. }elseif(position <=1){// [-1,1]
  12. // Modify the default slide transition to
  13. // shrink the page as well
  14. float scaleFactor =Math.max(MIN_SCALE,1-Math.abs(position));
  15. float vertMargin = pageHeight *(1- scaleFactor)/2;
  16. float horzMargin = pageWidth *(1- scaleFactor)/2;
  17. if(position <0){
  18. view.setTranslationX(horzMargin - vertMargin /2);
  19. }else{
  20. view.setTranslationX(-horzMargin + vertMargin /2);
  21. }
  22. // Scale the page down (between MIN_SCALE and 1)
  23. view.setScaleX(scaleFactor);
  24. view.setScaleY(scaleFactor);
  25. // Fade the page relative to its size.
  26. view.setAlpha(MIN_ALPHA +(scaleFactor - MIN_SCALE)
  27. /(1- MIN_SCALE)*(1- MIN_ALPHA));
  28. }else{// (1,+Infinity]
  29. // This page is way off-screen to the right.
  30. view.setAlpha(0);
  31. }
  32. }
  33. }

有了這兩種效果,我們在程式碼中設定一下就生效了:mPager.setPageTransformer(true, new DepthPageTransformer());