您的位置:首页 > 其它

浅谈Glide加载图片的框架和封装

2016-08-27 23:45 381 查看
最近打算想把图片的加载框架Glide运用到自己的项目中,于是上网查了一下资料,学习了它的一些基本用法,并对其进行了简单的封装。

先上图看看效果:





当然,要想使用Glide来加载图片,当然少不了这个
compile 'com.github.bumptech.glide:glide:3.7.0'


Glide加载网络图片默认使用的协议是HttpUrlConnection,而现在比较流行的协议是OkHttp,所以,要想使用OkHttp,需要以下步骤:

1.添加依赖:

compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
compile 'com.squareup.okhttp3:okhttp:3.4.1'


2.在AndroidManifest.xml文件中加入:

<meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
android:value="GlideModule" />

OK,经过以上步骤,就可以使用Glide了;但还想最缓存啊等做更多的控制,可以自定义一个GlideModule,它可以继承OkHttpGlideModule。我自己定义的如下,你也可以根据自己项目实际的情况做调整。代码如下:

public class GlideModelConfig extends OkHttpGlideModule {
int diskSize = 1024 * 1024 * 250;//磁盘缓存空间,如果不设置,默认是:250 * 1024 * 1024 即250MB
int memorySize = (int) (Runtime.getRuntime().maxMemory()) / 4;  // 取1/4最大内存作为最大缓存

@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 定义缓存大小和位置
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskSize));  //手机磁盘
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "cache", diskSize)); //sd卡磁盘

// 默认内存和图片池大小
/*MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize(); // 默认内存大小
int defaultBitmapPoolSize = calculator.getBitmapPoolSize(); // 默认图片池大小
builder.setMemoryCache(new LruResourceCache(defaultMemoryCacheSize)); // 该两句无需设置,是默认的
builder.setBitmapPool(new LruBitmapPool(defaultBitmapPoolSize));*/

// 自定义内存和图片池大小
builder.setMemoryCache(new LruResourceCache(memorySize));
builder.setBitmapPool(new LruBitmapPool(memorySize));

// 定义图片格式
builder.setDecodeFormat(DecodeFormat.PREFER_RGB_565);
}

@Override
public void registerComponents(Context context, Glide glide) {

}
}

里面每个设置的意思在代码中有注释,就不做解释了。当然,自定义完之后还需要替换之前在AndroidManifest.xml文件中设置的内容。

好了,经过上面的步骤,现在就可以愉快的玩耍Glide了。这里我写了一个工具类,是对Glide简单的封装,如有不妥之处或者建议,希望指出,互相学习啊。

/**
* @Author: wangyb on 2016/8/27 14:38.
* @描述 : Glide加载图片的封装,圆形、圆角,模糊等处理操作用到了jp.wasabeef:glide-transformations:2.0.1
*         Glide默认使用httpurlconnection协议,可以配置为OkHttp
*/
public class GlideUtil {

private static GlideUtil mInstance;
private GlideUtil(){}
public static GlideUtil getInstance() {
if (mInstance == null) {
synchronized (GlideUtil.class) {
if (mInstance == null) {
mInstance = new GlideUtil();
}
}
}
return mInstance;
}

/**
* 常量
*/
static class Contants {
public static final int BLUR_VALUE = 20; //模糊
public static final int CORNER_RADIUS = 20; //圆角
public static final float THUMB_SIZE = 0.5f; //0-1之间  10%原图的大小
}

/**
* 常规加载图片
* @param context
* @param imageView  图片容器
* @param imgUrl  图片地址
* @param isFade  是否需要动画
*/
public void loadImage(Context context, ImageView imageView,
String imgUrl, boolean isFade) {
if (isFade) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
//all:缓存源资源和转换后的资源 none:不作任何磁盘缓存
//source:缓存源资源   result:缓存转换后的资源
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.into(imageView);
} else {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.into(imageView);
}
}

/**
* 加载缩略图
* @param context
* @param imageView  图片容器
* @param imgUrl  图片地址
*/
public void loadThumbnailImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.thumbnail(Contants.THUMB_SIZE)
.into(imageView);
}

