频道栏目
首页 > 资讯 > 其他 > 正文

Picasso的简单实用

17-06-14        来源:[db:作者]  
收藏   我要投稿

Picasso的简单实用。

1.添加依赖

compile 'com.squareup.picasso:picasso:2.5.2'

2.加载图片

通过源码可以发现load方法主要要以下几种重载

load(Uri uri)

load(String path)

load(File file)

load(int resourceId)

//定义一张网络图片的uri,其实就是上面的测试图片

private static final String imageUrl = "imageMogr2/auto-orient/strip%7CimageView2/2/w/1240";

ImageView imageView = (ImageView) findViewById(R.id.imageView);

//从网络加载图片

Picasso.with(this).load(Uri.parse(imageUrl)).into(imageView);

Picasso.with(this).load(imageUrl).into(imageView);

//从res资源文件中加载图片

Picasso.with(this).load(R.mipmap.default_image).into(imageView);

2 加载过程中显示默认图片placeholder

Picasso.with(this).load(imageUrl).placeholder(R.mipmap.default_image).into(imageView);

一般网络加载图片耗时比较长,所以会先默认显示一张替代的图片,只支持resId和Drawable本地图片。

3 加载失败后显示错误的图片

Picasso.with(this).load(imageUrl+"landptf").error(R.mipmap.default_image).into(imageView);

为了显示错误图片,这里面我在正确的地址后面拼了字符串构造了一个错误的地址,同样只支持本地的图片

4 图片填充方式

4.1 fit()

Picasso.with(this).load(imageUrl).fit().into(imageView);

该属性会根据Image View的大小充满整个View,不考虑比例,可能造成图片的拉伸或者缩小

4.2 centerCrop()

Picasso.with(this).load(imageUrl).resize(320, 640).centerCrop().into(imageView);

按比例裁减图片,使其居中显示,充满View,会造成图片显示不全,必须与resize方法同时使用

4.3 centerInside()

Picasso.with(this).load(imageUrl).resize(320, 640).centerInside().into(imageView);

按比例裁减图片,图片可以完全显示,但如果图片比View小,则无法充满整个View,必须与resize方法同时使用

4.4 onlyScaleDown()

Picasso.with(this).load(imageUrl).resize(1240, 1563).onlyScaleDown().into(imageView);

这里面使用的测试图片的大小是1240*1563,如果resize的宽高大于图片的原始宽高,则resize不起作用,采用图片原始宽高显示。

5 取消图片的过渡显示效果noFade()

Picasso.with(this).load(imageUrl).noFade().into(imageView);

默认情况下图片显示出来都会有一个过渡的效果,添加.noFade方法后,可以使该取消该效果,基本上很少使用

6 图片旋转rotate()

//以(0,0)为中心顺时针旋转45度

Picasso.with(this).load(imageUrl).rotate(45).into(imageView);

//以(64,64)为中心顺时针旋转45度

Picasso.with(this).load(imageUrl).rotate(45, 64, 64).into(imageView);

7 缓存策略

Picasso提供缓存的调试方法,通过如下代码可设置

Picasso.with(this).setIndicatorsEnabled(true)

可以看到图片的左上角有个蓝色的三角形,表示该图片是从磁盘加载的,另外如果为红色则表示从网络加载,如果为绿色表示从内存加载。

Picasso的缓存流程是先检查内存是否有保存该图片,如果没有则检查磁盘是否有保存该图片,如果没有则从网络下载,下载成功之后分别保存到内存和磁盘上各一份,如果我们有时候不想缓存该图片或者不想从缓存获取图片,该如何呢?Picasso也给我买提供了相应的控制方法。

Picasso.with(this)

.load(imageUrl)

.skipMemoryCache()

.into(imageView);

Picasso.with(this)

.load(imageUrl)

.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

.into(imageView);

上面两个方法完全等价,但是第一种写法官方已经不推荐使用了,这里面列出来只是让大家了解一下。

这个表示什么意思呢?跳过从内存加载图片,并且图片下载之后也不在内存中进行缓存。

也就是图片的左上角的标识永远不可能为绿色。

MemoryPolicy.NO_CACHE:直接跳过检查内存是否有缓存该图片

MemoryPolicy.NO_STORE:图片下载之后不在内存中进行缓存

Picasso.with(this)

.load(imageUrl)

.networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)

.into(imageView);

同理该方法表示跳过从磁盘加载图片,并且图片下载之后也不在磁盘中进行缓存。

这里注意只是不在磁盘中缓存,但是会在内存中缓存,因此若内存和磁盘中都不想缓存则需要和 两个方法共同使用,如下:

Picasso.with(this)

.load(imageUrl)

.networkPolicy(NetworkPolicy.NO_CACHE, NetworkPolicy.NO_STORE)

.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)

.into(imageView);

NetworkPolicy枚举中还有一个值OFFLINE,这个表示强制从缓存中取,不会发起网络请求,如 果缓存中没有也不会从网络中请求。

8 优先级priority

设想一种场景,当我们打开一个界面的时候,界面上有列表,每个列表项都有图片需要加载,列表上面还有一张图片需要提前加载,那么怎样来调度每个请求的优先级呢?

Picasso给我们提供了priority方法来管理请求的优先级

public enum Priority {

LOW,

NORMAL,

HIGH

}

通过priority方法的注释中可以知道默认的优先级是NORMAL,因此我们可以如下实现高优先级加载:

Picasso.with(this)

.load(imageUrl)

.priority(Picasso.Priority.HIGH)

.into(imageView);

9 tag标签管理

使用过list加载图片的童鞋都知道在列表滚动过程中停止加载图片,停止滚动时恢复图片加载,那么这样的功能在Picasso中时如何实现的呢?

这就用到了tag标签的功能

通过如下代码设置tag:

Picasso.with(this).load(imageUrl).tag("landptf").into(imageView);

在Picasso类中提供了如下几个方法来控制tag

cancelTag(Object tag)

pauseTag(Object tag)

resumeTag(Object tag)

通过名字可以很好理解了,我们在列表滚动的时候调用

Picasso.with(this).pauseTag("landptf");

在停止滚动的时候调用

Picasso.with(this).resumeTag("landptf");

至于cancelTag用于取消下载,一般我们在Activity销毁的时候将未完成的请求取消。

Picasso.with(this).cancelTag("landptf");

10 手动指定key值stableKey

Picasso.with(this).load(imageUrl).stableKey("landptf").into(imageView);

我们猜想一个问题,Picasso是如何知道是否有缓存图片的,一般根据key值来判断,那么这个key值又是如何生成的呢?通过阅读源码可以知道,根据传入的uri或者resourceId,是否设置了旋转角度,是否设置了resize,或者是centerCrop还是centerInside等拼接出来的字符串,这里面我们可以通过stableKey方法来替换传入的uri或者resourceId生成key值。

1 提供内存和磁盘缓存,默认开启,可以设置不进行缓存

2 图片加载过程中默认显示的图片

3 图片加载失败或出错后显示的图片

4 图片加载成功或失败的回调

5 自定义图片大小、自动测量ImageView大小、裁剪、旋转图片等

6 对图片进行转换

7 标签管理,暂停和恢复图片加载

8 请求优先级管理

9 可以从不同来源加载图片,网络、Resources、assets、files、content providers

10 更加丰富的扩展功能

相关TAG标签
上一篇:Glide加载图片的简单实用
下一篇:kotlin学习一(环境搭建)
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站