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)基本使用:
首先我们需要配置权限;
可以看到前四个是大家比较熟知的图片加载库,有 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:
相关文章推荐
- Android常用的图片加载库
- Android常用框架--图片加载系列框架
- 【常用开源库】3分钟全面了解Android主流图片加载库
- Android常用的图片加载库
- android 开发中常用的第三方库(图片加载篇——Glide)
- Android第三方框架universal-image-loader[图片缓存加载]及其OOM问题处理【常用】,CardView使用[给列表中项+边框]
- android 高级之旅 (三 )picasso、glide、imageloader等几个常用的图片加载框架
- android 开发中常用的第三方库(图片加载篇)
- 【常用开源库】Android图片加载库:最全面解析Glide用法
- 常用5大 Android网络加载图片组件的优缺点比较---Glide、Fresco、Picasso、android--Volley、UniVersal--image--loader
- 【Android】安卓中常用的图片加载方法
- android 学习四 加载图片
- 实例讲解Android中如何实现图片的异步加载功能
- android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
- Android图片加载机制
- android项目源码异步加载远程图片的小例子
- 演化理解 Android 异步加载图片
- 常用代码片段(一) - 加载网络图片
- Android实现ListView异步加载图片
- android WebView 控件加载本地sdcard中html文件图片的问题