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

Android -- 图片加载常用库

2016-11-05 10:07 155 查看
Android开源项目推荐之「图片加载到底哪家强」

可以看到前四个是大家比较熟知的图片加载库,有 UniversalImageLoader、Picasso、Fresco、Glide,

至于第五个 ion 其实是一个网络库,只不过也提供了图片加载的功能,跟 Volley 类似,也提供图片加载的功能,

但是如果图片加载是一个强需求的话,我更喜欢专注的库,所以本文只
4000
讨论单纯的图片加载库。

我相信大家很纠结到底该选择哪一个呢?貌似它们在GitHub上都有自己的一席之地,Star 数都蛮高的,确实很难抉择,

那么今天我就来给大家分析下,图片加载到底该怎么选择!

①UniversalImageLoader:

https://github.com/nostra13/Android-Universal-Image-Loader

UIL可以算是老牌最火的图片加载库了,使用过这个开源库的项目可以说是多的令人发指,

即使到现在 GitHub 上他的 Star 数仍然是众多图片加载库最多的。

可惜的是该作者在项目中说明,从去年的9月份,他就已经停止了对该项目的维护。

这就意味着以后任何的 bug 都不会修复,任何的新特性都不会再继续开发,所以毫无疑问 UIL 不推荐在项目中使用了。

②Picasso:

https://github.com/square/picasso

Picasso 是 Square 公司的大作,名字起的也这么文艺,叫「毕加索」,意为加载图片就像画画一样,是一门艺术。

这个库是我之前一直很喜欢的,因为他不仅具备图片加载应有尽有的强大功能,他的调用也是如此简洁文艺:

