返回

VP2原理及实践(下):实践篇,基于ViewPager2的Banner轮播库实现

Android

VP2原理及实践(下):实践篇——基于ViewPager2的Banner轮播库实现
上一篇里我们讨论了VP2的使用,以及一些疑难解答。本篇作为下篇,将带大家一起动手实践,基于VP2实现一个Banner轮播库。我们先看下效果图:

效果图

功能

库功能清单如下

  • 默认支持无限轮播、自动轮播、指示器、默认首次展示第几张图片
  • 提供API设置是否开启无限轮播、是否开启自动轮播、指示器正常态/选中态图片、自动轮播间隔时间、滚动速度
  • 提供API获取当前选中项

示例

基本使用

    //获取需要展示图片集合
    List<String> list = new ArrayList<>();
    list.add(String.valueOf(R.drawable.banner_1));
    list.add(String.valueOf(R.drawable.banner_2));
    list.add(String.valueOf(R.drawable.banner_3));
    list.add(String.valueOf(R.drawable.banner_4));
    list.add(String.valueOf(R.drawable.banner_5));
    list.add(String.valueOf(R.drawable.banner_6));
    //实例化自定义的轮播图
    ViewPager2Banner banner = new ViewPager2Banner(this);
    //添加要展示的图片
    banner.setImageList(list);
    //banner库默认会自动轮播,设置 setAutoPlay(boolean autoPlay)来决定是否自动轮播
    banner.setAutoPlay(true);
    //设置切换页面时长 setDuration(long duration)
    banner.setDuration(1000);
    //banner库默认支持无限轮播,设置 setInfiniteLoop(boolean infiniteLoop)来决定是否开启无限轮播
    banner.setInfiniteLoop(true);
    //设置页面指示器指示器选中态和普通态图片,banner库默认使用ImageView来展示指示器
    banner.setIndicatorSelectorRes(R.drawable.banner_dot_select, R.drawable.banner_dot_unselect);
    //添加广告位点击事件
    banner.setOnBannerItemClickListener(new OnBannerItemClickListener() {
        @Override
        public void onItemClick(int position) {
            Toast.makeText(BannerActivity.this, "点击了第"+position+"张图片", Toast.LENGTH_SHORT).show();
        }
    });
    //banner库提供一些设置图片的API,如 setImageList(List<String> imageList)、setImageLoader(ImageLoader imageLoader)、setBannerPageTransformer(ViewPager2.PageTransformer transformer)
    //轮播库默认提供样式,使用者也可以自定义样式
    setContentView(banner);

仿淘宝搜索栏上下轮播

    //获取需要展示图片集合
    List<String> list = new ArrayList<>();
    list.add(String.valueOf(R.drawable.banner_1));
    list.add(String.valueOf(R.drawable.banner_2));
    list.add(String.valueOf(R.drawable.banner_3));
    list.add(String.valueOf(R.drawable.banner_4));
    list.add(String.valueOf(R.drawable.banner_5));
    list.add(String.valueOf(R.drawable.banner_6));
    //实例化自定义的轮播图
    ViewPager2Banner banner = new ViewPager2Banner(this);
    //添加要展示的图片
    banner.setImageList(list);
    //banner库默认会自动轮播,设置 setAutoPlay(boolean autoPlay)来决定是否自动轮播
    banner.setAutoPlay(true);
    //设置切换页面时长 setDuration(long duration)
    banner.setDuration(1000);
    //banner库默认支持无限轮播,设置 setInfiniteLoop(boolean infiniteLoop)来决定是否开启无限轮播
    banner.setInfiniteLoop(true);
    //设置页面指示器指示器选中态和普通态图片,banner库默认使用ImageView来展示指示器
    banner.setIndicatorSelectorRes(R.drawable.banner_dot_select, R.drawable.banner_dot_unselect);
    //设置自定义指示器及指示器的父布局,自定义指示器需要实现 IBannerIndicator接口,banner库会自动处理指示器的选中切换
    banner.setIndicator(new MyIndicator(this), (ViewGroup) findViewById(R.id.indicator_view));
    //设置banner库的页面切换动画
    banner.setBannerPageTransformer(new ViewPager2.PageTransformer() {
        @Override
        public void transformPage(@NonNull View page, float position) {
            if (position < -1) {
                page.setAlpha(0);
            } else if (position <= 1) {
                float scaleFactor = Math.max(0.8f, 1 - Math.abs(position));
                page.setScaleX(scaleFactor);
                page.setScaleY(scaleFactor);
                page.setAlpha(scaleFactor);
            } else {
                page.setAlpha(0);
            }
        }
    });
    //添加广告位点击事件
    banner.setOnBannerItemClickListener(new OnBannerItemClickListener() {
        @Override
        public void onItemClick(int position) {
            Toast.makeText(BannerActivity.this, "点击了第"+position+"张图片", Toast.LENGTH_SHORT).show();
        }
    });
    //banner库提供一些设置图片的API,如 setImageList(List<String> imageList)、setImageLoader(ImageLoader imageLoader)、setBannerPageTransformer(ViewPager2.PageTransformer transformer)
    //轮播库默认提供样式,使用者也可以自定义样式
    setContentView(banner);

1.1 源码地址

上述示例效果及更多功能源码参见:https://github.com/lzp579272809/ViewPager2Banner

总结

以上就是使用ViewPager2实现Banner轮播库的思路与实践,欢迎大家试用。大家在使用过程中如果遇到问题或有好的建议,欢迎在GitHub上提Issue与我交流。