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

    完成

  • 相关阅读:
    拓扑排序
    最短路径(Dijkstra,SPFA,Floyd)
    最小生成树(Prim)
    最长公共子序列(DP)(二种数组实现+扩展)
    HDU3068(最长回文串)
    python pip 阿里云内网安装地址
    python matplotlib画图改为可写中文
    win10 安装 basemap
    Liunx 安装basemap
    Docker 命令大全
  • 原文地址:https://www.cnblogs.com/999625696397qq/p/14529080.html
Copyright © 2020-2023  润新知