配置
混淆
-keep public class * implements com.bumptech.glide.module.GlideModule
okhttp
官方链接。
要注意:一定要忽略OkHttpGlideModule的混淆。
自定义配置与GlideBuilder
实现GlideModule接口,并在清单文件中如同okhttp配置一般进行配置。如:
<meta-data android:name="com.xxx.code.GlideModuleConfig"
android:value="GlideModule" />
其中name指向的就是自己定义的GlideModule。自定义配置示例如下:
public class GlideModuleConfig implements GlideModule {
//创建Glide实例前,对Glide实例进行设置。仅会被调用一次
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDecodeFormat(DecodeFormat.DEFAULT);//定义图片格式
//设置sd卡缓存位置——External默认存储在context.getExternalCacheDir()目录中
//也可以在ExternalCacheDiskCacheFactory中指定存储路径——放在context.getExternalCacheDir()哪个目录下,
//同时也可指定sd卡缓存大小。或者直接继承实现DiskLruCacheFactory,定义自己的glide缓存目录路径。
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context));
int size = (int) (Runtime.getRuntime().maxMemory() / 8);
//设置图片池大小——用于bitmap的重复使用
builder.setBitmapPool(new LruBitmapPool(size));
//设置缓存内存
builder.setMemoryCache(new LruResourceCache(size));
}
//向Glide实例中注册组件。在Glide实例创建完成,但没有发起任何请求之前调用
@Override
public void registerComponents(Context context, Glide glide) {
// glide.register(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory()); 此为Okhttp进行的操作
}
}
常用方法
get():Glide的静态方法,用于获取Glide的单例。
getBitmapPool():获取bitmapPool实例。
clearXXXX():清除内存/硬盘缓存。
with():将Glide实例绑定到某一个Activity/Context/Fragment/FragmentActivity的生命周期中。获取Glide的实例的静态方法。
load():加载路径指定的图片。可以加载的格式有;url、文件、本地资源图片(R.mipmap.xxxx)、Uri等。
animate():设置图片显示时的动画。可以是补间动画——Animation对象或R.anim.xxxx都可,也可以是ViewPropertyAnimation.Animator。如下:
Animation anim = new AlphaAnimation(0,1);
ScaleAnimation a2 = new ScaleAnimation(0.1f,1,0.1f,1f);
AnimationSet set = new AnimationSet(true);
set.addAnimation(anim);
set.addAnimation(a2);
set.setDuration(5000);
set.setFillAfter(true);
File file = new File(Environment.getExternalStorageDirectory(), "xxx.jpg");
// Glide.with(this).load(R.mipmap.draw).asBitmap().into(iv); //加载资源文件
// Glide.with(this).load(Uri.fromFile(file)).animate(R.anim.test).into(iv); //加载Uri
// Glide.with(this).load(url).animate(anim).into(iv); // 加载String类型的Url
ViewPropertyAnimation.Animator alpha = new ViewPropertyAnimation.Animator() {
@Override
public void animate(View view) { // 在该方法中为view执行相应的动画
ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 0, 1);
scaleX.setDuration(5000);
scaleX.start();
}
};
Glide.with(getApplicationContext()).load(Uri.fromFile(file)).animate(alpha).into(iv);
asBitmap(),asGif():将资源加载成bitmap或者gif。
skipMemoryCache():跳过内存缓存。
diskCacheStrategy():硬盘缓存策略。NONE——不进行缓存;ALL——都进行缓存;SOURCE——缓存源资源;RESULT——缓存对源资源进行转换后的资源(bitmapTransform()之后的资源),但不缓存源资源。
placeholder(),error():占位图。
into():加载资源后的处理方式。传入ImageView会将加载的图片显示在ImageView上;传入两int会将加载的图片成指定的大小,再通过get()方法可以获取一个Bitmap对象,因为get方法是阻塞式的,所以必须在子线程中操作。传入Target对象时,可以监听图片加载过程中的各个状态:开始加载、加载失败、加载成功等。如:
Glide.with(this).load(url).asBitmap().placeholder(R.mipmap.draw).error(R.mipmap.error).into(new SimpleTarget<Bitmap>() {
@Override
public void onLoadStarted(Drawable placeholder) {
Log.e(TAG,"onLoadStarted");
iv.setImageDrawable(placeholder); //开始加载时设置成占位符,对应的是placeholder
}
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
Log.e(TAG,"onLoadFailed");
iv.setImageDrawable(errorDrawable); // 加载失败时,对应的是error()
}
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
Log.e(TAG,"onResourceReady");
iv.setImageBitmap(resource); // 图片加载成功
}
});
bitmapTransform():将Glide得到的Bitmap进行转换操作,比如转换成圆角的、进行模糊等。多种效果可参考开源转换项目。注意:占位图和错误图是不会通过该方法进行转换的。如:
Glide.with(this).load(url).bitmapTransform(new Transformation<Bitmap>() {
@Override
public Resource<Bitmap> transform(Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap src = resource.get(); // 加载的原图片,一般来说是对该bitmap对象进行操作
int width = src.getWidth();
int height = src.getHeight();
// 可以看出bitmapPool的作用——对转换src时需要用到的bitmap进行缓存,防止重复创建导致OOM.
// 比如常用的LruBitmapPool就是按Lru策略对Bitmap进行缓存
BitmapPool pool = Glide.get(MainActivity.this).getBitmapPool();
Bitmap b = pool.get(width, height, Bitmap.Config.ARGB_8888);
if (b == null) {
b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
pool.put(b);
}
Canvas canvas = new Canvas(b);
Path path = new Path();
path.addCircle(b.getWidth() / 2, b.getHeight() / 2, 100, Path.Direction.CW);
canvas.clipPath(path);
canvas.drawBitmap(src, 0, 0, null);
return BitmapResource.obtain(b, pool);
}
@Override
public String getId() { // 这个方法不能返回null
return url;
}
}).into(iv);
BitmapPool与MemoryCache
Glide加载完毕指定的资源图片src后,可以通过bitmapTransform()对图片进行转换——如圆角模糊等。在转换的过程中,可能需要别的Bitmap对象进行辅助,而BitmapPool就是对这些辅助的Bitmap进行缓存管理。MemoryCache是对src进行内存缓存管理的。