本篇文章记录一下使用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);
}
});
}
完事、~,轮播效果:
轮播