Picasso.with(context).load(“http://i.imgur.com/DvpvklR.png“).into(imageView);

以上代码就是给一个 ImageView 加载远程图片的一个示例,是不是很简洁?

当然不止如此,他还提供更多的用法,足以满足你实际项目中的各种需求,具体这些用法本文就不提了,

可以去官网自行研究。

③Glide

https://github.com/bumptech/glide

Glide 是 Google一位员工的大作,他完全是基于 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 不支持该特性。

除此之外,还有很多其他配置选项的增加。

总体来说,Glide 是在 Picasso 基础之上进行的二次开发,各个方面做了不少改进,

不过这也导致他的包比 Picasso 大不少,不过也就不到 500k,Picasso 是100多k,

方法数也比 Picasso 多不少,不过毕竟级别还是蛮小的,影响不是很大。

④Fresco

https://github.com/facebook/fresco

Fresco 是 Facebook 出品,他是新一代的图片加载库,我们知道 Android 应用程序可用的内存有限,

经常会因为图片加载导致 OOM,虽然我们有各种手段去优化,尽量减少出现 OOM 的可能性,但是永远没法避免,

尤其某些低端手机 OOM 更是严重。而 Facebook 就另辟蹊径,既然没法在 Java 层处理,

我们就在更底层的 Native 堆做手脚。于是 Fresco 将图片放到一个特别的内存区域叫 Ashmem 区,

就是属于 Native 堆,图片将不再占用 App 的内存,Java 层对此无能为力,这里是属于 C++ 的地盘,

所以能大大的减少 OOM。

所以此库很强大,不过用起来也比较复杂,包也比较大,貌似有2、3M,底层涉及到的 C++ 领域,想读源码也比较困难。

⑤总结对比:

综合来看,毫无疑问 Glide 与 Picasso 之间优先推荐选择 Glide,

尤其是如果你的项目想要支持 Gif 动态图,那更该选择 Glide 。

但是如果你的项目使用了 Square 公司的全家桶,如 Retrofit 或者 OkHttp ,

那么搭配 Picasso 一起使用也不是不可,兼容性可能会更好些,占用体积也会少些。

对于一般的 App 使用 Fresco 未免有些大材小用了,大部分情况 Glide 都能满足你的需求了,

但是如果你的 App 中大量使用图片,比如是类似 Instagram 一类的图片社交 App ,那么推荐使用 Fresco ,

虽然稍复杂,但是还是推荐使用 Fresco ,对提升你 App 的性能与体验有不少帮助,

值得花时间去研究并应用到自己的 App 上来。

一、Picasso下载图片:

(1)官网:http://square.github.io/picasso/ Github: https://github.com/square/picasso

(2)它的特性:

a.自带内存和硬盘二级缓存功能;

b.加载本地资源,资产,sd卡,以及contentProvider里面的图片;

c.解决了图片错位的问题;

d.使用图片压缩尽可能的减少的内存;

e.图形转换操作,如变换大小,旋转,或者自定义转换操作;

(3)基本使用:

首先我们需要配置权限;

A.基本加载方式:
a.网络图片:
//显示网址图片
Picasso.with(this).load(PathUtils.getPicPath()).into(imgShow);

b.资源图片:
Picasso.with(this).load(R.drawable.lede_app_list).into(imgShow);

c.资产图片:
//加载资产中图片
Picasso.with(this).load("file:///android_asset/login_bg.png").into(imgShow);

d.sd卡图片:
Picasso.with(this).load(new File("/sdcard/20160318160906384.png")).into(imgShow);

B.设置图片占位:
Picasso设置图片下载前和下载失败的图片,在出错的图片设置前都会尝试3次请求,
3次失败之后会显示错误图片。

Picasso.with(this)
.load(R.drawable.lede_app_list)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.into(imgShow);
-----------------------------------
C.无淡入淡出效果:
.noFade()

D.图片重新调整大小:
重新调整大小,以便更好的适配布局,减少存储空间;

.resize(100,100)
.resizeDimen()   //加载资源dimen里面定义的值
.resizeDimen(R.dimen.width,R.dimen.height)

E.图片旋转:

rotate(90)

F.设置图片格式:
可以使用RGB_565来节省内存,默认情况下是RGB_8888的图片格式;

.config(Bitmap.Config.RGB_565)

G.新进程中查看大图:
点击查看大图的时候往往容易内存溢出,在新的进程中打开的话可以避免这个问题,
只需要在清单文件中设置process属性;

<activity android:name=".BigImageActivity"
android:process=":picture">
</activity>

(4)在Application中的常用设置:

package com.example.jiangqiangwei.mypicassodemo;

import android.app.Application;
import android.graphics.Bitmap;

import com.squareup.picasso.LruCache;
import com.squareup.picasso.Picasso;

/**
* Created by jiangqiangwei on 16/8/4.
* 全局处理参数
*/
public class MyApplication extends Application{
private static MyApplication myApplication;
public Picasso picasso;
@Override
public void onCreate() {
super.onCreate();
myApplication=this;
setPicassoConfig();
}

private void setPicassoConfig() {
//设置picasso加载参数
picasso=new Picasso.Builder(this)
//设置内存缓存大小
.memoryCache(new LruCache(10<<20))
//设置图片显示格式
.defaultBitmapConfig(Bitmap.Config.RGB_565)
//设置下载器UrlConnectionDownloader
//使用OkHttp,同时设置磁盘缓存和位置大小
//.downloader(new UrlConnectionDownloader(myApplication))
//可以设置下载图片用的工具
//.downloader(new OkHttpDownloader(this.getCacheDir(),10<<20))
//设置图片左上角的标记
//红色:代表从网络下载的图片
//蓝色:代表从磁盘缓存中加载图片
//绿色:代表从内存中加载图片
//设置调试模式
.indicatorsEnabled(true)
.build();
Picasso.setSingletonInstance(picasso);
}
}

一、Glide下载图片:

(1)基本使用:

A).先导包;

B).DrawableRequestBuilder常用设置方法;

C).
a.网络图片:
//显示网址图片
Glide.with(this).load(PathUtils.getPicPath()).into(imgShow);

b.资源图片:
Glide.with(this).load(R.drawable.lede_app_list).into(imgShow);

c.资产图片:
//加载资产中图片
Glide.with(this).load("file:///android_asset/login_bg.png").into(imgShow);

d.sd卡图片:
Glide.with(this).load(new File("/sdcard/20160318160906384.png")).into(imgShow);

D).设置图片占位:

Glide.with(this)
.load(R.drawable.lede_app_list)
.placeholder(R.mipmap.ic_launcher)
.error(R.mipmap.ic_launcher)
.into(imgShow);

E).淡入淡出:
crossFade()

F).不添加动画:
.dontAnimate()

G).图片重新调整大小:
.override(100,100)

(二)Glide高级用法以及性能优化:

A)设置网络访问库:

B)监听加载进度:

C)自定义缓存:

D)清除缓存:

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