简介
- 2013年,由bumptch团队开发;
- 2014年,Google正式推出,被广泛的运用在google的开源项目中;
- Glide和Picasso有90%的相似度,准确的说,就是Picasso的克隆版本,但细节上有不少区别;
- Picasso和Glide各有所长。Glide比Picasso加载速度更快;Glide比Picasso需要更大的空间来缓存。
基本用法
- 加载本地资源、资产目录、SD卡中的图像
- 基本语法
Glide.with(context).load(url).into(imageview控件);
- 加载资源图片
Glide.with(context).load(R.mipmap.id).into(imageview控件);
- 加载资产目录图片
Glide.with(context).load("file:///android_asset/logo.png").into(imageview控件);
- 加载SD卡图片文件
Glide.with(context).load(new File("路径")).into(imageview控件);
- 加载网络图片
Glide.with(context).load("url地址").into(imageview控件);
DrawableRequestBuilder常用设置方法
- 设置占位图片,错误图片
Glide.with(context).load(url)
.placeholder(R.mipmap.id)
.error(R.mipmap.id)
.into();
- 淡入淡出动画
Glide.with(context).load(url)
.crossFade()
.into();
- 无动画
Glide.with(context).load(url)
.dontAnimate()
.into();
- 图片重新调整大小
Glide.with(context).load(url)
.override(width,height)
.into();
- 图片剪切类型centerCrop()、fitCenter()
Glide.with(context).load(url)
.centerCrop()
.into();
- 自定义图形转换
Glide.with(context).load(url)
.transform()
.into();
- 内存缓存、磁盘缓存
Glide.with(context).load(url)
.skipMemoryCache(boolean)
.diskCacheStrategy(DiskCacheStrategy.None)//下面有详细介绍
.into();
导包
compile 'com.github.bumptech.glide:glide:3.7.0'
全局初始化配置
在MyApplication中配置
//初始化Glide
private void initGlide() {
//设置网络访问方式
//**Glide默认使用HttpUrlConnection访问网络,可以设置为OkHttp或者Volley**
//**顺便一提Picasso默认的也是HttpUrlConnection访问网络**
Glide.get(this)//get()方法返回的是Glide的对象
.register(GlideUrl.class, InputStream.class,
new OkHttpUrlLoader.Factory(okHttpClient));//参数中传入一个okhttpclient对象
//注册网络加载器
//OkHttpUrlLoader类,这里要导集成Okhttp的glide包:compile 'com.github.bumptech.glide:okhttp-integration:1.4.0'
//获取Glide默认缓存位置
File photoCacheDir = Glide.getPhotoCacheDir(this);
Log.d(TAG, "-->>Glide默认缓存位置:"+photoCacheDir.getAbsolutePath());
//获取默认分配的磁盘缓存空间的大小
MemorySizeCalculator calculator = new MemorySizeCalculator(this);
int defaultMemoryCacheSize = calculator.getMemoryCacheSize();
int defaultBitmapPoolSize = calculator.getBitmapPoolSize();
Log.d(TAG, "-->>defaultMemoryCacheSize: " + defaultMemoryCacheSize);
Log.d(TAG, "-->>defaultBitmapPoolSize: " + defaultBitmapPoolSize);
}
更多加载时的配置
Glide.with(this)
.load(urlString_net)
.placeholder(R.mipmap.ic_launcher)//占位图
.error(R.mipmap.ic_launcher)//加载错误时显示的图片
.dontAnimate()//不加载动画
//.crossFade()//淡入淡出动画
.override(200,100)//重新设置图片宽高
.centerCrop()//图片剪切类型
//.fitCenter()//图片剪切类型
.skipMemoryCache(true)//跳过内存缓存,即加载时不从内存中读取
.diskCacheStrategy(DiskCacheStrategy.NONE)
//磁盘缓存策略
//DiskCacheStrategy.NONE 代表:什么都不缓存
//DiskCacheStrategy.ALL 代表:缓存所有版本的图片
//DiskCacheStrategy.SOURCE 代表:仅仅缓存原来的全分辨率的图片
//DiskCacheStrategy.RESULT 代表:仅仅缓存最终的图片,即经过调整的,或者转换后的图片,这个是默认的设置
.transform(new BitmapCircleTransformation(this))//转换设置,这里转换为圆形图片
//设置加载进度的监听
.into(new GlideDrawableImageViewTarget(imageview) {
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
super.onLoadFailed(e, errorDrawable);
//这里是 当加载失败时的设置
mProgressBarMain.setVisibility(View.GONE);
}
@Override
public void onLoadStarted(Drawable placeholder) {
super.onLoadStarted(placeholder);
//这里是 当加载开始时的设置
mProgressBarMain.setVisibility(View.VISIBLE);
}
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation super GlideDrawable> animation) {
super.onResourceReady(resource, animation);
//这里是 当加载完成时的设置
mProgressBarMain.setVisibility(View.GONE);
}
});
//.into(imageview)//直接设置到要显示的ImageView中
设置Glide的网络访问库
==见上面在MyApplication中的配置==
监听加载进度
==见上面==
自定义缓存
Glide默认使用手机内置存储进行磁盘缓存,可以配置为外部存储,可以配置缓存大小,图片池大小。
默认使用两个线程池来分别执行读取缓存和下载任务。
==Glide默认缓存位置:/data/user/0/这里是包名/cache/image_manager_disk_cache==
第一步:
自定义类实现GlideModuel接口
public class CustomGlideModule implements GlideModule {
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// builder
// .setMemoryCache(MemoryCache memoryCache)
// .setBitmapPool(BitmapPool bitmapPool)
// .setDiskCache(DiskCache.Factory diskCacheFactory)
// .setDiskCacheService(ExecutorService service)
// .setResizeService(ExecutorService service)
// .setDecodeFormat(DecodeFormat decodeFormat)
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);//设置图片清晰度
int cacheSize = 10 << 20;
builder.setDiskCache(
new InternalCacheDiskCacheFactory(context, cacheSize)//自定义为缓存空间大小,缓存位置在内部存储器
//new ExternalCacheDiskCacheFactory(context, cacheSize)//自定义为缓存空间大小,缓存位置在外部存储器
);
}
@Override
public void registerComponents(Context context, Glide glide) {
// nothing to do here
}
}
第二步:
在Manifest.xml中配置自定义的module类
清理内存缓存和磁盘缓存
//清除内存缓存
Glide.get(context).clearMemory();
//清除磁盘缓存,要在独立的子线程中进行
new Thread(new Runnable() {
@Override
public void run() {
Glide.get(context).clearDiskCache();
}
}).start();
自定义图形转换
第一步:
定义类继承BitmapTransformation
- 旋转转换
public class RotateTransformation extends BitmapTransformation {
private float rotateAngle = 0f;
public RotateTransformation(Context context, float rotateAngle) {
super(context);
this.rotateAngle = rotateAngle;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
Matrix matrix = new Matrix();
matrix.postRotate(rotateAngle);
Bitmap result = Bitmap.createBitmap(toTransform, 0, 0, toTransform.getWidth(), toTransform.getHeight(), matrix, true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
result.setConfig(Bitmap.Config.ARGB_8888);
}
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
- 圆角转换
public class CircleTransformation extends BitmapTransformation{
public CircleTransformation(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) {
if (source == null) return null;
//1. 先计算出合适的坐标,就是重新绘制的正方形bitmap的左上角的坐标
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
//2. 创建一个空白Bitmap,将在该Bitmap上铺设画布进行绘图
Bitmap result = pool.get(size, size, Bitmap.Config.ARGB_4444);
if (result == null) {
result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_4444);
}
Canvas canvas = new Canvas(result);
Paint paint = new Paint();
paint.setAntiAlias(true);//画笔抗锯齿
//3. 选择原图中的中心矩形,绘制在画布上
Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);
paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
//4. 绘制图形
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
return result;
}
@Override
public String getId() {
return getClass().getName();
}
}
第二步:
使用
Glide.with(context).load(url)
.transform(new CircleTransformation(context))
//.transform(new RotateTransformation(context,180))
.into();