Android 图片加载库
一、基础
0.添加依赖
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-v4:19.1.0'
1.使用
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ivImg);
with():内类型 Context、Activity、Fragment。
Activity/Fragment作为参数时图片加载会和Activity/Fragment的生命周期保持一致。
二、详细
1.缓存策略
Glide缓存的是跟ImageView尺寸相同的。
ImageView尺寸改变Glide会重新缓存。
2.改变缓存策略
让Glide既缓存全尺寸又缓存其他尺寸。
这样ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。
Glide.with(this)
.load("http://223.100.159.225:8081/image/c_mall_banner_002.png")
// 既缓存全尺寸又缓存其他尺寸
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivP2);
3.图像缩放(Image Resizing)
.override(300, 200);
4.中心裁剪(Center Cropping)
.centerCrop();
5.占位图与加载错误图
// 占位图
.placeholder(R.drawable.placeholder)
// 加载错误图
.error(R.drawable.imagenotfound)
6.默认Bitmap格式
Glide默认格式为 RGB_565。内存开销少,但图片质量要差一些。
如果想质量更高些则可以将 Bitmap格式转换到ARGB_8888。
7.清理缓存
Glide.get(this).clearDiskCache();
三、自定义GlideModule 详细
1.创建GlideModule改变图片质量
public class GlideConfiguration implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
同时在
AndroidManifest.xml
中将GlideConfiguration
定义为meta-data
2.设置磁盘高速缓存的大小
// 设置磁盘高速缓存的大小 100MB
builder.setDiskCache( new InternalCacheDiskCacheFactory(context, 104857600));
3.设置磁盘高速缓存的位置
// 设置磁盘高速缓存的位置、大小
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));
4.把缓存位置设置到sd卡上的公共缓存目录
// 把缓存位置设置到sd卡上的公共缓存目录
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, cacheDirectoryName, yourSizeInBytes));
5.设置 Glide的 RAM缓存
// Glide 内部使用了 MemorySizeCalculator 类去决定内存缓存大小以及 bitmap 的缓存池。
// MemorySizeCalculator默认计算。
MemorySizeCalculator calculator = new MemorySizeCalculator(context);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
// 设置 Glide的 RAM缓存大小为 APP的20%。
int customMemoryCacheSize = (int) (1.2 * defaultMemoryCacheSize);
int customBitmapPoolSize = (int) (1.2 * defaultBitmapPoolSize);
builder.setMemoryCache(new LruResourceCache(customMemoryCacheSize));
builder.setBitmapPool(new LruBitmapPool(customBitmapPoolSize));
四、加载圆形/圆角图片
Glide可以通过设置transform或者设置bitmapTransform来实现各种现实效果。
1.圆形Transform
package com.demon.glide3_7.glide;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
/**
* @author Demon
* @version V1.0
* @Description: 圆形Transform
* @date 2016年10月19日17:25:25
*/
public class CircleTransform extends BitmapTransformation {
public CircleTransform(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 source) {
int size = Math.min(source.getWidth(), source.getHeight());
int width = (source.getWidth() - size) / 2;
int height = (source.getHeight() - size) / 2;
Bitmap bitmap = pool.get(size, size, Bitmap.Config.ARGB_8888);
if (bitmap == null) {
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader =
new BitmapShader(source, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
if (width != 0 || height != 0) {
// source isn't square, move viewport to center
Matrix matrix = new Matrix();
matrix.setTranslate(-width, -height);
shader.setLocalMatrix(matrix);
}
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return bitmap;
}
@Override
public String getId() {
return getClass().getName();
}
}
实现
Glide.with(this)
.load("http://223.100.159.225:8081/image/c_mall_banner_002.png")
.transform(new CircleTransform(this))
.into(ivP7);
2.圆角Transform
package com.demon.glide3_7.glide;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation;
/**
* @author Demon
* @version V1.0
* @Description: 圆角Transform
* @date 2016年10月19日17:23:58
*/
public class CornersTransform extends BitmapTransformation {
private static float radius = 0f;
/**
* 构造函数 默认圆角半径 4dp
*
* @param context Context
*/
public CornersTransform(Context context) {
this(context, 4);
}
/**
* 构造函数
*
* @param context Context
* @param dp 圆角半径
*/
public CornersTransform(Context context, int dp) {
super(context);
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);
}
}
实现
Glide.with(this)
.load("http://223.100.159.225:8081/image/c_mall_banner_002.png")
.transform(new CornersTransform(this))
.into(ivP8);
2016/10/19 17:40:14
代码地址