/**
* 加载图片并设置为指定大小
* @param context
* @param imageView
* @param imgUrl
* @param withSize
* @param heightSize
*/
public void loadOverrideImage(Context context, ImageView imageView,
String imgUrl, int withSize, int heightSize) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.override(withSize, heightSize)
.into(imageView);
}

/**
* 加载图片并对其进行模糊处理
* @param context
* @param imageView
* @param imgUrl
*/
public void loadBlurImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(new BlurTransformation(context, Contants.BLUR_VALUE))
.into(imageView);
}

/**
* 加载圆图
* @param context
* @param imageView
* @param imgUrl
*/
public void loadCircleImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(new CropCircleTransformation(context))
.into(imageView);
}

/**
* 加载模糊的圆角的图片
* @param context
* @param imageView
* @param imgUrl
*/
public void loadBlurCircleImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(
new BlurTransformation(context, Contants.BLUR_VALUE),
new CropCircleTransformation(context))
.into(imageView);
}

/**
* 加载圆角图片
* @param context
* @param imageView
* @param imgUrl
*/
public void loadCornerImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(
new RoundedCornersTransformation(
context, Contants.CORNER_RADIUS, Contants.CORNER_RADIUS))
.into(imageView);
}

/**
* 加载模糊的圆角图片
* @param context
* @param imageView
* @param imgUrl
*/
public void loadBlurCornerImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.error(R.mipmap.error)
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.bitmapTransform(
new BlurTransformation(context, Contants.BLUR_VALUE),
new RoundedCornersTransformation(
context, Contants.CORNER_RADIUS, Contants.CORNER_RADIUS))
.into(imageView);
}

/**
* 同步加载图片
* @param context
* @param imgUrl
* @param target
*/
public void loadBitmapSync(Context context, String imgUrl, SimpleTarget<Bitmap> target) {
Glide.with(context)
.load(imgUrl)
.asBitmap()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.into(target);
}

/**
* 加载gif
* @param context
* @param imageView
* @param imgUrl
*/
public void loadGifImage(Context context, ImageView imageView, String imgUrl) {
Glide.with(context)
.load(imgUrl)
.asGif()
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.error(R.mipmap.error)
.into(imageView);
}

/**
* 加载gif的缩略图
* @param context
* @param imageView
* @param imgUrl
*/
public void loadGifThumbnailImage(Context context, ImageView imageView,String imgUrl) {
Glide.with(context)
.load(imgUrl)
.asGif()
.crossFade()
.priority(Priority.NORMAL) //下载的优先级
.diskCacheStrategy(DiskCacheStrategy.ALL) //缓存策略
.error(R.mipmap.error)
.thumbnail(Contants.THUMB_SIZE)
.into(imageView);
}

/**
* 恢复请求,一般在停止滚动的时候
* @param context
*/
public void resumeRequests(Context context) {
Glide.with(context).resumeRequests();
}

/**
* 暂停请求 正在滚动的时候
* @param context
*/
public void pauseRequests(Context context) {
Glide.with(context).pauseRequests();
}

/**
* 清除磁盘缓存
* @param context
*/
public void clearDiskCache(final Context context) {
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();//清理磁盘缓存 需要在子线程中执行
}
}).start();
}

/**
* 清除内存缓存
* @param context
*/
public void clearMemory(Context context) {
Glide.get(context).clearMemory();//清理内存缓存  可以在UI主线程中进行
}

}


在这里简单说一下图片下载的优先级和图片磁盘缓存的策略。

下载优先级:

public enum Priority {
IMMEDIATE, //中等
HIGH,//最高
NORMAL,//默认
LOW, priority, //最低
}
对一些优先级比较高的,希望先加载出来的图片,可以调高它的下载优先级

磁盘缓存的策略:

all:缓存源资源和转换后的资源

none:不作任何磁盘缓存

source:缓存源资源

result:缓存转换后的资源

以上是一些基本的简单的用法,当然还有很多其他的一些高级用法,这里就不展开了,欢迎多多指正哈。

参考资料:http://www.cnblogs.com/whoislcj/p/5558168.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Glide 图片 框架