您的位置:首页 > 移动开发 > Android开发

快速上手Picasso,玩转Android图像加载

2018-01-23 23:45 477 查看

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)

a4da
.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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: