Android的ViewPager(轮播图)的实现

  1. 本文使用了ViewPager(androidx.viewpager.widget.ViewPager)来实现轮播图的功能

一、思路

 我们想要实现一个轮播图的功能,首先能想到的是使用ViewPager来实现。

  1. 就是使得ViewPager实现启动页来无限的轮播图片
  2. 启动一个定时器来完成自动的轮播效果。

二、代码布局

  • 效果图

  • 主界面布局XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:clipChildren="false"
    android:layerType="software"
    tools:ignore="MissingDefaultResource,ResourceName">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
        android:layout_centerHorizontal="true"
        android:layout_marginHorizontal="60dp"
        android:layout_above="@+id/ll">
    </androidx.viewpager.widget.ViewPager>

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_marginTop="10dp"
        android:orientation="vertical"
        android:visibility="visible">

        <TextView
            android:id="@+id/tv_filename"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:padding="2dp"
            android:text=""
            android:textColor="@android:color/white" />

        <LinearLayout
            android:id="@+id/points"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center_horizontal"
            android:orientation="horizontal">
        </LinearLayout>

        <RelativeLayout
            android:id="@+id/ll_download"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <com.inroad.ui.widgets.InroadBtn_Medium
                android:id="@+id/btn_download"
                android:layout_width="120dp"
                android:layout_height="40dp"
                android:layout_marginTop="10dp"
                android:layout_centerHorizontal="true"
                android:gravity="center"
                android:visibility="invisible"
                android:text="@string/download_txt"/>
        </RelativeLayout>
    </LinearLayout>

</RelativeLayout>
  • 主dialog代码逻辑
