之前有一个类似轮播banner小需求,今天抽时间记录一下 ~
一听到轮播图的效果,很多人下意识的会想到Viewpager,因为这款控件挺成熟,而且内部包含手势的滑动、点击都有很成熟的方案;
但是此篇的效果就是动态展示图片,只不过每张图片的展示时长不同,目前内部不支持手势滑动,如果需要点击那么自己分分钟实现一下吧~
对了,为了方便体验, 此demo已经上传,只需更改内部的图片路径地址即可 ~
实现效果 ~
主要需求
- 动态切换图片
- 每张图片停留时长不同
- 图片缓存
- 无手势功能,如滑动、点击功能
常规实现采用ViewPager或三方banner框架,从优化的角度看待这俩种方式将产生无用资源~ 故最终采用了简单的ImageView+递归实现需求 ~
BannerInfo
必要参数:展示图、展示时长
package nk.com.newglidetool;
/**
* @author MrLiu
* @date 2020/4/10
* desc
*/
public class BannerInfo {
public int time;
public String banner;
public BannerInfo() {
super();
}
public BannerInfo(String banner, int time) {
this.banner = banner;
this.time = time;
}
public int getTime() {
return time;
}
public void setTime(int time) {
this.time = time;
}
public String getBanner() {
return banner;
}
public void setBanner(String banner) {
this.banner = banner;
}
}
MainActivity
实现关键,在于递归这个小知识点 ~
package nk.com.newglidetool;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private CountDownTimer countDownTimer;
private TextView time;
private ImageView img;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img = findViewById(R.id.iv_img);
time = findViewById(R.id.iv_time);
List<BannerInfo> bannerList = new ArrayList<>();
bannerList.add(new BannerInfo("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1600336490015&di=dfc02c761130ed9bf51ab74a11410f9d&imgtype=0&src=http%3A%2F%2Fcdn.duitang.com%2Fuploads%2Fitem%2F201402%2F20%2F20140220220726_YvyRR.thumb.700_0.jpeg", 5));
bannerList.add(new BannerInfo("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1600336490017&di=788d40031beaaaca18f9d8bb7fbd41ca&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fsoftbbs%2F1003%2F07%2Fc0%2F3134443_1267900790753_1024x1024soft.jpg", 7));
bannerList.add(new BannerInfo("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1600336496883&di=0fec2c50be8443e19caaff067b9b6904&imgtype=0&src=http%3A%2F%2Fimg2.imgtn.bdimg.com%2Fit%2Fu%3D1032090787%2C3027113824%26fm%3D214%26gp%3D0.jpg", 10));
startBanner(bannerList, bannerList.get(bannerSize).getTime());
}
/**
* Banner切换
**/
private int bannerSize = 0;
void startBanner(final List<BannerInfo> bannerList, int interval) {
countDownTimer = new CountDownTimer(interval * 1000 + 80, 1000) {
@Override
public void onTick(long millisUntilFinished) {
if (bannerList.size() > 0) {
if (bannerSize == 0) {
GlideUtils.initImageWithFileCache(MainActivity.this, bannerList.get(bannerSize).getBanner(), img);
}
}
time.setText(millisUntilFinished / 1000 + " s");
}
@Override
public void onFinish() {
bannerSize++;
if (bannerSize >= bannerList.size()) {
bannerSize = 0;
}
if (bannerList.size() > 0) {
GlideUtils.initImageWithFileCache(MainActivity.this, bannerList.get(bannerSize).getBanner(), img);
countDownTimer.cancel();
startBanner(bannerList, bannerList.get(bannerSize).getTime());
}
}
};
countDownTimer.start();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (countDownTimer != null) {
countDownTimer.cancel();
}
GlideUtils.clearFileCache(this);
GlideUtils.clearMemoryCache(this);
}
}
权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET" />
清单
扫描二维码关注公众号,回复:
12913615 查看本文章

//这里用的是Android Studio3.0
implementation 'com.github.bumptech.glide:glide:4.3.1'
annotationProcessor('com.github.bumptech.glide:compiler:4.3.1')
implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.1'
CustomGlideModule
package nk.com.newglidetool;
import android.content.Context;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.load.engine.cache.ExternalPreferredCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;
/**
* @author MrLiu
* @date 2020/8/26
* desc
*/
@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 设置缓存大小为20mb
int memoryCacheSizeBytes = 1024 * 1024 * 30; // 30mb
// 设置内存缓存大小
builder.setMemoryCache(new LruResourceCache(memoryCacheSizeBytes));
// 根据SD卡是否可用选择是在内部缓存还是SD卡缓存
if (isSDCardEnable()) {
builder.setDiskCache(new ExternalPreferredCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
} else {
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "HYManagerImages", memoryCacheSizeBytes));
}
}
// 针对V4用户可以提升速度
@Override
public boolean isManifestParsingEnabled() {
return false;
}
/**
* 查看是否存在SD卡
*/
private boolean isSDCardEnable() {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
return true;
} else
return false;
}
}
GlideUtils
package nk.com.newglidetool;
import android.content.Context;
import android.widget.ImageView;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions;
/**
* @author MrLiu
* @date 2020/8/26
* desc
*/
public class GlideUtils {
/**
* 磁盘缓存
*/
public static void initImageWithFileCache(Context context, String url, ImageView imageView) {
GlideApp.with(context)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.transition(DrawableTransitionOptions.withCrossFade(100))//淡入淡出100m
.diskCacheStrategy(DiskCacheStrategy.ALL)
.dontAnimate()
.centerCrop()
.into(imageView);
}
/**
* Glide跳过内存缓存
*/
public static void initImageNoCache(Context context, String url, ImageView imageView) {
GlideApp.with(context)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.skipMemoryCache(true)
.dontAnimate()
.centerCrop()
.into(imageView);
}
/**
* 内存缓存清理(主线程)
*/
public static void clearMemoryCache(Context context) {
GlideApp.get(context).clearMemory();
}
/**
* 磁盘缓存清理(子线程)
*/
public static void clearFileCache(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
GlideApp.get(context).clearDiskCache();
}
}).start();
}
}