Android使用Banner组件结合Glide实现图片无限轮播

本篇文章记录一下使用Banner组件结合Glide框架实现本地图片无限轮播的广告效果,Glide是谷歌推荐图片框架,Glide的介绍可以异步到这位博主的文章:【Android】Glide架构简介_Tech Ranger的博客-优快云博客_android glide简介

首先需要引入两个框架:

 //Banner轮播图
 implementation 'com.youth.banner:banner:1.4.10'
 //Glide框架
 implementation "com.github.bumptech.glide:glide:4.6.1"

在Activity的XML文件中添加以下代码:

 <com.youth.banner.Banner
      android:id="@+id/fragment_picture_banner"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      app:image_scale_type="fit_xy"/>

其中属性:app:image_scale_type="fit_xy"代表让图片自适应控件的大小,无论需要展示的图片是什么比例,图片都会完整的显示在控件上,而且是自动铺满整个控件。接着需要将图片的绝对路径添加到一个List列表中,具体怎么获取根据项目的需求而定,下面介绍以下Android如何获取指定文件夹下指定类型的文件的文件名称,这也是使用Banner组件需要的方法,要获取指定的文件夹路径首先需要获取到Android系统SD卡的根目录:

/**
     * 获取系统根目录
     *
     * @return 文件夹路径
     */
    public String getSdCar() {
        return Environment.getExternalStorageDirectory().getAbsolutePath();
    }

文件夹之间需要斜杠隔开,也可以用File.separator,下面是获取文件夹下指定类型的所有文件名称,folderPath为文件夹的绝对路径:

/**
     * 获取指定文件夹下指定类的文件名称
     *
     * @param folderPath 文件夹
     * @return 文件名列表
     */
    public List<String> getAllFileName(String folderPath) {
        List<String> fileList = new ArrayList<>();
        File file = new File(folderPath);
        File[] files = file.listFiles();
        if (files == null)
            return null;
        for (File value : files) {
            if (value.isFile()) {
                String fileName = value.getName();
                if (fileName.endsWith(".jpg")) {
                    fileList.add(fileName);
                }
            }
        }
        return fileList;
    }

Banner的使用还需要一个图片加载器,图片加载器需要Glide加载框架:我们定义一个自定义图片加载器继承Banner的ImageLoader,可以在构造方法中添加两个属性,实现点击图片暂停自动轮播,再点击图片开启自动轮播,在加载器的重写方法displayImage()中可以监听图片的点击事件,代码如下:

/**
     * Banner图片加载器
     */
    private static class Loader extends ImageLoader {
        private final Banner banner;
        private boolean autoPlay;

        public Loader(Banner banner, boolean autoPlay) {
            this.banner = banner;
            this.autoPlay = autoPlay;
        }

        @Override
        public void displayImage(Context context, Object path, ImageView imageView) {
            imageView.setOnClickListener(view -> {
                if (autoPlay) {
                    autoPlay = false;
                    banner.stopAutoPlay();
                } else {
                    autoPlay = true;
                    banner.startAutoPlay();
                }
            });
            RequestOptions options = new RequestOptions()
                    .skipMemoryCache(true)
                    .diskCacheStrategy(DiskCacheStrategy.NONE);
            Glide.with(context)
                    .asDrawable()
                    .load((String) path)
                    .apply(options)
                    .into(imageView);
        }
    }

最后采用链式编程设置Banner组件的属性:

/**
     * 开始轮播播图片
     */
    private void startPlay() {
        if (resourceList.isEmpty())
            return;
        boolean autoPlay = true;
        banner.setImages(resourceList)
                .setBannerStyle(BannerConfig.NOT_INDICATOR)
                .setImageLoader(new Loader(banner, autoPlay))//设置图片加载器
                .setBannerAnimation(Transformer.RotateDown)//图片的幻灯片样式
                .setDelayTime(5000)//单张的展示时间(毫秒)
                .isAutoPlay(true)//是否是否自动开始轮播
                .start()
                .setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
                    @Override
                    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                        Log.i(TAG, "onPageScrolled===" + position);
                    }

                    @Override
                    public void onPageSelected(int position) {
                        Log.i(TAG, "onPageSelected===" + position);
                    }

                    @Override
                    public void onPageScrollStateChanged(int state) {
                        Log.i(TAG, "onPageScrollStateChanged===" + state);
                    }
                });
    }

完事、~,轮播效果:

轮播

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值