Android Bitmap深入介绍(三)--- 开源加载框架简述

流行框架

目前使用非常广泛的框架技术主要有Android Universal Image Loader,Picasso, Glide和Fresco,最开始出现的应该算是UIL(Universal Image Loader),记得刚开始用图片加载框架的时候,主要就是使用UIL,UIL功能丰富。Picasso是Square搞出来的,Glide与Picasso比较类似,Google推荐Glide,Fresco是Facebook推出的一个图片加载库,这个库非常值得一看,里面有很多很有特色的地方,非常强大的一个开源库。除此之外Volley也是一个很好的图片加载框架,非常轻量。

基本框架

这些框架基本都可以分成这么几个部分:执行引擎(Engine,或者说调度中心),请求生成部分,缓存部分,图片处理部分,图片显示部分。这基本涵盖了图片从网络或本地获取过来,显示给用户的整个流程。

比较

关于他们之间的比较,可以参考Trinea的文章Android 三大图片缓存原理、特性对比,下面简单介绍一下他们的优缺点:

  • Android-Universal-Image-Loader: 是最早的图片加载库,应用也最广泛,功能非常丰富。它支持下载监听,提供了很多缓存算法,可以在滚动中暂停加载
  • Picasso:
    Square推出的开源库,它支持图片缓存监控,按照优先级来加载图片
  • Glide
    Google推荐的图片加载开源库,支持gif(利用的是第三方包),webp,缩略图,video。提供了接口让用户使用自己需要的网络协议栈。另外一方面,Glide可以与Activity/Fragment的周期保持一致,并且提供了trimMemory供使用。
  • Fresco
    facebook 推出的图片加载开源库,功能非常强大。主要有内存管理,渐进式加载,webp格式,gif,pipeline加载。

相关源码分析文章

网络上面关于这些图片开源框架的源码分析还是挺多的,不过这些源码分析一般都仅供参考辅助,如果自己需要了解这些源码的内容,最好自己亲自去看看源码。

Android-Universal-Image-Loader: Android Universal Image Loader 源码分析

Picasso: http://blog.happyhls.me/category/android/picasso/
http://skykai521.github.io/2016/02/25/Picasso%E6%BA%90%E4%BB%A3%E7%A0%81%E5%88%86%E6%9E%90/

Glide: Android Glide源码解析

Fresco: Fresco-Source-Analysis

相关特性

gif

目前Glide和Fresco都支持gif。对于gif,Fresco的处理跟我们对gif的理解是一致的,先将gif的所有帧解码出来,然后使用动画一帧一帧地放。具体是通过变化Drawable的绘制,每次绘制的时候,绘制对应的一帧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private boolean renderFrame(
Canvas canvas,
int frameNumber,
int frameMonotonicNumber) {
CloseableReference<Bitmap> bitmapReference =
mAnimatedDrawableBackend.getBitmapForFrame(frameNumber);
if (bitmapReference != null) {
canvas.drawBitmap(bitmapReference.get(), 0f, 0f, mPaint);
if (mLastDrawnFrame != null) {
mLastDrawnFrame.close();
}
if (mIsRunning && frameMonotonicNumber > mLastDrawnFrameMonotonicNumber) {
int droppedFrames = frameMonotonicNumber - mLastDrawnFrameMonotonicNumber - 1;
mAnimatedDrawableDiagnostics.incrementDrawnFrames(1);
mAnimatedDrawableDiagnostics.incrementDroppedFrames(droppedFrames);
if (droppedFrames > 0) {
FLog.v(TAG, "(%s) Dropped %d frames", mLogId, droppedFrames);
}
}
mLastDrawnFrame = bitmapReference;
mLastDrawnFrameNumber = frameNumber;
mLastDrawnFrameMonotonicNumber = frameMonotonicNumber;
FLog.v(TAG, "(%s) Drew frame %d", mLogId, frameNumber);
return true;
}
return false;
}

webp

WebP是google推出的一种新的影像形式,他可以对图片进行有效地压缩又不影响图片的兼容性和实际清晰度,提高图片下载速度,在相同质量它压缩后的体积大概是jpg的40%。但是编码时间大概比jpg的长8倍。目前Facebook跟QQ空间都有使用WebP图片。

渐进加载

这个是Fresco提供的功能,目前只支持jpg网络图片。可以在下图片的时候,让图片逐渐地由模糊变清晰渐渐地显示出来。jpeg格式的图片有两种方式,一种是直接编码的,另外一种是渐进式编码的,能够用于Fresco渐进加载的是要通过渐进式编码的jpeg图片。压缩标准