Glide.with(this)//设置上下文对象,可以是context、activity、fragment、fragmentActivity、v4包下的fragment, Glide的生命周期与这个对象一致 .load(url)//加载的路径,包括网络图片、本地图片、应用资源、二进制流、Uri对象等等 .asBitmap()//Glide会自动判断图片类型,支持显示gif类型的图片,如果加上这句话则只允许加载静态图片,不显示动图 .asGif()//与上面的方法相对应,只允许显示动图,如果此时加载图片是静态图则会显示错误图片 .placeholder(R.drawable.loading)//占位图,即正式图片未加载完成时显示的图片 .error(R.drawable.error)//错误图片,即加载失败后显示的图片 .diskCacheStrategy(DiskCacheStrategy.NONE)//禁用硬盘缓存,NONE是不缓存、SOURCE只缓存原始图、 RESULT只缓存转换过的图片(默认选项)、ALL缓存原始图+转换过的图片 .override(100, 100)//指定图片大小,表示100*100的图片像素尺寸 .skipMemoryCache(true)//禁用内存缓存,默认内存缓存是开启的 .into(imageView);//设置显示容器
2.Glide的一些特性:
Glide与初始化时给定的context的生命周期保持一致,即activity处于可见状态时才加载图片,不可见时停止加载图片,如果context是applicationContext类型则生命周期与application保持一致。
Glide的内存缓存正在使用的图片使用map+WeakReference缓存,其他使用LRUCache缓存。硬盘缓存使用的是DiskLruCache。
3.Glide的高级用法:
1)当图片的url地址会随一定原因改变时,会导致缓存对应的key不断变化,从而导致Glide的缓存机制失效。解决方法,创建一个MyGlideUrl继承GlideUrl重写getCacheKey()方法使得getCacheKey的返回值固定不变,从而使得缓存key固定不变,则可以解决这个问题,例如:
如果我们的图片地址是这样的(从七牛云上得到的),其中token值可变:
http://url.com/image.jpg?token=d9caa6e02c990b0a
public class MyGlideUrl extends GlideUrl { private String mUrl; public MyGlideUrl(String url) { super(url); mUrl = url; } @Override public String getCacheKey() { return mUrl.replace(findTokenParam(), ""); } private String findTokenParam() { String tokenParam = ""; int tokenKeyIndex = mUrl.indexOf("?token=") >= 0 ? mUrl.indexOf("?token=") : mUrl.indexOf("&token="); if (tokenKeyIndex != -1) { int nextAndIndex = mUrl.indexOf("&", tokenKeyIndex + 1); if (nextAndIndex != -1) { tokenParam = mUrl.substring(tokenKeyIndex + 1, nextAndIndex + 1); } else { tokenParam = mUrl.substring(tokenKeyIndex); } } return tokenParam; } }
使用方法:
Glide.with(this) .load(new MyGlideUrl(url)) .into(imageView);
2.Glide直接获取图片的方法,into方法中除了可以传入imageview还可以传入其他的Target类型的参数,Target的子类很多通常只需在两种Target的基础上去自定义就行,一种是SampleTarget,一种是ViewTarget。
1)SampleTarget的使用方法(不显示出来,直接获取图片):
//如果你的图片类型确定,则GlideDrawable也可以写成Bitmap SimpleTarget<GlideDrawable> simpleTarget = new SimpleTarget<GlideDrawable>() { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) { imageView.setImageDrawable(resource);//resource就是Glide获取到的图片 } };
2)ViewTarget的使用方法(自定义view使用Glide加载图片):
需要创建自定义view,这里我们创建一个自定义布局MyLayout:
public class MyLayout extends LinearLayout { private ViewTarget<MyLayout, GlideDrawable> viewTarget; public MyLayout(Context context, AttributeSet attrs) { super(context, attrs); //如果你的图片类型确定GlideDrawable也可以替换成Bitmap viewTarget = new ViewTarget<MyLayout, GlideDrawable>(this) { @Override public void onResourceReady(GlideDrawable resource, GlideAnimation glideAnimation) { MyLayout myLayout = getView(); myLayout.setImageAsBackground(resource);//resource就是Glide获取到的图片 } }; } public ViewTarget<MyLayout, GlideDrawable> getTarget() { return viewTarget; } public void setImageAsBackground(GlideDrawable resource) { setBackground(resource); } }
public class MainActivity extends AppCompatActivity { MyLayout myLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myLayout = (MyLayout) findViewById(R.id.background); } public void loadImage(View view) { String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg"; Glide.with(this) .load(url) .into(myLayout.getTarget()); } }
3.preload()方法,预加载,即不调用into方法实现图片的缓存
Glide.with(this) .load(url) .diskCacheStrategy(DiskCacheStrategy.SOURCE)//必须使用SOURCE类型,保证图片宽高一致,不会产生多个key .preload();预加载后使用图片:
Glide.with(this) .load(url) .diskCacheStrategy(DiskCacheStrategy.SOURCE)//必须使用SOURCE类型,保证图片宽高一致,不会产生多个key .into(imageView);
4.downloadOnly方法,直接获取到缓存文件的方法
1)downloadOnly(int width, int height)只能在子线程中使用,会得到一个FutureTarget类型的对象,FutureTarget.get()可以获得File对象,举例:
public void downloadImage(View view) { new Thread(new Runnable() {//开启子线程 @Override public void run() { try { String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg"; final Context context = getApplicationContext(); FutureTarget<File> target = Glide.with(context) .load(url) .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL);//获取FutureTarget对象 final File imageFile = target.get();//获取File对象 runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(context, imageFile.getPath(), Toast.LENGTH_LONG).show();//显示文件路径 } }); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
2)downloadOnly(Y Target)可以在主线程获取File对象,但要自己实现Target子类。
实现Target子类,只需要实现getSize()方法和onResourceReady()方法,其他方法不重要:
public class DownloadImageTarget implements Target<File> { private static final String TAG = "DownloadImageTarget"; @Override public void onStart() { } @Override public void onStop() { } @Override public void onDestroy() { } @Override public void onLoadStarted(Drawable placeholder) { } @Override public void onLoadFailed(Exception e, Drawable errorDrawable) { } @Override public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) { Log.d(TAG, resource.getPath());//这里的resource就是获取的图片文件 } @Override public void onLoadCleared(Drawable placeholder) { } @Override public void getSize(SizeReadyCallback cb) { //Glide在加载图片前会先计算图片大小,这个工作就交给我们在这里实现了,Target.SIZE_ORIGINAL表示图片的原始尺寸 cb.onSizeReady(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); } @Override public void setRequest(Request request) { } @Override public Request getRequest() { return null; } }
使用方法:
public void downloadImage(View view) { String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg"; Glide.with(this) .load(url) .downloadOnly(new DownloadImageTarget()); }
5.listener方法,用来监听加载成功还是失败
public void loadImage(View view) { String url = "http://cn.bing.com/az/hprichbg/rb/TOAD_ZH-CN7336795473_1920x1080.jpg"; Glide.with(this) .load(url) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {//加载成功时的回调 return false;//这里一定要是false否则事件不向下传递,即不会执行into方法 } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {//加载失败异常时的回调 return false;//同上 } }) .into(imageView); }
这篇文章是我根据郭霖大神解析Glide系列总结的基础使用方法和特性,如果想看源码分析的可以去大神博客看Android图片加载框架最全解析(一),Glide的基本用法