在加载图片框架中,我使用最多的是Glide框架,在之前的文章中,也有涉及到,但是使用更多的是基本的链式调用结构
Glide.with(this).load(url).int(ImageView);
如果是开发组件,那么就需要将尽可能多的功能写在组件中,为日后的开发提供帮助,下面就先介绍一些其他用法。
1、transition
transition
就是过渡的意思,图片容器从占位符到加载的图片展示,传入的参数为BitmapTransitionOptions
,通常有withCrossFade()
、withWrapped()
等;
Glide.with(this)
.asBitmap()
.load(url)
.transition(withCrossFade(3000))
.into(iv_image);
在设置了transition属性之后,会有一个清晰度动画一样的渐变过程
2、RequestOptions
RequestOptions主要是来做一些准备工作,当网络差加载图片慢的情况下,先显示未加载的图片,当网络一样,加载失败的时候,需要显示加载失败的图片;除此之外,还可以设置缓存、加载的优先级等,通过Glide的apply属性设置。
private RequestOptions initRequestOptions() {
RequestOptions options = new RequestOptions();
options.placeholder(R.drawable.ic_launcher_background)
.error(R.mipmap.ic_launcher_round)
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
.skipMemoryCache(false)
.priority(Priority.NORMAL);
return options;
}
3、圆角裁剪
在之前进行圆角裁剪的时候,通常使用circleCrop()
方法来进行图片的裁剪,然后将图片加载到ImageView
当中;下面将会介绍一种新的方式,将ImageView转换为Target。
/**
* 加载圆形的图片
* @param imageView 容器
* @param url
*/
public void displayImageForCircle(final ImageView imageView, String url){
Glide.with(imageView.getContext())
.asBitmap()
.load(url)
.apply(initRequestOptions())
.into(new BitmapImageViewTarget(imageView){
//将ImageView包装成Target
@Override
protected void setResource(Bitmap resource) {
RoundedBitmapDrawable drawable = RoundedBitmapDrawableFactory
.create(imageView.getResources(),resource);
//设置为圆形
drawable.setCircular(true);
//设置图片到ImageView
imageView.setImageDrawable(drawable);
}
});
}
4、为ViewGroup设置背景,并模糊处理
/**
* 为ViewGroup设置背景
* @param viewGroup
* @param url
*/
public void displayImageFroViewGroup(final ViewGroup viewGroup, String url){
Glide.with(viewGroup.getContext())
.asBitmap()
.load(url)
.apply(initRequestOptions())
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
//onResourceReady是在主线程,加载耗时造成主线程阻塞
//将Bitmap对象转换为Drawable对象
Observable.just(resource).map(new Function<Bitmap, Drawable>() {
@Override
public Drawable apply(Bitmap bitmap) throws Exception {
//将Bitmap模糊处理,转换成Drawable对象
Drawable drawable = new BitmapDrawable(Utils.doBlur(bitmap,
100,true));
return drawable;
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Drawable>() {
@Override
public void accept(Drawable drawable) throws Exception {
//将转换得到的Drawable设置在ViewGroup
viewGroup.setBackground(drawable);
}
});
}
});
}
对于Glide的链式API来说,最后into的时候只能是Target或者ImageView,并没有ViewGroup这一项,所以不能直接将ViewGroup into进去。
通常来说,会使用SimpleTarget
,调用onResourceReady
方法,当onResourceReady方法被调用的时候,意味着图片资源已经加载好了,但是此时线程处于主线程,还需要对图片进行模糊处理,因此要考虑使用RxJava做线程切换,进行类型转换,将Bitmap对象转为Drawable,并进行模糊处理,处理完成之后,在下游将ViewGroup的背景设置。
5、为非View对象加载图片
/**
* 为非View对象加载图片
* @param context
* @param target
* @param url
*/
public void displayImageForTarget(Context context, Target target,String url ){
Glide.with(context)
.asBitmap()
.load(url)
.transition(withCrossFade())
.apply(initRequestOptions())
.fitCenter()
.into(target);
}
6、为Notification加载图片
/**
* 为Notification加载图片
* @param context 上下文对象
* @param rv RemoteView
* @param id 加载图片的控件ID
* @param notification Notification对象
* @param NOTIFICATION_ID Notification的id
* @param url 加载图片的url
*/
public void displayImageForNotification(Context context, RemoteViews rv,
int id, Notification notification,
int NOTIFICATION_ID,String url){
this.displayImageForTarget(context,
getNotificationTarget(context,rv,id,notification,NOTIFICATION_ID),url);
}
//构建一个NotificationTarget对象
public NotificationTarget getNotificationTarget(Context context,RemoteViews rv, int id,
Notification notification,
int NOTIFICATION_ID){
NotificationTarget target = new NotificationTarget(context,id,rv,notification,NOTIFICATION_ID);
return target;
}