图片可以丰富App
的显示效果,但是图片也是最难处理的,因为通常情况下,图片是最耗内存的。
iOS
的同学都知道SDWebImage
,它极大的简化了我们对图片的操作。而Android
端的图片加载框架则有很多,Volley
、Picasso
和Glide
,今天我们主要说的就是Glide
。
基本用法 首先使用gradle
导入Glide
:
dependencies {
compile 'com.github.bumptech.glide:glide:3.7.0'
}
在导入之前,最好先去Github
上查看一下最新版本。当然,需要加入网络权限。
public class MainActivity extends AppCompatActivity implements View .OnClickListener {
private ImageView mImageView;
private Button mButton;
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mImageView = (ImageView) findViewById(R.id.image_view);
mButton = (Button) findViewById(R.id.loadImage);
mButton.setOnClickListener(this );
}
@Override
public void onClick (View v) {
String url = "https://f10.baidu.com/it/u=1863145503,1330064667&fm=72" ;
Glide.with(this )
.load(url)
.into(mImageView);
}
}
with() 先来看看with
方法,with
方法可以接收Context
、Activity
、FragmentActivity
、Fragment
,这四种类型的参数。此方法传入的实例决定Glide
加载图片的生命周期,如果传入的是Activity
的实例,当Activity
被销毁的时候,图片加载也会停止。此方法返回一个RequestManager
对象。
load() load
方法用于指定加载的图片资源,可以是网络图片,本地图片,应用资源,二进制流,Uri对象等。
File file = new File(getExternalCacheDir() + "/image.jpg" );
Glide.with(this ).load(file).into(mImageView);
int resource = R.drawable.image;
Glide.with(this ).load(resource).into(mImageView);
byte [] image = getImageBytes();
Glide.with(this ).load(image).into(mImageView);
Uri imageUri = getImageUri();
Glide.with(this ).load(imageUri).into(mImageView);
into() into
表示将下载好的图片显示在哪个ImageView
上。当然,有时候我们需要在图片下载完成以后做一些事情,如下:
Glide.with(this)
.load(imageUri)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
//处理图片
}
});;
上面三个方法组成了一个完整的加载过程,在这个加载过程中,我们还可以添加其他的配置。下面的方法都是添加在load
和into
之间。
asBitmap() 设置图片的格式为静态图片,如果要加载的图片格式是gif
,那么会显示第一帧的静态图片。
asGif() 设置图片的格式为动态图片,如果要加载的图片格式是静态图片,那么会直接回显示错误图片。
placeholder() 此方法用于设置一个占位图
String url = "https://f10.baidu.com/it/u=1863145503,1330064667&fm=72";
Glide.with(this)
.load(url)
.placeholder(R.mipmap.ic_launcher)
.into(mImageView);
diskCacheStrategy() 此方法主要用作与磁盘缓存,可传参数为:
DiskCacheStrategy.ALL
: 即缓存原图又缓存压缩后的图
DiskCacheStrategy.NONE
:不缓存
DiskCacheStrategy.SOURCE
:原图缓存
DiskCacheStrategy.RESULT
:缓存压缩后的图片,因为Glide
通常不会把原图显示到界面上,例如我们的ImageView
的大小是50x50,而图片的大小是200x200,如果我们原图显示,会造成不必要的内存浪费。所以Glide
会根据图片的实际大小来压缩。
注意: 如果显示的图片位gif
格式的图片,最好不缓存,因为Glide
会一帧一帧的缓存图片。
skipMemoryCache() 此方法表示是否跳过内存缓存,设置为true
表示不进行内存缓存。
error() 设置一个加载失败的图片
animate() 设置加载成功后,显示的动画
override() 设置图片加载成功后的大小,例如:verride(300,300)
priority() 设置下载的优先级
clearDiskCache() 清理磁盘缓存,需要在子线程中执行 Glide.get(this).clearDiskCache();
clearMemory() 清理内存缓存,可以在UI线程执行 Glide.get(this).clearMemory();
GlideMoudle GlideMoudle
是一个抽象方法,全局改变Glide
行为的一个方式,通过全局GlideMoudle
配置Glide
,用GlideBuilder
设置选项,用Glide
注册ModelLoader
等。
自定义一个GlideMoudle public class MyGlideModule implements GlideModule {
@Override
public void applyOptions (Context context, GlideBuilder builder) {
}
@Override
public void registerComponents (Context context, Glide glide) {
}
}
AndroidManifest.xml注册 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android ="http://schemas.android.com/apk/res/android"
package ="com.guiyongdong.wangyidemo" >
<application
android:allowBackup ="true"
android:icon ="@mipmap/ic_launcher"
android:label ="@string/app_name"
android:roundIcon ="@mipmap/ic_launcher_round"
android:supportsRtl ="true"
android:theme ="@style/AppTheme" >
...
<meta-data android:name ="com.guiyongdong.wangyidemo.MyGlideModule"
android:value ="GlideModule" />
</application >
</manifest >
添加混淆处理 因为我们的代码有可能添加混淆,所以不要给MyGlideModule
添加混淆
-keepnames class com.guiyongdong.wangyidemo.MyGlideModule
设置Glide内存缓存大小 int maxMemory = (int ) Runtime.getRuntime().maxMemory();
int memoryCacheSize = maxMemory/8 ;
builder.setMemoryCache(new LruResourceCache(memoryCacheSize));
设置Glide磁盘缓存大小 File cacheDir = context.getExternalCacheDir();
int diskCacheSize = 1024 *1024 *30 ;
builder.setDiskCache(new DiskLruCacheFactory(cacheDir.getParent(),"glide" ,diskCacheSize));
也可以通过如下两种方式:
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, "glide" , diskCacheSize));
builder.setDiskCache(new ExternalCacheDiskCacheFactory(context, "glide" , diskCacheSize));
设置图片的解码格式
builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888);
设置缓存内存大小 //设置BitmapPool缓存内存大小
builder.setBitmapPool(new LruBitmapPool(memoryCacheSize));
基本上的关于Glide
的用法已经了解的差不多了,接下来,如果有时间,会了解一下Glide
的源码。