知识框架(脑图)
Picasso脑图出现背景
- 多图加载和性能之间的平衡
- 考虑网络请求、缓存和开发效率
解决思路
封装网络请求、图片加载和缓存,提供链式编程,一行搞定图片加载
优点:
-
在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。
-
使用复杂的图片压缩转换来尽可能的减少内存消耗
-
自带内存和硬盘二级缓存功能
具体步骤
(1)引入依赖库
compile 'com.squareup.picasso:picasso:2.5.2'
(2)提供上下文、图片url和ImageView,一行搞定
Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
(3)进阶:图片转换
Picasso.with(context)
.load(url)
.resize(50, 50)
.centerCrop()
.into(imageView)
还可以自定义转换器,然后传递该实例到transform方法
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.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
error placeholder会在请求三次后才显示
(4)进阶:加载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)进阶:开启调试用的指示器
setIndicatorsEnabled(true);
红色代表Network,蓝色代表Disk,绿色代表Memory
调试用的指示器Q&A
问题1:Picasso相比于Volley有什么优点?
专注于图片加载、缓存,可以加载任何渠道的图片,提供链式编程,一行代码搞定图片加载;相比之下Volley提供的是一种通用的解决方案,不仅仅是加载图片
网友评论