iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android图片加载利器之Picasso基本用法
  • 851
分享到

Android图片加载利器之Picasso基本用法

picassoAndroid 2022-06-06 04:06:41 851人浏览 独家记忆
摘要

今天开始我们来学习一下Picasso,计划包括以下几方面的内容: 图片加载利器之Picasso进阶 图片加载利器之Picasso源码解析 目前市场上比较流行的图片加载框架主

今天开始我们来学习一下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中Glide加载库的图片缓存配置究极指南android异步加载图片并缓存到本地实现方法Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案Android加载大分辨率图片到手机内存中的实例方法Android关于Glide的使用(高斯模糊、加载监听、圆角图片)Android使用控件ImageView加载图片的方法Android实现加载广告图片和倒计时的开屏布局Android 加载GIF图最佳实践方案android中Glide实现加载图片保存至本地并加载回调监听使用Thumbnails实现图片指定大小压缩


--结束END--

本文标题: Android图片加载利器之Picasso基本用法

本文链接: https://www.lsjlt.com/news/22065.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android图片加载库Glide用法
    目录Glide介绍Android SDK 要求使用前的准备基本用法在 ListView 和 RecyclerView 中的使用占位符选项过渡动画变换效果使用示例Glide介绍 Gli...
    99+
    2024-04-02
  • 如何在Android开发中利用Glide加载图片
    这期内容当中小编将会给大家带来有关如何在Android开发中利用Glide加载图片,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。添加依赖:compile 'com.github.bump...
    99+
    2023-05-31
    glide android roi
  • Android图片加载库Glide用法是什么
    这篇文章主要讲解了“Android图片加载库Glide用法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android图片加载库Glide用法是什么”吧!Glide介绍Glide是一个...
    99+
    2023-06-22
  • Android 图片加载库之Coil的详解与使用
    一、介绍         在Android,资源的呈现主要有三大形式:文字、图片、视频。图片有分为本地资源和网络资源。 网络资源需要通过下载然后绑定到ImageView中。         在前期我们使用的图片加载框架如:picasso、...
    99+
    2023-10-02
    android kotlin Coil
  • Android 之 WebView (网页视图)基本用法
    本节引言 本节给大家带来的是Android中的一个用于显示网页的控件:WebView(网页视图)。 现在Android应用 层开发的方向有两种:客户端开发和HTML5移动端开发! 所谓的HTML5端就是:HTML5 + CSS + ...
    99+
    2023-08-31
    android harmonyos 华为
  • 详解Android GLide图片加载常用几种方法
    目录缓存浅析GLide图片加载方法图片加载周期图片格式(Bitmap,Gif)缓存集成网络框架权限占位符淡入效果变换启动页/广告页banner固定宽高圆角圆形总结缓存浅析 为啥要做缓...
    99+
    2022-11-16
    Android GLide图片加载 Android GLide
  • Android ListView实现ImageLoader图片加载的方法
    本文实例讲述了Android ListView实现ImageLoader图片加载的方法。分享给大家供大家参考,具体如下:最近一直忙着做项目,今天也是忙里偷闲,想写篇博客来巩固下之前在应用中所用的知识。之前我们可能会也会肯定遇到了图片的异步加...
    99+
    2023-05-30
    android listview imageloader
  • Android Flutter利用CustomPaint绘制基本图形的方法
    今天小编给大家分享一下Android Flutter利用CustomPaint绘制基本图形的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获...
    99+
    2023-07-02
  • android中Glide实现加载图片保存至本地并加载回调监听
    Glide 加载图片使用到的两个记录Glide 加载图片保存至本地指定路径 Glide.with(context).load(imgUrl).asBitmap().toBytes().into(new SimpleTarget<...
    99+
    2023-05-30
    glide 加载 回调
  • 利用OpenCV判断是否加载图片的两种方法
    目录OpenCV判断是否加载图片问题【方法一】【方法二】OpenCV图片的加载显示和保存图片的加载与显示图像的保存OpenCV判断是否加载图片问题 OpenCV加载图片是图像处理最基...
    99+
    2022-11-13
    OpenCV判断 判断是否加载图片 OpenCV加载图片
  • Android官推kotlin-first图片加载库Coil的使用方法
    这篇文章给大家分享的是有关Android官推kotlin-first图片加载库Coil的使用方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Coil 是一个非常年轻的图片加载库,在 2020 年 10 月 22...
    99+
    2023-06-14
  • Android中有哪些常用的图片加载库
    Android中有哪些常用的图片加载库?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Universal Image Loader:ImageLoader是比较老的框架,一个强大...
    99+
    2023-05-31
    android 中有 roi
  • 微信小程序加载本地图片的方法
    微信小程序加载本地图片的方法:1、在微信开发工具中打开项目。2、新建一个文件夹并将图片放到这个目录下。3、用style样式的方式或image标签的相对路径去访问图片,实现加载本地图片。具体操作步骤:首先,打开微信开发工具,再打开项目。如下图...
    99+
    2024-04-02
  • vue动态加载本地图片的处理方法
    发现问题 今天遇到一个在vue文件中引入本地图片的问题,于是有了这篇文章。 通常,我们的一个img标签在html中是这么写的: <img src="../imag...
    99+
    2024-04-02
  • Android用RecyclerView实现动态添加本地图片
    本文介绍了Android用RecyclerView实现动态添加本地图片,分享给大家,具体如下:本文所用的多图选择的library来自:https://github.com/lovetuzitong/MultiImageSelector简单介...
    99+
    2023-05-30
    android 动态 添加图片
  • Android 之 GridView(网格视图)的基本使用
    本节引言: 本节给大家介绍的是第二个Adapter类的控件——GridView(网格视图),见名知义,ListView是列表, GridView就是显示网格!他和ListView一样是AbsListView的子类!很多东西和ListVi...
    99+
    2023-09-27
    android
  • Android基于Glide v4.x如何实现图片加载进度监听
    这篇文章主要介绍Android基于Glide v4.x如何实现图片加载进度监听,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Glide是一款优秀的图片加载框架,简单的配置便可以使用起来,为开发者省下了很多的功夫。不过...
    99+
    2023-05-30
    glide android
  • Android开发如何实现webview中img标签加载本地图片
    这篇文章主要介绍Android开发如何实现webview中img标签加载本地图片,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:在网上查了很多教程,感觉很麻烦,各种方法,最后实践很简单,主要是两步:WebSe...
    99+
    2023-05-30
    android webview
  • Android图片加载框架Coil的详细使用总结
    目录简介简单使用高斯模糊圆角圆形灰色变换 GrayscaleTransformationGif监听下载过程取消下载替换 okhttp 实例自定义Coil 源码分析总结简介 Coil ...
    99+
    2024-04-02
  • Glide图片加载框架怎么在Android应用中使用
    这篇文章将为大家详细讲解有关Glide图片加载框架怎么在Android应用中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。简介Glide是一款图片加载框架,可以在Android平台上以简...
    99+
    2023-05-31
    android glide roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作