private Context context;
    private DisplayMetrics display;

    private TextView fileName;
    private LinearLayout linearLayout;
    private InroadBtn_Medium btn_download;
    private ViewPager viewPager;

    private List<PanelFileBean> fileBeans;

    //设置圆点View
    private View view_point;
    private LinearLayout.LayoutParams layoutParams;

    //指示器标志位置
    private int pointIndex = 0;

    //自动轮播
    private Handler mHandler = new Handler();
    private int delayMillis = 5000;

    @Override
    public void setDialogType() {
        isFullWidth = true;
        heightOffset = 200;
        widthOffset = 30;
    }

    public InroadViewpagerDialog builder() {
        return this;
    }

    public InroadViewpagerDialog setPanelFileBean(List<PanelFileBean> panelFileBeans) {
        this.fileBeans = panelFileBeans;
        return this;
    }

    @Override
    public void initDialogWidth(WindowManager.LayoutParams wl, DisplayMetrics dm) {
        wl.width = (int) (dm.widthPixels * 1.0);
        wl.height = (int) (dm.heightPixels * 0.6);
    }

    public InroadViewpagerDialog(Context context) {
        this.context = context;
        display = new DisplayMetrics();
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        windowManager.getDefaultDisplay().getMetrics(display);
    }

    @SuppressLint("MissingInflatedId")
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = LayoutInflater.from(context).inflate(R.layout.dialog_viewpager, null);
        getDialog().getWindow().setBackgroundDrawableResource(android.R.color.transparent);

        fileName = (TextView) view.findViewById(R.id.tv_filename);
        linearLayout = (LinearLayout) view.findViewById(R.id.points);
        viewPager = view.findViewById(R.id.viewpager);
        btn_download = view.findViewById(R.id.btn_download);
        RelativeLayout rl_download = view.findViewById(R.id.ll_download);

        rl_download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (View.INVISIBLE == btn_download.getVisibility()) {
                    dismiss();
                }
            }
        });

        initViewData();

        return view;
    }

    public void show() {
        super.show(((AppCompatActivity) context).getSupportFragmentManager(), context.getClass().getSimpleName());
    }

    /**
     * 初始化view,赋值
     */
    private void initViewData() {
        initBtnDownload();

        for (PanelFileBean bean : fileBeans) { //设置圆点
            view_point = new View(context);
            layoutParams = new LinearLayout.LayoutParams(30, 30);
            layoutParams.leftMargin = 20;
            view_point.setBackgroundResource(R.drawable.point_selector);
            view_point.setLayoutParams(layoutParams);
            view_point.setEnabled(false);
            view_point.setTag(bean);
            linearLayout.addView(view_point);
        }
        linearLayout.getChildAt(pointIndex).setEnabled(true);

        fileName.setText(fileBeans.get(pointIndex).datavaluetitle);

        MeetingViewPagerAdapter meetingViewPagerAdapter = new MeetingViewPagerAdapter(context, fileBeans);
        viewPager.setAdapter(meetingViewPagerAdapter);
        viewPager.setPageTransformer(false, new ScaleTransformer());
        viewPager.setPageMargin(10);
        viewPager.setOffscreenPageLimit(fileBeans.size());
        viewPager.setCurrentItem(pointIndex, true);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(final int position) {
                int newPosition = position % fileBeans.size();
                fileName.setText(fileBeans.get(newPosition).datavaluetitle);
                linearLayout.getChildAt(pointIndex).setEnabled(false);
                linearLayout.getChildAt(newPosition).setEnabled(true);
                pointIndex = newPosition;

                initBtnDownload();
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                //当页面空闲状态被改变的时候
                if (state == ViewPager.SCROLL_STATE_IDLE) {
                    mHandler.postDelayed(runnable, delayMillis);//延时,自动轮播
                } else {
                    mHandler.removeCallbacks(runnable);//触摸页面,停止自动轮播
                }
            }
        });
    }

    /**
     * 下载按钮逻辑
     */
    private void initBtnDownload() {
        btn_download.setVisibility(View.INVISIBLE);
        if (!fileBeans.get(pointIndex).datavalue.endsWith(".png")
                && !fileBeans.get(pointIndex).datavalue.endsWith(".jpg")
                && !fileBeans.get(pointIndex).datavalue.endsWith(".jpeg")) {
            btn_download.setVisibility(View.VISIBLE);
        }
        btn_download.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                downloadFile(fileBeans.get(pointIndex));
            }
        });
    }

    /**
     * 文件下载
     *
     * @param bean
     */
    private void downloadFile(PanelFileBean bean) {
        //String suffix = FileUtils.getFileSuffix(fileBeans.get(newPosition).url); //获取扩展名
        String suffix = "";
        String fileName = FileUtils.getFileName(FileUtils.PATH_FILE, FileUtils.getStandardFileName(bean.datavaluetitle), suffix); //获取名称
        DownloadUtils.DownloadFile(bean.datavalue, fileName, suffix, null);
    }

    /**
     * 自动轮播图方法,实现无限轮播
     */
    private final Runnable runnable = new Runnable() {
        @Override
        public void run() {
            //获得轮播图当前的位置
            int currentPosition = viewPager.getCurrentItem();
            currentPosition++;
            viewPager.setCurrentItem(currentPosition, true);
            mHandler.postDelayed(runnable, delayMillis);
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        mHandler.postDelayed(runnable, delayMillis);
    }

    @Override
    public void onPause() {
        super.onPause();
        mHandler.removeCallbacks(runnable);
    }
  • 指示器布局代码-drawable
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:shape="oval"
    tools:ignore="ResourceName">
    <corners android:radius="0.5dp" />
    <solid android:color="#428EFF" />
</shape>
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:shape="oval"
    tools:ignore="ResourceName">
    <corners android:radius="0.5dp" />
    <solid android:color="#AAFFFFFF" />
</shape>
  • 整合-实现效果布局代码
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" tools:ignore="ResourceName">
    <item android:drawable="@drawable/v_point_down" android:state_enabled="true" />
    <item android:drawable="@drawable/v_point_up" android:state_enabled="false" />
</selector>

三、ViewPager的适配器

public class MeetingViewPagerAdapter extends PagerAdapter {
    private List<PanelFileBean> panelFileBeans;
    private Context context;
    private LayoutInflater inflater;

    public MeetingViewPagerAdapter(Context context, List<PanelFileBean> list) {
        this.context = context;
        this.panelFileBeans = list;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        //return panelFileBeans.size();
        return Integer.MAX_VALUE; // 无限轮播
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, final int position) {
        View view = inflater.inflate(R.layout.item_viewpager, container, false);
        ImageView iv_open = (ImageView) view.findViewById(R.id.iv_open);
        iv_open.setVisibility(View.GONE);

        final int Position = position % panelFileBeans.size();

        ImageView imageView = (ImageView) view.findViewById(R.id.iv);
        imageView.setEnabled(false);
        imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                InroadPictureDialog inroadPictureDialog = new InroadPictureDialog(context).builder();
                inroadPictureDialog.setData(panelFileBeans.get(Position));
                inroadPictureDialog.show();
            }
        });

        if (!TextUtils.isEmpty(panelFileBeans.get(Position).datavalue)) {
            String fileName = panelFileBeans.get(Position).datavalue.substring(panelFileBeans.get(Position).datavalue.lastIndexOf(".") + 1);
            switch (fileName) {
                case "png":
                case "jpg":
                case "jpeg":
                    imageView.setEnabled(true);
                    iv_open.setVisibility(View.VISIBLE);
                    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                    Glide.with(context).load(panelFileBeans.get(Position).datavalue).error(R.drawable.picture).placeholder(R.drawable.picture).into(imageView);
                    break;
                case "mp4":
                case "flv":
                case "avi":
                    imageView.setImageResource(R.drawable.file_vedio);
                    break;
                case "mp3":
                    imageView.setImageResource(R.drawable.file_mp3);
                    break;
                case "doc":
                case "docx":
                    imageView.setImageResource(R.drawable.file_word);
                    break;
                case "ppt":
                case "pptx":
                    imageView.setImageResource(R.drawable.file_ppt);
                    break;
                case "xls":
                case "xlsx":
                    imageView.setImageResource(R.drawable.file_excel);
                    break;
                case "pdf":
                    imageView.setImageResource(R.drawable.file_pdf);
                    break;
                case "txt":
                    imageView.setImageResource(R.drawable.file_txt);
                    break;
                default:
                    break;
            }
        }
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:background="@color/inroad_expand_color"
    android:orientation="vertical"
    tools:ignore="ResourceName">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true" />

    <ImageView
        android:id="@+id/iv_open"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_alignParentEnd="true"
        android:scaleType="centerCrop"
        android:src="@drawable/icon_vp_open" />
</RelativeLayout>

四、PageTransformer

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

    @Override
    public void transformPage(View page, float position) {
        if (position < -1 || position > 1) {
            page.setAlpha(MIN_ALPHA);
            page.setScaleX(MIN_SCALE);
            page.setScaleY(MIN_SCALE);
        } else if (position <= 1) {
            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
            float scaleX;
            if (position < 0) {
                scaleX = 1 + 0.15f * position;
            } else {
                scaleX = 1 - 0.15f * position;
            }
            page.setScaleX(scaleX);
            page.setScaleY(scaleX);
            page.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE) / (1 - MIN_SCALE) * (1 - MIN_ALPHA));
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值