注意:
①:Glide支持远程图片,本地图片文件,图片资源,多媒体数据库的uri
②:Glide本身就是单例,不需要再做单例的封装,不过可以封装Utils,将其链式编程封装起来,简化代码。
③:Glide支持三级缓存:网络缓存,本地缓存和内存缓存
1:在Module的build.gradle中添加依赖
allprojects {
repositories {
mavenCentral() // jcenter() works as well because it pulls from Maven Central
}
}
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'(注意有V4的就不用添加了)
}
2:混淆
第一步是要讲build.Gradle中的 minifyEnabled 设置为true
然后在 当前module\proguard-rules.pro中添加
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
-keepresourcexmlelements manifest/application/meta-data@value=GlideModule
3:Method
初始化Glide:然后通过链式编程调用其方法
with(Context context)//初始化Glide,参数可以是Context,Activity,FragmentActivity,Fragment
请求获取图片(通过源码其实就是 fromString().load(string),fromString返回一个String类型的构建器)
load(String string)//请求 文件路径/URL来获取图片
load(Uri uri)//请求URL来获取图片
load(byte[] model)//解析字节数组来获取图片
load(File file)//请求图片文件来获取图片(data/data/files/a.jpg)
load(Integer resourceId)//请求资源ID来获取图片(R.drawable.a)
作用于图片方法
thumbnail(float sizeMultiplier)//缩略图:让用户先看到一个低解析度的图,点开后,再加载一个高解析度的图。
priority(Priority priority)//图片加载的优先级Priority.IMMEDIATE,HIGH,NORMAL,LOW(对应 即时,高,正常,低)
transform(BitmapTransformation... transformations)//给加载的图片设计边框(下面有具体的实现)
centerCrop()//如果图片无法填充ImageView,那么就从中间向四周裁剪,图片将imageView填满
fitCenter()//完全显示图片(相当于居中)
crossFade()//淡入淡出的效果
crossFade(int duration)//淡入淡出效果的持续时长
crossFade(Animation animation, int duration)//可以传入一个自定义的补间动画
crossFade(int animationId, int duration)//同上(如果同时在xml中定义了duration,那么xml的优先级高)
dontAnimate()//取消动画
animate(ViewPropertyAnimation.Animator animator)//给图片使用属性动画
animate(int animationId)||(Animation animation)//给图片使用补间动画
加载状态显示的图片
placeholder(int resourceId)//正在加载显示的图片
fallback(Drawable drawable)//加载失败 返回null(如:load( null)加载空指针的时候)显示的图片
error(int resourceId)//加载失败(例如url地址不对)
listener(RequestListener requestListener)//添加监听器,监听图片加载成功或失败,并且可以拿到isFromMemoryCache和isFirstResource状态
缓存处理(Glide用了 内存缓存 和 外存缓存机制,所谓的三级缓存只不过是进行了三次判断,网络缓存其实就是请求,而请求不一定拿的到)
diskCacheStrategy(DiskCacheStrategy strategy)//设置是否使用外部缓存:对应值
DiskCacheStrategy.NONE什么都不缓存
DiskCacheStrategy.SOURCE只缓存最高解析图的image
DiskCacheStrategy.RESULT缓存最后一次那个image,比如有可能你对image做了转化
DiskCacheStrategy.ALLimage的所有版本都会缓存
skipMemoryCache(boolean skip)//设置是否使用内存缓存:对应值 true false
override(int width, int height)//根据宽高(单位:像素)裁剪图片,如果裁剪后发现图片大小没变或者很模糊,是因为ImageViwe中设置了固定宽高
clone()//克隆复制
into(ImageView view)//直接将图片设置给ImageView
//强转 和 释放缓存
asGif()//强转为gif(需要在load()之后调用,因为属于DrawableTypeRequest)
asBitmap()//强转为bitmap
pauseRequests()//取消加载 调用方式:Glide.with(context).pauseRequests();
resumeRequests()//恢复加载 调用方式:Glide.with(context).resumeRequests();
clearDiskCache()//清除磁盘缓存:必须开子线程 Glide.get(context).clearDiskCache();
clearMemory()//释放内存缓存:Glide.get(context).clearMemory();
4:工具类封装:
上面提供的方法基本上大家可以自己进行封装了,本省Glide的调用就比较简单,也可以对以下进行参考:
①:https://github.com/RangerAnan/GlideUtil/blob/master/app/src/main/java/com/ananfcl/glideutil/glide/GlideUtils.java
②:https://github.com/tpnet/GlideUtils/blob/master/GlideUtils.java
5:自定义的遮罩(给加载的图片设置边框,其实就是在图上绘制一层遮罩)
transform(new GlideRoundTransform(context,30))//设置圆角的边框 第二个参数是圆角的角度
transform(new GlideCircleTransform(context))//圆形的边框
//圆形遮罩
class GlideCircleTransform extends BitmapTransformation {
public GlideCircleTransform(Context context) {
super(context);
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return circleCrop(pool, toTransform);
}
private Bitmap circleCrop(BitmapPool pool, Bitmap toTransform) {
if (toTransform == null) return null;
//以最短的边为基准,找到正方形的坐标
int size = Math.min(toTransform.getWidth(), toTransform.getHeight());
int x = (toTransform.getWidth() - size) / 2;
int y = (toTransform.getHeight() - size) / 2;
// TODO 这也可以从池中获得
//根据参数创建新位图
Bitmap squared = Bitmap.createBitmap(toTransform, x, y, size, size);
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
/** 在圆形遮罩上绘制一个 红色的圆环(也可以是任意形状比如心形)
RectF f = new RectF(x,y,size,size);
Paint p = new Paint();
p.setColor(Color.RED);
p.setAntiAlias(true);
p.setStrokeWidth(4);
p.setStyle(Paint.Style.STROKE);
canvas.drawArc(f,0f,360f,false,p);
*/
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
//圆角
static class GlideRoundTransform extends BitmapTransformation {
private static float radius = 0f;
public GlideRoundTransform(Context context) {
this(context, 4);
}
public GlideRoundTransform(Context context, int dp) {
super(context);
this.radius = Resources.getSystem().getDisplayMetrics().density * dp;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
return roundCrop(pool, toTransform);
}
private static Bitmap roundCrop(BitmapPool pool, Bitmap source) {
if (source == null)
return null;
Bitmap result = pool.get(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
if (result == null) {
result = Bitmap.createBitmap(source.getWidth(), source.getHeight(), Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setShader(new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
paint.setAntiAlias(true);
RectF rectF = new RectF(0f, 0f, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rectF, radius, radius, paint);
return result;
}
@Override
public String getId() {
return getClass().getName() + Math.round(radius);
}
}