按照國際慣例,先上效果圖

其實這跟普通的ViewPager原理都一樣,需要改變的地方就是:
1.增加滑進和滑出的動畫效果
2.縮小ViewPager的大小,給屏幕上留出上一張和下一張視圖的空間
布局文件:
1 <RelativeLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 android:clipChildren="false" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent"> 6 7 <androidx.viewpager.widget.ViewPager 8 android:id="@+id/shareImg" 9 android:layout_width="match_parent" 10 android:layout_marginHorizontal="60dp" 11 android:layout_height="wrap_content" 12 android:layout_centerInParent="true" 13 android:clipChildren="false" 14 android:layout_above="@+id/shareOptions" 15 /> 16 17 </RelativeLayout>
這里只貼出了需要用到的部分
注意viewpager自身和父布局都需要加上 android:clipChildren="false" 屬性
網上大神解釋為:在子View進行繪制時不裁切它們的顯示范圍
接下來是動畫部分:
這里需要寫個繼承自ViewPager.PageTransformer的類,並重寫transformPage方法
1 public class ScaleAlphaPageTransformer implements ViewPager.PageTransformer{ 2 public static final float MAX_SCALE = 1.0f; 3 public static final float MIN_SCALE = 0.8f; 4 public static final float MAX_ALPHA = 1.0f; 5 public static final float MIN_ALPHA = 0.7f; 6 7 private boolean alpha = true; 8 private boolean scale = true; 9 10 @Override 11 public void transformPage(View page, float position) { 12 13 if (position < -1) { 14 position = -1; 15 } else if (position > 1) { 16 position = 1; 17 } 18 19 float tempScale = position < 0 ? 1 + position : 1 - position; 20 21 if(scale){ 22 float slope = (MAX_SCALE - MIN_SCALE) / 1; 23 //一個公式 24 float scaleValue = MIN_SCALE + tempScale * slope; 25 page.setScaleX(scaleValue); 26 page.setScaleY(scaleValue); 27 } 28 if(alpha){ 29 //模糊 30 float alope = (MAX_ALPHA - MIN_ALPHA) / 1; 31 float alphaValue = MIN_ALPHA + tempScale * alope; 32 page.setAlpha(alphaValue); 33 } 34 } 35 36 /*** 37 * 設置是否模糊和改變大小 38 * @param alpha 39 * @param scale 40 */ 41 public void setType(boolean alpha, boolean scale){ 42 this.alpha = alpha; 43 this.scale = scale; 44 } 45 }
最后就是調用了
1 ScaleAlphaPageTransformer scaleAlphaPageTransformer = new ScaleAlphaPageTransformer(); 2 scaleAlphaPageTransformer.setType(true,true); 3 viewPager.setPageTransformer(true,scaleAlphaPageTransformer); 4 viewPager.setPageMargin(2); //設置頁卡之間的距離 5 viewPager.setOffscreenPageLimit(3); //設置頁面緩存數量 6 ShareImgAdapter shareImgAdapter = new ShareImgAdapter(listOfImg); 7 viewPager.setAdapter(shareImgAdapter);
完成
