在上一篇博客《图片框架Glide的使用(一)》中介绍了部分图片加载框架Glide的使用方法,在这一篇博客中继续将介绍Glide框架中的另外一些使用。
废话不多说,接着上一篇博客来:
⑪ 自定义图形变换
Glide.with(MainActivity.this)
.load(ImageUrl.images[34])
//.transform(new MyTransformation(MainActivity.this, "circle",true))
.dontTransform() // 不使用图形转换
.into(imageView);
Glide.with(MainActivity.this)
.load(ImageUrl.images[35])
.transform(new MyTransformation(MainActivity.this, "round",false))
.into(imageView1);
// 定义转换类 BitmapTransformation实现Transformation接口
class MyTransformation extends BitmapTransformation {
private String key; // key值
private boolean flag = false;// true 圆形;false 圆角矩形
public MyTransformation(Context context, String key, boolean flag) {
super(context);
this.key = key;
this.flag = flag;
}
@Override
protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
if (flag) {
// 圆形图片,调用工具类中的方法。
return BitmapUtils.makeCircleImage(toTransform);
} else {
// 圆角图片,圆角大小为50,调用工具类中的方法。
return BitmapUtils.makeRoundRect(toTransform, 50);
}
}
@Override
public String getId() {
return key;// Glide使用该键作为缓存系统的一部分,为了避免意外的问题,所以确保它是唯一的
}
}
在代码中所用到的工具类,在我的另一篇博客《图片框架Picasso的简单使用》当中也使用了,在博客中有下载地址,这里就不在上传了,可以直接去下载。
⑫ 修改缓存行为
Glide.with(MainActivity.this)
.load(ImageUrl.images[34])
.skipMemoryCache(true) // true:跳过内存缓存,false:默认行为,不跳过内存缓存
.diskCacheStrategy(DiskCacheStrategy.NONE)// 修改磁盘缓存行为,参数为枚举值
.into(imageView);
// DiskCacheStrategy取值:
DiskCacheStrategy.ALL // 缓存所有版本的图像(默认行为)
DiskCacheStrategy.SOURCE // 仅仅只缓存原来的全分辨率的图像
DiskCacheStrategy.RESULT // 仅仅缓存最终的图像,即降低分辨率后的(或者是转换后的)
DiskCacheStrategy.NONE // 什么都不缓存
⑬ 修改缓存大小、位置、加载图片的质量
要改变缓存的位置。大小以及图片的质量我们需要定制一个GlideModule类,然后在自定义的GlideModule中进行修改。
定制GlideModule主要有2个步骤
第一步:自定义类实现GlideModule接口,并重写里面的方法;
第二步:全局的去声明这个类,让Glide知道它应该在哪里被加载和使用。Glide 会扫描 AndroidManifest.xml为 GlideModule的meta声明。因此,你必须在 AndroidManifest.xml的<application>标签内声明这个刚刚创建的GlideModule。
需要注意的是name为自定义GlideModule的全路径名(包名+类名)。就这样,你不需要去添加其他任何代码。如果你想删掉GlideModule,只需要把它从AndroidManifest.xml中移除就可以了。Java类可以保存,如果以后需要使用,直接再次引用就可以了。如果它没有在 AndroidManifest.xml中被引用,那它不会被加载或被使用。
可以同时声明多个GlideModule。Glide将会(没有特定顺序)得到所有的声明GlideModule。
自定义类实现GlideModule接口,并重写里面的方法:
public class ConsumerGlideModule implements GlideModule {
private final int MAX_MEMORY_CACHE = 1024 * 1024* 8; // 8M
private final int MAX_DISK_CACHE = 1024 * 1024* 8; // 125M
@Override
public void applyOptions(Context context, GlideBuilder builder) {
// 应用程序可使用的最大内存,在一般情况下,以最大内存的 1/8作为图片的缓存内存
// long maxBitmapMemoryCache = Runtime.getRuntime().maxMemory() / 8;
// long totalMemory = Runtime.getRuntime().totalMemory();// 应用程序已获得内存
// long freeMemory = Runtime.getRuntime().freeMemory(); // 剩余内存
// 指定内存缓存大小为MAX_MEMORY_CACHE
builder.setMemoryCache(new LruResourceCache(MAX_MEMORY_CACHE));
// 指定位置在packageName/cache/glide_cache,大小为MAX_DISK_CACHE的磁盘缓存
// builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "glide_cache", MAX_DISK_CACHE));
// 自定义磁盘缓存目录
builder.setDiskCache(new DiskCache.Factory() {
@Override
public DiskCache build() {
// 自定义磁盘缓存目录为外置储存卡根目录/glide_cache,大小为MAX_DISK_CACHE
File directory = Environment.getExternalStorageDirectory();
File diskCacheFile = new File(directory,"glide_cache");
return DiskLruCacheWrapper.get(diskCacheFile, MAX_DISK_CACHE);
}
});
//全部的内存缓存用来作为图片缓存
builder.setBitmapPool(new LruBitmapPool(MAX_MEMORY_CACHE));
// 修改图片的质量为ARGB_8888,和Picasso一样
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
}
@Override
public void registerComponents(Context context, Glide glide) {
}
}
在 AndroidManifest.xml的<application>标签内声明这个刚刚创建的GlideModule:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.android.glideuser.module.ConsumerGlideModule"
android:value="GlideModule" />
...
</application>
⑭ 显示本地视频
File directory = Environment.getExternalStorageDirectory();
File file = new File(directory,"Movies/gif.wmv");
Glide.with(MainActivity.this)
.load(file)
.into(imageView);
1.只能加载本地视频,网络视频无法加载。
2.加载本地视频显示只是视频的第一帧图像,相当于一张缩略图,不能播放视频。
⑮ 请求监听器,可以捕获加载图片失败时的异常信息以及对加载之后的图片进行处理
Glide.with(MainActivity.this)
.load(ImageUrl.images[36])
.animate(android.R.anim.slide_in_left)
.listener(new MyListener()) // 使用监听器
.into(imageView);
// 自定义的监听器类
class MyListener implements RequestListener<String, GlideDrawable> {
// 加载发生异常时走onException()方法
@Override
public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
// isFirstResource 是否第一次请求
// 打印异常信息
Log.i("MyListener", "Exception info : " + e.getMessage());
// 打印请求地址
Log.i("MyListener", "url : " + model);
// 打印请求是否正在加载(另外还有是否取消、完成、失败、暂停等)
Log.i("MyListener", "" + target.getRequest().isRunning());
// 返回false,表示发生异常时走Glide的异常处理机制(比如显示加载失败的图片等)
return false;
}
// 加载成功时走onResourceReady()方法
@Override
public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
// resource:加载的结果;model:加载的地址;isFromMemoryCache:是否从缓存中获取;isFirstResource:是否首次请求
if (isFromMemoryCache) {
// 这里表示如果是缓存的话同样使用动画,
// 在使用加载动画(第7点)时说过如果是从缓存中获取的图片即使设置了加载动画,默认也不会执行加载动画的,但是可以设置
imageView.setAnimation(AnimationUtils.loadAnimation(MainActivity.this, android.R.anim.slide_in_left));
}
// 可以做更多的处理
// 返回false表示让Glide处理结果;返回true的话表示自己已经处理了结果,不需要Glide来处理了。
return false;
}
}
⑯ Target使用
在前面说到的方法中有一个共同点,那就是我们最终都是将图片设置到ImageView中了,那么假设我们只是需要获取到图片本身然后用作其他的用途了,或者加载到我们自定义的控件中了。Glide给我们提供了Target实现这些需求。
SimpleTarget:
Glide.with(MainActivity.this)
.load(ImageUrl.images[36])
// 使用 SimpleTarget 将获取到的图片设置为按钮控件的背景
.into(new SimpleTarget<GlideDrawable>() {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
// getImage为Button对象,将图片设置为按钮的背景,可以任意处理
getImage.setBackgroundDrawable(resource);
}
});
// 指定图片大小
SimpleTarget<GlideDrawable>(500,400)指定大小为 500 * 400
ViewTarget:将获取到的图片设置到自定义控件中
自定义的控件:
public class CustomView extends FrameLayout {
private ImageView imageView;
public CustomView(Context context) {
this(context, null);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
imageView = new ImageView(context);
this.addView(imageView);
}
public void setImageDrawable(Drawable drawable){
imageView.setImageDrawable(drawable);
}
}
在Activity中使用:
customView = (CustomView) findViewById(R.id.custom_view);
getImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Glide.with(MainActivity.this)
.load(ImageUrl.images[37])
// 使用 ViewTarget 将获取到的图片设置到自定义控件中
.into(new ViewTarget<CustomView, GlideDrawable>(customView) {
@Override
public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) {
this.getView().setImageDrawable(resource);
}
});
}
});
SimpleTarget 效果图 ViewTarget效果图 Target更多实现类
⑰ 集成网络库(okHttp,Volley)
集成 okhttp2.x
在 build.gradle 添加
dependencies {
...
// 这个是用来对接 okhttp 2.x 的
compile 'com.github.bumptech.glide:okhttp-integration:1.4.0@aar'
// okhttp 2.x 的依赖
compile 'com.squareup.okhttp:okhttp:2.2.0'
...
}
然后在 AndroidManifest.xml 文件添加:
<meta-data
android:name="com.bumptech.glide.integration.okhttp.OkHttpGlideModule"
android:value="GlideModule" />
集成 okhttp 3.x
在 build.gradle 添加
dependencies {
...
// 这个是用来对接 okhttp 3.x 的
compile 'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'
// okhttp 3.x 的依赖
compile 'com.squareup.okhttp3:okhttp:3.2.0'
...
}
然后在 AndroidManifest.xml 文件添加
<meta-data
android:name="com.bumptech.glide.integration.okhttp3.OkHttpGlideModule"
android:value="GlideModule" />
集成 Volley
在 build.gradle 添加
dependencies {
...
// 这个是用来对接 volley 的
compile 'com.github.bumptech.glide:volley-integration:1.4.0@aar'
// volley 的依赖
compile 'com.mcxiaoke.volley:library:1.0.8'
...
}
然后在 AndroidManifest.xml 文件添加
<meta-data
android:name="com.bumptech.glide.integration.volley.VolleyGlideModule"
android:value="GlideModule" />
集成库添加到你的 AndroidManifest.xml之后。Glide 会自动认出它,然后使用他们作为网络库。并不要求做其他的配置!
注意:如果你同时在你的 build.gradle和AndroidManifest.xml中声明了两个库,那这两个库都会被添加。因为 GlideModule 没有任何特殊的加载顺序,你将会有一个不稳定的状态,它并不明确使用哪个网络库,所以建议只集成一个库。Glide暂时不会自动配置其他的网络库。
⑱ 清除图片加载请求
Glide.clear(View view)
Glide.clear(Target<?> target)
Glide.clear(FutureTarget<?> target)
⑲ 清除内存和磁盘缓存
Glide.get(this).clearMemory(); // 清除内存缓存
Glide.get(this).clearDiskCache(); // 清除磁盘缓存,需要在子线程执行
⑳ 与glide-transformations库结合使用
GitHub地址:https://github.com/wasabeef/glide-transformations
// 在build.gradle中添加
dependencies {
...
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'jp.wasabeef:glide-transformations:2.0.1' // glide-transformations库
}
Glide.with(MainActivity.this)
.load(ImageUrl.images[21])
// 圆角处理
.bitmapTransform(new RoundedCornersTransformation(MainActivity.this, 50, 50))
.into(imageView);
Glide.with(MainActivity.this)
.load(ImageUrl.images[22])
// 黑白效果处理
.bitmapTransform(new GrayscaleTransformation(MainActivity.this))
.into(imageView1);
Android图片加载框架二次封装,一行代码切换底层加载库:https://github.com/itrenjunhua/ImageLoader
对Glide的使用方法介绍暂时就是这么多了,更多的使用方法请查看在线API文档等待大家发现,地址:http://bumptech.github.io/glide/javadocs/latest/index.html