首先说Picasso,Picasso 是 Square 公司的杰作,名字叫「毕加索,充满文艺气息,意为加载图片就像画画一样,是一门艺术。Picasso 不仅具备加载图片的强大功能,还是如此的简洁。
Picasso默认的缓存分配大小特点:
LRU缓存占应用程序可用内存的15%
本地缓存占到硬盘空间的2%但不超过50M并且不小于5M(前提是这种情况只在4.0以上有效果,或者你能像OKHttp那样提供
一个本地缓存库来支持全平台)
Picasso默认开启3个线程来进行本地与网络之间的访问
Picasso加载图片顺序, 内存–>本地–>网络
github地址:https://github.com/square/picasso
使用实例:
public class PicassoActivity extends AppCompatActivity {
private ImageView mLoadImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loader_img);
mLoadImg = (ImageView) findViewById(R.id.loadImg);
}
//点击事件
public void loadImage(View view) {
// basicLoad(ImageUrls.bigImages[4],mLoadImg);
// loadAndSaveImage(ImageUrls.bigImages[5],mLoadImg);
tranformationImage(ImageUrls.bigImages[6],mLoadImg);
}
//1.picasso的基本用法
private void basicLoad(String url,ImageView iv){
Picasso.with(this) //context
.load(url) //图片加载地址
.placeholder(R.mipmap.ic_launcher) //图片加载中显示的页面
.error(android.R.drawable.ic_menu_delete) //图片记载失败时显示的页面
.noFade() //设置淡入淡出效果
.resize(500,400) //自定义图片加载的大小,会根据你传入的尺寸进行采样
.centerCrop() //图片会被裁剪,但是质量没有影响,等比例放大
// .centerInside() //图片完整展示,不会被压缩或挤压,一般是等比例缩小
// .fit() //智能展示图片,对于图片的大小和imageview的尺寸进行了测量,计算出最佳的大小和最佳的质量显示出来
.into(iv); //需要加载图片的控件
}
//2.Picasso 加载的图片的bitmap对象并且保存到磁盘当中
private void loadAndSaveImage(String imgUrl,ImageView iv){
Picasso.with(this)
.load(imgUrl)
.rotate(90f) //简单的旋转处理,传入的数据大于0度小于360度
.into(target);
}
//Target不能写成匿名内部类形式,垃圾回收器在你获取不到bitmap的引用时,会把他回收
private Target target = new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
//加载成功后,得到bitmap对象,可以对其进行操作
mLoadImg.setImageBitmap(bitmap);
File file = new File(getExternalCacheDir().getAbsolutePath()+File.separator+"picasso.png");
try {
FileOutputStream fos = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG,100,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
};
//3.Picasso可以定制图片的处理
private void tranformationImage(String imgPaht,ImageView iv){
Picasso.with(this)
.load(imgPaht)
.transform(new CircleTransfromation())
.into(iv);
}
}
public class CircleTransfromation implements Transformation{ @Override public Bitmap transform(Bitmap source) { //对于得到的bitmap进行操作 //获取比较小的边作为正方形的边 int size = Math.min(source.getWidth(),source.getHeight()); int x = (source.getWidth()-size)/2; int y = (source.getHeight()-size)/2; Bitmap squareBitmap = Bitmap.createBitmap(source,x,y,size,size); if (squareBitmap!=source){ //说明已经经过裁剪了 source.recycle(); } //把正方形位图作为画布,画圆形 Bitmap bm = Bitmap.createBitmap(size,size,source.getConfig()); Canvas canvas = new Canvas(bm); Paint paint = new Paint(); BitmapShader shader = new BitmapShader(squareBitmap,BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP); paint.setShader(shader); paint.setAntiAlias(true); float radius = size/2f; canvas.drawCircle(radius,radius,radius,paint); squareBitmap.recycle(); return bm; } @Override public String key() { return "circle"; }}
效果:
Google一位员工完成了Glide,Glide是基于 Picasso的,依然有保存了Picasso的简洁风格,但是在此做了大量优化与改进。Glide 默认的 Bitmap 格式是 RGB_565 格式,而Picasso默认的是 ARGB_8888 格式,这个内存开销要小一半。在磁盘缓存方面,Picasso只会缓存原始尺寸的图片,而 Glide 缓存的是多种规格,也就意味着 Glide会根据你ImageView的大小来缓存相应大小的图片尺寸,比如你ImageView大小是200*200,原图是 400*400,而使用Glide 就会缓存 200*200规格的图,而Picasso只会缓存 400*400 规格的。这个改进就会导致 Glide 比 Picasso 加载的速度要快,毕竟少了每次裁剪,重新渲染的过程。令人兴奋的是Glide 支持加载 Gif 动态图,而Picasso不支持该特性。
github地址:https://github.com/bumptech/glide
使用实例:
public class GlideActivity extends AppCompatActivity {
private ImageView mLoadImg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_loader_img);
mLoadImg = (ImageView) findViewById(R.id.loadImg);
}
public void loadImage(View view) {
basicLoad(ImageUrls.newImageUrls[0],mLoadImg);
}
//1.glide的基本用法
private void basicLoad(String imgPath,ImageView iv){
Glide.with(this) //使得glide更容易使用,因为能接收context,activity,fragment对象
.load(imgPath)
// .asGif() //判断加载的url资源是否是gif格式的资源
.priority(Priority.HIGH) //设置优先级
.placeholder(R.mipmap.ic_launcher) //加载中显示的图片
.error(android.R.drawable.ic_menu_delete)//加载失败显示的图片
.centerCrop()
// .fitCenter() //缩放图像,整个显示在控件,尽可能的填满
.into(iv);
}
//2.获取glide加载bitmap的方法,能够显示并存储图片
private void loadAndSaveImage(String url,ImageView iv){
Glide.with(this)
.load(url).asBitmap().into(target);
}
SimpleTarget target = new SimpleTarget<Bitmap>(300,600) {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
mLoadImg.setImageBitmap(resource);
File file = new File(getExternalCacheDir().getAbsolutePath()+File.separator+"glide.png");
try {
FileOutputStream fos = new FileOutputStream(file);
resource.compress(Bitmap.CompressFormat.PNG,100,fos);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
};
}