在以前的学习中用过的图片加载框架有Universal-Image-Loader,Fresco,现在学习的项目中使用到了Picasso,所以决定学习Picasso的使用,简单了解其内部工作原理。
综述
Picasso是Square公司推出的一个开源的Android图形缓存库,他实现了图片的异步加载,并解决了Android加载图片时候经常会出现的一些问题,Picasso不仅仅能加载网络资源,也能从本地文件,Android项目资源,以及URI地址进行图片加载。
Picasso特点:
在Adapter中取消了不在视图范围内的ImageView的资源加载,因为可能会产 生图片错位;
使用复杂的图片转换技术降低内存的使用
自带内存和硬盘的二级缓存机制
基础使用
在项目中添加依赖
compile 'com.squareup.picasso:picasso:2.5.2'
代码中使用加载
Picasso.with(MainActivity.this)
.load("https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1491624419&di=a32d0dc0caf2d49fce4a3c5eabc914f1&src=http://img.zcool.cn/community/01c8955709d1f132f8751b3fd6f002.jpg@900w_1l_2o_100sh.jpg")
.into(imag);
由代码可以看出,Picasso的使用是非常简单的。链式调用with().load().into()即可完成加载工作。
空URI和错误URI处理
Picasso提供了两种解决方法:
- 在判断为空的地址时,取消网络请求,调用cancelRequest(),然后调用imageView.setImageDrawable(null)
- 或者调用Picasso的.placeHolder()方法进行图片的替换展示
- 如果图片网址错误,我们也可以调用.error()方法进行图片替换
其他的一些方法
- noFade(),Picasso默认图片加载方式是淡入效果,调用次方法可以取消该效果
- noPalceHolder(),不设置占位图片,一般使用情况在二次加载的时候不想展示占位图片时就可以调用此方法
- resize(),自定义图片的加载大小
- onlyScaleDown(),缩短图片加载时间
- centerCrop(),Inside(),fit(),对图片的展示进行相关处理
- priority(),设置图片加载的优先级
- tag相关函数,pauseTag(),resumeTag(),cancleTag(),通过添加tag就可以控制Picasso请求的暂停,开始和取消,应用场景,ListView滑动加载优化。
- fetch(),在后台加载一张图片但并不显示,只是加载到本地和内存。
- get(),该方法是一个异步线程,加载完成返回一个Bitmap,不能在主线程中调用。
与RemoteViews的结合使用
Picasso支持将图片加载到RemoteViews对应布局的ImageView中,实现方式是重载了into()方法
加载图片到Notification的布局
into(Android.widget.RemoteViews remoteViews, int viewId, int notificationId, android.app.Notification notification)
加载图片到Widget的布局
into(RemoteViews remoteViews, int viewId, int[] appWidgetIds)
高级操作
图片的转化
Picasso提供了rotate()方法对图片进行旋转处理,
rotate(float degrees)
传入参数0~360之间就可以,还重载了这个方法rotate(float degree,float pivoteX,float pivoteY)
让图片相对某一个点进行旋转。同时Picasso也提供了接口Transformation,我们通过自定义类实现Transformation,重写重要方法,就可以实现自定义的对图片的各种转化,比如模糊处理。
另外如果我们想实现复杂的图片转化,比如模糊+旋转等,可是定义多个实现了Transformation的类,在调用transfor()函数的前将他们的对象都放入List结构当中,然后将此List作为参数调用即可。
Picasso内部重载了transform()函数
/** * Add a custom transformation to be applied to the image. * Custom transformations will always be run after the built-in transformations. */ public RequestCreator transform(Transformation transformation) { data.transform(transformation); return this; } /** * Add a list of custom transformations to be applied to the image. * Custom transformations will always be run after the built-in transformations. */ public RequestCreator transform(List<? extends Transformation> transformations) { data.transform(transformations); return this; }
缓存机制
MemoryPolicy,控制Picasoo是否去内存中进行读取。
memoryPolicy(MemoryPolicy policy, MemoryPolicy... additional)
MemoryPolicy是一个枚举public enum MemoryPolicy { /** 跳过内存读取图片的操作. */ NO_CACHE(1 << 0), /** *如果你的图片只加载一次就没用了,就调用该值,这样的话Picasso就不会在内存及本地进行缓存了 */ NO_STORE(1 << 1); .... }
NetworkPolicy,控制管理本地缓存,和MemoryPolicy用法一样,有三个可选参数
public enum NetworkPolicy { /** 跳过本地读取 */ NO_CACHE(1 << 0), /** *不进行本地缓存 */ NO_STORE(1 << 1), /** 让Picasso加载图片的时候只从本地读取除非联网正常并且本地找不到资源的情况下. */ OFFLINE(1 << 2); .... }
缓存指示器
setIndicatorsEnabled(true)
就可以查看加载的图片来源于何处,红色:网络,绿色:本地,蓝色:内存
setLoggingEnabled(true)
通过输出日志的方式查看每张网络请求的资源所用时间。