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);

完成

posted @ 2021-03-13 15:44  坏蛋不是蛋  阅读(1174)  评论(0编辑  收藏  举报