glide使用
在实际的开发中我们会经常遇见的问题就是图片加载,需要自己写工具类去加载,还要根据实际的情况去做缓存、圆形图。对于我这样的新手且无法完美解决的时候就想有个第三方框架来帮助我们解决这个事情。在12年的时候用的ImageLoader,后来用的就是Glide,这里讲下glide的基本用法先。这里是基于Glide4.9.0,以后的源码解析也基于这个版本做吧。
1.先说下怎么引用
implementation 'com.github.bumptech.glide:glide:4.9.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
首先在我们的App下的buil.gradle文件中的dependencies{}加入Glide的引用。
2.如何使用
Glide.with(MainActivity.this)
.load(imageUrlBaidu)
.into(mImageView2);
这里说明下基于4.9.0的
2.1 with(),with是我们传入上下文来支持后面的操作等。这里面的参数有多个(),这个方法在最底层需要传入的是Context上下文,而我们可以传入的有View、Context、Activity、Fragment、FragmentActivity,其中Fragment支持android.app.Fragment和android.support.v4.app.Fragment,但是android.app.Fragment已经开始不推荐使用了,我们最好可以在使用中传入Context上下文。
屏幕快照 2019-06-03 上午11.03.10.png
2.2 load(),load是我们告诉程序我们的数据源在哪里。load也支持多参数,这里我们可以传入的有Uri、File、byte[]、Object、Bitmap、String、Drawable、Integer、URl,其中Url不推荐使用,我先说下为什么URL不推荐使用了吧,在实际开发中我们得到的数据往往是String类型,如果我们再转换为URL,我们就需要处理异常,因为我们无法保证在转换为URL的时候不会出现异常,毕竟客户端处理的数据是来自服务端,在发版后是不可控的,我们可以直接使用String传入就可以了。这里的laod其实就是告知我们的数据源是从哪里来的,然后由不同的方法进行处理。
屏幕快照 2019-06-03 上午11.11.32.png
2.3 into(),into是我们需要告知程序我们的图片最终在哪里显示。into同样支持多参数,大概可分为2种ImageView和Y(Y extends Target<TranscodeType>),但是实际开发中我们传入的大多都是ImageView。
屏幕快照 2019-06-03 上午11.25.50.png
到了这里我们已经可以对Glide的基本使用,有了简单的认知了,我们可以将各种数据源的图片显示到了我们的界面上了,其实还是很简单的。假如我们需要进行缓存呢?Glide能不能帮我们解决这件事,答案是可以的,Glide默认进行了三级缓存操作,而且给了我们缓存的策略进行缓存内容的设置。
Glide.with(MainActivity.this)
.load(imageUrlBaidu)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(mImageView2);
我们发现这里只是加了行代码调用了diskCacheStrategy(),然后告知程序我们需要做什么,这里在用的时候我们需要知道以下内容
DiskCacheStrategy是缓存策略,有以下几个参数,并详细说明该策略的保存信息。
1) ALL 网络资源执行DATA、RESOURCE,本地资源执行RESOURCE
2) NONE 不缓存任何内容
3) DATA 缓存原始图片
4) RESOURCE 缓存解码后的图片
5) AUTOMATIC 根据图片资源智能地选择使用哪一种缓存策略(默认选项)
这里缓存策略我们会用了,在实际开发中我们很少用到这些。
下面我们继续说个常用的,站位图和错误图,在Glide上使用占位图和错误图很简单就可以做到
Glide.with(MainActivity.this)
.load(imageUrlBaidu)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.error(R.mipmap.ic_launcher1)
.placeholder(R.mipmap.ic_launcher1
.into(mImageView2);
通过placeholder设置本地的占位图和error设置错误图就可以实现我们的需求了,这两个方法均可以设置Drawable、本地图片资源和RequestBuilder<TranscodeType>,前两个比较清楚,后面一个我们后面再去分析。
到这里基本上就能满足我们日常需求了,下面再看下Glide中有什么方法,可能会在开发中使用到
- listener 这里我们可以对加载图片进行处理,加载成功和加载失败两个方法
- addListener 和listener不同的是,listener是清空了监听,把当前监听加入进去,addListener是不清空监听,既不影响其他地方调用的监听,仅仅是把当前的监听加入进去,建议使用addListener,其他和listener相同
- .centerInside() .fitCenter() .centerCrop() 这三种图片处理方式,centerInside等比例缩小显示,在横向或竖向上相等,不会进行放大。fitCenter等比例放大或缩小。centerCrop等比例放大。
- override(int w,int h)这个方法会将图片以制定的高宽显示在ImageView上
5.apply(RequestOptions.bitmapTransform(new RoundedCorners(dp2px(60)))) 这个方法可以设置为圆形图了。 - .optionalFitCenter() 同样可以圆形
Glide.with(MainActivity.this)
.load(headPic)
.apply(RequestOptions.bitmapTransform(new RoundedCorners(dp2px(60))))
.into(mImageView1);
private int dp2px(int dp) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
差不多就这些了,其实还是蛮简单的。下次写glide就要看看了,这次还是比较匆忙的,下次写就写写transform和glide的缓存。
transform这个 暂时不想写了,大家可以去看下glide-transformations这个大概看了下 已经能满足日常了。