当前主要的开源图片加载引擎2

来源:互联网 发布:物理层算法实现工程师 编辑:程序博客网 时间:2024/06/05 06:03

Fresco

https://github.com/facebook/fresco

特性:

内存管理

一个没有未压缩的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。

在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。

Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。

图片的渐进式呈现

渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。

Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。

Gif图和WebP格式

是的,支持加载Gif图,支持WebP格式。

图像的呈现

Fresco 的 Drawees 设计,带来一些有用的特性:

  • 自定义居中焦点(对人脸等图片显示非常有帮助)
  • 圆角图,当然圆圈也行。
  • 下载失败之后,点击重现下载
  • 自定义占位图,自定义overlay, 或者进度条
  • 指定用户按压时的overlay

图像的加载

Fresco 的 image pipeline 设计,允许用户在多方面控制图片的加载:

  • 为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片
  • 先显示一个低解析度的图片,等高清图下载完之后再显示高清图
  • 加载完成回调通知
  • 对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图
  • 缩放或者旋转图片
  • 处理已下载的图片
  • WebP 支持

初始化:

Fresco.initialize(context);

可配置项:

Fresco框架有两大部分组成,负责图片展示的Drawee,和负责数据获得的Image PipeLine。

Drawee相关:

设置要加载的图--除了需要加载的图片是真正必须的,其他的都是可选的。如前所述,图片可以来自多个地方。所需加载的图片实际是DraweeController的一个属性,而不是DraweeHierarchy的属性。可使用setImageURI方法或者通过设置DraweeController 来进行设置。对于要加载的图片,除了可以设置缩放类型外,DraweeHierarchy 还公开出一些其他方法用来控制显示效果:
focus point (居中焦点, 用于focusCrop缩放模式)
color filter
默认的缩放类型是: centerCrop

占位图(Placeholder)--在调用setController 或者 setImageURI 之后,占位图开始显示,直到图片加载完成。对于渐进式格式的JPEG图片,占位图会显示直到满足已加载的图片解析度到达设定值。

XML 中属性值: placeholderImage
Hierarchy builder中的方法: setPlaceholderImage
Hierarchy method: setPlaceholderImage
默认值: a transparent ColorDrawable
默认缩放类型: centerInside


设置加载失败占位图--如果URI是无效的,或者下载过程中网络不可用,将会导致加载失败。当加载图片出错时,你可以设置一个出错提示图片。
XML 中属性值: failureImage
Hierarchy builder中的方法: setFailureImage
默认值: The placeholder image
默认缩放类型: centerInside


点击重新加载图--在加载失败时,可以设置点击重新加载。这时提供一个图片,加载失败时,会显示这个图片(而不是失败提示图片),提示用户点击重试。在ControllerBuilder 中如下设置:.setTapToRetryEnabled(true)加载失败时,image pipeline 会重试四次;如果还是加载失败,则显示加载失败提示图片。
XML 中属性值: retryImage
Hierarchy builder中的方法: setRetryImage
默认值: The placeholder image
默认缩放类型: centerInside


显示一个进度条--设置一个进度条图片,提示用户正在加载。目前,进度条仅仅是提示正在loading,和加载进度无关。
XML 中属性值: progressBarImage
Hierarchy builder中的方法: setProgressBarImage
默认值: None
默认缩放类型: centerInside

背景--背景图会最先绘制,在XML中只可以指定一个背景图,但是在JAVA代码中,可以指定多个背景图。当指定一个背景图列表的时候,列表中的第一项会被首先绘制,绘制在最下层,然后依次往上绘制。背景图片不支持缩放类型,会被强制到Drawee尺寸大小。
XML 中属性值: backgroundImage
Hierarchy builder中的方法: setBackground, setBackgrounds
默认值: None
默认缩放类型: N/A


设置叠加图(Overlay)--叠加图会最后被绘制。和背景图一样,XML中只可以指定一个,如果想指定多个,可以通过JAVA代码实现。当指定的叠加图是一个列表的时候,列表第一个元素会被先绘制,最后一个元素最后被绘制到最上层。同样的,不支持各种缩放类型。
XML 中属性值: overlayImage
Hierarchy builder中的方法: setOverlay, setOverlays
默认值: None
默认缩放类型: N/A

设置按压状态下的叠加图--同样不支持缩放,用户按压DraweeView时呈现。
XML 中属性值: pressedStateOverlayImage
Hierarchy builder中的方法: setPressedStateOverlay
默认值: None
默认缩放类型: N/A

ImagePipeline相关:

ImagePipelineConfig config = ImagePipelineConfig.newBuilder()
    .setBitmapMemoryCacheParamsSupplier(bitmapCacheParamsSupplier)
    .setCacheKeyFactory(cacheKeyFactory)
    .setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)
    .setExecutorSupplier(executorSupplier)
    .setImageCacheStatsTracker(imageCacheStatsTracker)
    .setMainDiskCacheConfig(mainDiskCacheConfig)
    .setMemoryTrimmableRegistry(memoryTrimmableRegistry) 
    .setNetworkFetchProducer(networkFetchProducer)
    .setPoolFactory(poolFactory)
    .setProgressiveJpegConfig(progressiveJpegConfig)
    .setRequestListeners(requestListeners)
    .setSmallImageDiskCacheConfig(smallImageDiskCacheConfig)
    .build();

线程池
Image pipeline 默认有3个线程池:3个线程用于网络下载;两个线程用于磁盘操作: 本地文件的读取,磁盘缓存操作。
;两个线程用于CPU相关的操作: 解码,转换,以及后处理等后台操作。;对于网络下载,你可以定制网络层的操作,具体参考:自定义网络层加载.对于其他操作,如果要改变他们的行为,传入一个ExecutorSupplier即可。


内存缓存的配置
内存缓存和未解码的内存缓存的配置由一个Supplier控制,这个Supplier返回一个MemoryCacheParams 对象用于内存状态控制。


配置磁盘缓存
你可使用Builder模式创建一个 DiskCacheConfig:

DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder()
    .set....
    .set....
    .build()


// when building ImagePipelineConfig
.setMainDiskCacheConfig(diskCacheConfig)
缓存统计
如果你想统计缓存的命中率,你可以实现ImageCacheStatsTracker, 在这个类中,每个缓存时间都有回调通知,基于这些事件,可以实现缓存的计数和统计.

使用:

在xml布局文件中, 加入命名空间:


<!-- 其他元素 -->
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto">
加入SimpleDraweeView:


<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/my_image_view"
    android:layout_width="20dp"
    android:layout_height="20dp"
    fresco:placeholderImage="@drawable/my_drawable"
  />
开始加载图片


draweeView.setImageURI("http://site.com/uri");
0 0
原创粉丝点击