1. 写在前面
本文主要来自Picasso的官方文档的翻译,地址为:http://square.github.io/picasso/,然后自己进行了学习和实践加简单封装(PS:其实这个封装是功能的封装,没有多大的意义,因为人家Picasso已经封装的很好了,行此一举无非是熟悉它的功能罢了!),内容仅供参考,不足之处望请指正。
此外,个人比较喜欢英语,虽然不是专业的高手、只有六级水平;但是凭借一颗爱好英语的心,应该能翻的八九不离十,因为还是有【实践】撑腰的嘛!再者作为一个程序猿阅读外文的技术文档是少不了的,为此刚开始的翻译应从从简单的技术文档着手,虽然Picasso大家已经非常熟悉了(因为问世挺久的了),但难免有像我一样刚接触不久的,或是将来需要接触的同行们,能为他们提供一点点帮助也是笔者莫大的荣幸。
2.正文: Picasso — 一个强大的Android图片下载和缓存库
1.简介
只需要给您的Android应用程序添加必要的【上下文环境】和【视觉图像】,Picasso就能让你非常轻松的能把图片加载到你的App上———通常一行代码就能搞定!
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
在Android里许多图片加载中遇到的异常都是由Picasso自动处理的,比如:
- 在你的adapter适配器中自动处理ImageView组件上图片资源的回收和加载。
- 在尽可能小的内存消耗下使用复杂的图像转换。
- 自动进行内存和磁盘的缓存。
2.特征功能点
(1)在adapter适配器中的加载图片:
adapter的的复用是由Picasso自动检测的并且会自动取消上一次的加载。(PS:我们一般会使用ListView/GridView/RecycleView等等去显示一些信息,一般是在adapter中会有加载图片的需求,其实核心代码就一行,也是最简单的加载方式,不做任何操作的默认加载。)
@Override public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(context);
}
String url = getItem(position);
//【核心代码】
Picasso.with(context).load(url).into(view);
}
(2.1)图像变换
变换图像以便更好地适应你的布局和减少内存消耗。(即:指定目标资源宽高来进行图像变换)
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
(2.2)您还可以通过制定自定义的变换或裁剪来达到更完美的适应效果。
(PS:下面的代码功能是裁剪成了正方形)
public class CropSquareTransformation implements Transformation {
@Override public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
if (result != source) {
source.recycle();
}
return result;
}
@Override public String key() { return "square()"; }
}
(3)占位符(图片)
Picasso同时支持下载未完成和下载错误两种占位符供用户进行选择。(即:无论加载是否成功都有一张备用的图片显示出来,不会太尴尬。)
Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
**重点内容**PS:一次图片的加载如果失败的话,会有三次机会重新再尝试,三次都失败的话,占位图片就会被显示出来。
(4)资源的加载
Picasso不仅仅可以加载网上的资源,Resources, assets, files, content providers都可以作为图片的资源,比如:
Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2);
Picasso.with(context).load(new File(...)).into(imageView3);
(5)调试指示器
为了开发的方便的话,你可以开始指示器显示一个颜色功能区(在图片的左上角),这个功能区会告诉你图片的来源是【网络(红色】)、【磁盘(蓝色)】亦或是【内存(绿色)】。再创建Piacsso的实例之后,就可以调用setIndicatorsEnabled(true)这个方法来实现这个小功能。
Picasso picasso = Picasso.with(this);
//开启指示器
picasso.setIndicatorsEnabled(true);
Picasso.with(context).load(R.drawable.landing_screen).into(imageView4);
3.下载
最新jar包的下载地址:picasso-2.5.2.jar
Picasso的源代码、它的例子Demo以及这个网站网址都可以在Github上获取到。
Maven
<dependency>
<groupId>com.squareup.picasso</groupId>
<artifactId>picasso</artifactId>
<version>(insert latest version)</version>
</dependency>
Gradle
compile 'com.squareup.picasso:picasso:(insert latest version)'
3.简单封装
PS:其实这个封装是功能的封装,没有多大的意义,因为人家Picasso已经封装的很好了,行此一举无非是熟悉它的功能罢了!
public class PicassoUtils {
/**
* (1)不做任何修改去加载图片
*
* @param context 上下文环境
* @param url 网络图片资源url
* @param imageView 需要被用来显示的ImageView控件
*/
public static void defaultLoadedImage(Context context, String url, ImageView imageView) {
Picasso.with(context)
.load(url).
into(imageView);
}
/**
* (2.1)指定目标资源宽高的图像变换
*
* @param context 上下文环境
* @param url 网络图片资源url
* @param width 目标资源的宽
* @param height目标资源的高
* @param imageView 需要被用来显示的ImageView控件
*/
public static void specifyWidthAndHeightLoadImage(Context context, String url, int width, int height, ImageView imageView) {
Picasso.with(context)
.load(url)
.resize(width, height)
.centerCrop()
.into(imageView);
}
/**
* (2.2)通过制定自定义的变换或裁剪
*
* @param context 上下文环境
* @param url 网络图片资源url
* @param imageView 需要被用来显示的ImageView控件
*/
public static void diyLoadedImage(Context context, String url, ImageView imageView) {
Picasso.with(context)
.load(url)
.transform(new CropSquareTransformation())
.into(imageView);
}
/**
* 裁剪成了矩形(这里是正方形)
*/
public static class CropSquareTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());//尺寸取图片长宽的最小值
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
//Bitmap source, int x, int y, int width, int height (可以自己调整的宽高)
Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
if (result != source) {
source.recycle();
}
return result;
}
@Override
public String key() {
return "square()";
}
}
/**
* (3)带有占位图片方式去加载图片
*
* @param context 上下文环境
* @param url 网络图片资源url
* @param correctImage 加载成功时显示的图片
* @param errorImage 加载失败时显示的图片
* @param imageView需要被用来显示的ImageView控件
*/
public static void loadImageWithPlaceHolder(Context context, String url, int correctImage, int errorImage, ImageView imageView) {
Picasso.with(context)
.load(url)
.placeholder(correctImage)
.error(errorImage)
.into(imageView);
}
/**
* (4)是否打开调式指示器
*
* @param context 上下文环境
* @param open 是否打开,true:打开;false:关闭
*/
public static void isOpenIndicators(Context context, boolean open) {
Picasso picasso = Picasso.with(context);
picasso.setIndicatorsEnabled(open);
}
}