Android图片加载利器之Picasso基本用法
发布时间 - 2026-01-11 00:12:05 点击率:次今天开始我们来学习一下Picasso,计划包括以下几方面的内容:

图片加载利器之Picasso进阶
图片加载利器之Picasso源码解析
目前市场上比较流行的图片加载框架主要有UniversalImageLoader,Picasso,Glide,Fresco。
下面简单介绍一下这几个框架:
UniversalImageLoader:这个可以说是非常非常经典的一个了,相信每个app的开发人员都使用过,只可惜作者已经停止该项目的维护了,所以不太推荐使用。
Picasso:是Square公司出品的图片加载框架,Square出品必出精品,主要特点就是使用简单,扩展性强,支持各种来源的图片,包括网络、Resources、assets、files、content providers等。内部集成了OkHttp的网络框架,所以如果你的项目中使用了Square公司的其他框架,那么推荐使用Picasso,兼容性会好一些。目前在Github上的Star已经达到12758个。
Glide:是Google员工的开源项目,基于Picasso的一个框架,代码风格与Picasso非常相似,增加了更多的功能,非常重要的就是支持gif,当然它的包会大一些。如果你的项目对图片的使用场景非常多,并且需要支持gif,则推荐使用。目前在Github上的Star已经达到13636个。
Fresco:是FB出品的开源框架,比较新,最大的优点就是在内存占用上的优化,极大的减少了OOM,功能上也包含了以上三种框架的功能,但是也带来了一个比较明显的缺点就是太大了,所以推荐使用在完全是做图片相关的app上,否则Picasso和Glide就完全够用了。目前在Github上的Star已经达到11983个。
上面主要对各种框架做个简单的介绍,既然是讲解Picasso的,那么接下来看看Picasso都有哪些功能。
1 提供内存和磁盘缓存,默认开启,可以设置不进行缓存
2 图片加载过程中默认显示的图片
3 图片加载失败或出错后显示的图片
4 图片加载成功或失败的回调
5 自定义图片大小、自动测量ImageView大小、裁剪、旋转图片等
6 对图片进行转换
7 标签管理,暂停和恢复图片加载
8 请求优先级管理
9 可以从不同来源加载图片,网络、Resources、assets、files、content providers
10 更加丰富的扩展功能
以上这些功能将会在下面的文章中进行详细讲解。
上面我们提到了Picasso的诸多功能,下面我们来分别演示一下这些功能
配置:
在build.gradle中添加引用
dependencies {
...
compile 'com.squareup.picasso:picasso:2.5.2'
...
}
1 加载图片
通过源码可以发现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值。
好了,这篇文章就讲到这里了,在下一篇文章中我们将会继续学习Picasso的更高级的用法,通过扩展实现更加丰富的功能。
# Android
# 图片加载
# Picasso
# 详解Android GLide图片加载常用几种方法
# Android图片加载框架Coil的详细使用总结
# Android 官推 kotlin-first 的图片加载库——Coil的使用入门
# Android编程图片加载类ImageLoader定义与用法实例分析
# Android基于Glide v4.x的图片加载进度监听
# Android ListView实现ImageLoader图片加载的方法
# Android中RecyclerView 滑动时图片加载的优化
# Android图片加载框架Glide的基本用法介绍
# 如何在Android中高效管理图片加载
# 加载
# 这里面
# 推荐使用
# 方法来
# 跳过
# 过程中
# 将会
# 我们可以
# 如果没有
# 使用过
# 开源
# 按比例
# 顺时针
# 进阶
# 角形
# 几个
# 使用了
# 也不
# 都有
# 很好
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何使用模型观察者?(Observer代码示例)
如何快速搭建虚拟主机网站?新手必看指南
常州企业网站制作公司,全国继续教育网怎么登录?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
如何在建站之星绑定自定义域名?
做企业网站制作流程,企业网站制作基本流程有哪些?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何用腾讯建站主机快速创建免费网站?
油猴 教程,油猴搜脚本为什么会网页无法显示?
无锡营销型网站制作公司,无锡网选车牌流程?
Android GridView 滑动条设置一直显示状态(推荐)
Laravel如何升级到最新版本?(升级指南和步骤)
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
如何将凡科建站内容保存为本地文件?
Laravel如何实现API版本控制_Laravel API版本化路由设计策略
Android使用GridView实现日历的简单功能
Laravel如何使用Vite进行前端资源打包?(配置示例)
如何获取免费开源的自助建站系统源码?
手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?
Laravel集合Collection怎么用_Laravel集合常用函数详解
如何在不使用负向后查找的情况下匹配特定条件前的换行符
香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Laravel如何创建自定义中间件?(Middleware代码示例)
bing浏览器学术搜索入口_bing学术文献检索地址
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
韩国服务器如何优化跨境访问实现高效连接?
高端网站建设与定制开发一站式解决方案 中企动力
Laravel怎么实现微信登录_Laravel Socialite第三方登录集成
北京的网站制作公司有哪些,哪个视频网站最好?
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
如何在企业微信快速生成手机电脑官网?
如何在阿里云高效完成企业建站全流程?
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
原生JS实现图片轮播切换效果
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
5种Android数据存储方式汇总
Laravel如何处理异常和错误?(Handler示例)
PythonWeb开发入门教程_Flask快速构建Web应用
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel如何使用Livewire构建动态组件?(入门代码)
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
JavaScript如何实现音频处理_Web Audio API如何工作?
js代码实现下拉菜单【推荐】
图册素材网站设计制作软件,图册的导出方式有几种?

