Android使用ViewPager實現畫廊效果


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

 

其實這跟普通的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);

完成


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM