viewPager实现多卡片滚动效果

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36500835/article/details/82709810

直接上代码
定义xml文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:clipChildren="false"
    android:layout_height="match_parent">
    <android.support.v4.view.ViewPager
        android:layout_gravity="center_horizontal"
        android:id="@+id/Viewpager"
        android:layout_width="match_parent"
        android:layout_marginTop="@dimen/d20"
        android:layout_marginBottom="@dimen/d30"
        android:layout_marginLeft="@dimen/d60"
        android:layout_marginRight="@dimen/d60"
        android:clipChildren="false"
        android:layout_height="match_parent"/>
    <LinearLayout
        android:layout_marginRight="5dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:id="@+id/indicator"
        android:orientation="horizontal"
        android:layout_marginBottom="5dp"
        android:layout_width="wrap_content"
        android:layout_height="15dp"/>
</RelativeLayout>

activity中的代码

V_SchoolsAdapter schoolsAdapter = new V_SchoolsAdapter(getActivity(),mDataList);
Viewpager.setAdapter(schoolsAdapter);
Viewpager.setPageMargin(30);
Viewpager.setOffscreenPageLimit(3);
Viewpager.setPageTransformer(false, new AlphaTransformer());

V_SchoolsAdapter 代码

public class V_SchoolsAdapter extends PagerAdapter {
    private List<getArcticListResponse.ariticInfo> dataList;
    private Context context;
    public static final int MAX_SCROLL_VALUE = 10000;

    public V_SchoolsAdapter(Context context, List<getArcticListResponse.ariticInfo> dataList) {
        this.context = context;
        this.dataList = dataList;
    }
    /**
     * @param container
     * @param position
     * @return 对position进行求模操作
     * 因为当用户向左滑时position可能出现负值,所以必须进行处理
     */
    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        position %= dataList.size();
        getArcticListResponse.ariticInfo ariticInfo = dataList.get(position);
        View ret = LayoutInflater.from(context).inflate(R.layout.h_adapter_coursename_item, container,false);
        TextView textView = ret.findViewById(R.id.name);
        textView.setText(ariticInfo.CreateTime);
        ViewParent viewParent = ret.getParent();
        if (viewParent != null) {
            ViewGroup parent = (ViewGroup) viewParent;
            parent.removeView(ret);
        }
        container.addView(ret);

        return ret;
    }
    /**
     * 由于我们在instantiateItem()方法中已经处理了remove的逻辑,
     * 因此这里并不需要处理。实际上,实验表明这里如果加上了remove的调用,
     * 则会出现ViewPager的内容为空的情况。
     *
     * @param container
     * @param position
     * @param object
     */
    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        //警告:不要在这里调用removeView, 已经在instantiateItem中处理了
    }


    @Override
    public int getCount() {
        int ret = 0;
        if (dataList.size() > 0) {
            ret = MAX_SCROLL_VALUE;
        }
        return ret;
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {

        private final TextView name;


        public MyViewHolder(View itemView) {
            super(itemView);
            name =  itemView.findViewById(R.id.name);
        }
    }
}

AlphaTransformer的代码

public class AlphaTransformer implements ViewPager.PageTransformer {
    private static final float MIN_ALPHA = 0.5f;
    private static final float MIN_SCALE = 0.90f;

    @Override
    public void transformPage(View page, float position) {
        if (position < -1 || position > 1) {
            page.setAlpha(MIN_ALPHA);
            page.setScaleY(MIN_SCALE);
        } else   if (position <= 1) { // [-1,1]
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            if (position < 0) {
                float scaleX = 1 + 0.1f * position;
                page.setScaleY(scaleX);
            } else {
                float scaleX = 1 - 0.1f * position;
                page.setScaleY(scaleX);
            }
            page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36500835/article/details/82709810