android viewpager 实现画廊效果

首先看一下效果图:

    


xml布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/fol_lnlay"
    android:orientation="vertical"
    android:clipChildren="false"
    android:layerType="software"
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
        android:id="@+id/fow_viewpager"
        android:layout_width="300dp"
        android:layout_gravity="center"
        android:layout_marginTop="10dp"
        android:layout_height="150dp">
    </android.support.v4.view.ViewPager>
</LinearLayout>

activity代码:

(这里我是在fragment里面写的 ,其实跟activity布局里面差不多)

public class FollowFragment extends Fragment {

    private LinearLayout fol_lnlay;
    private ViewPager fow_viewpager;
    int[] picArray;
    ImageView[] ivArray;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_follow,container,false);
        fol_lnlay = (LinearLayout) view.findViewById(R.id.fol_lnlay);
        fow_viewpager = (ViewPager) view.findViewById(R.id.fow_viewpager);
        initData();

        //设置Page间间距
        fow_viewpager.setPageMargin(60);
        //设置缓存的页面数量
        fow_viewpager.setOffscreenPageLimit(4);
       fow_viewpager.setPageTransformer(true, new PagerTransformer());
        fow_viewpager.setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return Integer.MAX_VALUE;
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

            @Override
            public Object instantiateItem(ViewGroup container, int position) {

                int p = position % 4;
                RoundAngleImageView view = new RoundAngleImageView(getActivity());
                view.setScaleType(ImageView.ScaleType.FIT_XY);
//                ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(100 , 300);
                view.setImageResource(picArray[p]);

                container.addView(view);
                return view;
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView((View) object);
            }
        });
        fow_viewpager.setCurrentItem(Integer.MAX_VALUE/2);
        return view;
    }
    private void initData() {
        picArray = new int[4];
        picArray[0] = R.mipmap.lunpou1;
        picArray[1] = R.mipmap.lunpou2;
        picArray[2] = R.mipmap.lunpou3;
        picArray[3] = R.mipmap.lunpou4;

    }

}
PagerTransformer布局:
public class PagerTransformer implements ViewPager.PageTransformer {
    public static final float minScale = 0.9f;
    private static final float DEFAULT_MAX_ROTATE = 15f;
    private float mMaxRotate = DEFAULT_MAX_ROTATE;
    public static final float DEFAULT_CENTER = 0.4f;
    /**
     * 每个状态的view该显示多大是根据position的值来设置的。
     * 本例中值关心3张图片的大小,就只有3个状态。position小于-1 , -1到1 大于1
     * 等于-1 就是屏幕上左边的图片 , 等于1 是屏幕右边的图 等于0是中间的图。
     * @param page
     * @param position -- 第一个view的position初始为0 ,向左滑第一个view的position就慢慢减少成为负数。
     *                 第二个view的position初始为1,向左滑慢慢变成0.变成0时就是这个view在最中间的时候。
     *                 整个过程,每个view的position都是在变的、
     */
    @Override
    public void transformPage(View page, float position) {

        page.setPivotY(page.getHeight()/2);//旋转轴

        if (position < -1) {
//            view.setAlpha(mMinAlpha);
            page.setScaleY(minScale);
            page.setScaleX(minScale);
            page.setRotationY(-1 * mMaxRotate);
            page.setPivotX(page.getWidth());

        } else if (position <= 1) { // [-1,1]
            page.setRotationY(position * mMaxRotate);
            if (position < 0) //[0,-1]
            {
                float factor = minScale + (1 - minScale) * (1 + position);
                page.setScaleY(factor);
                page.setScaleX(factor);

//                page.setPivotX(page.getWidth() * (DEFAULT_CENTER + DEFAULT_CENTER * (-position)));
                page.setPivotX(page.getWidth());

            } else//[1,0]
            {
                float factor = minScale + (1 - minScale) * (1 - position);
                page.setScaleY(factor);
                page.setScaleX(factor);

//                page.setPivotX(page.getWidth() * DEFAULT_CENTER * (1 - position));
                page.setPivotX(0);
            }
        } else { // (1,+Infinity]
            page.setScaleY(minScale);
            page.setScaleX(minScale);


            page.setRotationY(1 * mMaxRotate);
            page.setPivotX(0);
        }
    }

}


在我写适配器的时候,new了一个类,那个类就是我自定义的imageview的圆角,可以参考:https://blog.csdn.net/why_111/article/details/80720043

如果不想写的话  直接new一个Imageview就可以。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值