Fresco中setFirstAvailableImageRequests其他情况

Fresco是三个无敌的图纸加载库,想必作者等码农都有使用过和询问,fresco官网。在此之前app端做过这么三个优化依照顾客手提式有线电话机的互联网情状加载对应的清晰度的图纸,一来是升格客商体验加载快,二来节省顾客的流量毕竟大家的国外顾客流量很贵的。然后效率大家兑现了,差别互联网景况恳求例外的图片对应差异的U安德拉L。
--在此基础上领导提议个新须要,当在流量景况下一旦有Wi-Fi高清图片的缓存,就利用高清缓存的图片,不再去央求低分辨率的图纸。fresco的三级缓存战略的前提条件是独一的UTiguanL分明某一张图片。而官员的渴求想当如U奥德赛L_a的伸手使用ULacrosseL_b的缓存。

这两日修改公司外界项目时,开采对方在类型中运用了fresco,正好趁那些机遇,对fresco举办一次详细的梳理。

尝试一:setFirstAvailableImageRequests 方式。

翻开fresco文书档案发掘有【多图央求及图片复用】介绍,里面的【加载最初可用的图】小段讲的细节例是图表上传,本地图片和互连网下载图片采用该办法,大家的景色这一个就如能够也适用。

      Uri uri1, uri2;
      ImageRequest request1 = ImageRequest.fromUri(uri1);
      ImageRequest request2 = ImageRequest.fromUri(uri2);
      ImageRequest[] requests = { request1, request2 };

     DraweeController controller = Fresco.newDraweeControllerBuilder()
    .setFirstAvailableImageRequests(requests)
    .setOldController(mSimpleDraweeView.getController())
    .build();
    mSimpleDraweeView.setController(controller);

可实际本人断点测验的结果实际不是文书档案所讲,有小可能率会会到达梦想洗过。可基本上时候是先使用request1恳求的图样,及时是有request2的缓存图片,request1须要网络乞求下载图片的。

fresco约等于五个单身的图样管家,使用它今后您就不要再去关爱图片的加载和出示难点,那几个繁琐的事情fresco都会自动帮您化解还应该有正是在动图加载中,加载Gif图和WebP动图在别的三个Android开垦者眼里看来都以一件十二分胃痛的专业。每一帧都以一张一点都不小的Bitmap,每八个卡通皆有大多帧。Fresco让你从未那个忧虑,它处理好每一帧并保管好您的内部存款和储蓄器。
fresco官网:http://www.fresco-cn.org/

品味二:代码中推断是或不是存在Wi-Fi高清图片缓存。
      if (NetWorkHelper.netWorkState != NetWorkHelper.kNetWorkWIFI && PreferenceUtil.getBool(App.getInstance(), PreferenceUtil.BOOL_NETWORK_GETING_IMAGE, false)) {
                        //非Wi-Fi环境下,原则上选择当前网络环境的压缩图片。但当存在Wi-Fi环境下的高清图缓存时候,使用Wi-Fi高清图。无则重新下载
                        boolean isCacheInDisk = Fresco.getImagePipelineFactory().getMainBufferedDiskCache
                                ().containsSync(new SimpleCacheKey(url));
                        boolean isCacheInFile = Fresco.getImagePipelineFactory().getMainFileCache()
                                .hasKey(new SimpleCacheKey(url));
                        ImageRequest request;
                        if (isCacheInDisk || isCacheInFile) {
                            request = ImageRequest.fromUri(uri);
                        } else {
                            request = ImageRequest.fromUri(Uri.parse(formatUrl(uri.toString(), getWidth(), getHeight())));
                        }
                        DraweeController controller = Fresco.newDraweeControllerBuilder()
                                .setImageRequest(request)
                                .setCallerContext(callerContext)
                                .setOldController(getController())
                                .build();
                        setController(controller);
                    } else {
                        //Wi-Fi环境下选择高清大图
                        ImageRequest request2 = ImageRequest.fromUri(uri);
                        DraweeController controller = Fresco.newDraweeControllerBuilder()
                                .setImageRequest(request2)
                                .setCallerContext(callerContext)
                                .setOldController(getController())
                                .build();
                        setController(controller);
                    }

代码逻辑便是判别缓存中是还是不是留存,存在即央浼Wi-Fi景况下的图片url,海市蜃楼就呼吁流量处境下的图纸url.至于剖断三遍缓存是来自fresco的三级缓存原理,二个是内存中的缓存八个是磁盘缓存。一样这里去乞求Wi-Fi情状下的图样UTiggoL因为事先有缓存的,也只是直接运用缓存并不会议及展览开实际网络下载的。经测验也满足了领导的需求,在性能上双眼也未开掘料定的差距。

fresco先包涵三个大板块:Image Pipeline和Drawees.

总结

尽管尝试2的形式达成了官员的必要,可是有个小风险的询问缓存的代码是在主线程中推行的,当上列表的时候有导致页面卡顿的或然,但自身拿项目测验的时候从不察觉那样,也就没在意。搜了下还恐怕有个措施查询,可是代码格局部麻醉烦了些。还会有格局一不行可能是本身姿势不对原因,风乐趣的多多沟通。

项目demo链接

Image Pipeline

Fresco 中执会考察总计局筹有贰个叫做 Image Pipeline 的模块。它承受从互连网,从当麻芋果件系统,本地能源加载图片。为了最大限度节省空间和CPU时间,它饱含3级缓存设计(2级内部存款和储蓄器,1级磁盘)。

特性:

1.内部存款和储蓄器管理方面:
解压后的图纸,即Android中的Bitmap,占用一大波的内存。大的内部存款和储蓄器占用势必引发进一步频仍的GC。在5.0之下,GC将会明显地引发分界面卡顿。
在5.0以下系统,Fresco将图纸放到三个特地的内部存款和储蓄器区域。当然,在图片不突显的时候,占用的内部存款和储蓄器会自动被假释。这会使得应用软件更加流畅,裁减因图片内部存款和储蓄器占用而吸引的OOM。
Fresco 在低级机器上表现一样美丽,你再也不用因图片内存占用而苦思冥想。

2.图形绘制方面
Fresco 的 Drawees 设计,带来一些卓有功效的特点:
自定义居中关节
圆角图,当然圆圈也行
下载战败未来,点击再次出现下载
自定义占位图,自定义overlay, 大概进度条
点名客商按压时的overlay

Drawees

Fresco 中执会考查总括局筹有一个叫做 Drawees 模块,它会在图片加载成功前浮现占位图,加载成功后自行替换为对象图片。当图片不再显示在显示器上时,它会立即地放出内部存款和储蓄器和空间侵占

特性:
1.图片加载方面:
Fresco的Image Pipeline允许你用很三种办法来自定义图片加载进程,举例:
为同一个图片内定差别的远程路线,或然使用已经存在本地缓存中的图片
先出示一个低清晰度的图形,等高清图下载完今后再显示高清图
加载成功回调布告
对此地点图,如有EXIF缩略图,在大图加载成功从前,可先显示缩略图
缩放恐怕旋转图片
对已下载的图纸再一次拍卖
支撑WebP解码,尽管在原先对WebP支持不完美的Android系统上也能健康使用!

2.图片的渐进式展现

渐进式的JPEG图片格式已经风靡数年了,渐进式图片格式先显示大约的图片概况,然后趁着图片下载的一而再,展现逐年明晰的图纸,那对于活动设备,非常是慢网络有非常大的利好,可带来更加好的客户体验。
Android 本人的图片库不协助此格式,可是Fresco协理。使用时,和现在大同小异,仅仅需求提供贰个图片的URubiconI就能够,剩下的业务,Fresco会管理。

具体有些详尽的操作,查看API(http://fresco-cn.org/docs/supported-uris.html)
就能够精通了,下边就一些可能会冒出的难题打开验证:

1.在利用AndroidStudio实行支付时,刚起首在等级次序()build.gradle增添底下代码:

dependencies
{
compile
'com.facebook.fresco:fresco:0.5.0+'
}

但广大气象下项目会唤醒缺乏包,那是因为官方文书档案已经说fresco的类库公布到了Maven中心库,而小编辈或者未有在总Project下的build.gradle文件中增加下边代码:

allprojects {
repositories {
jcenter()
mavenCentral()
 }
}

2.现行以来讲最简便易行的行使:正是加载网络图片,
率先:在您的application类onCreate方法中加多

Fresco.initialize(instance);

第二:fresco是通过控件来促成它里面包车型地铁优化缓存处理,大家运用的时候是透过控件来行使,具体如下

<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/user_avator"
android:layout_width="50dp"
android:layout_height="50dp"
fresco:roundAsCircle="true"
fresco:roundedCornerRadius="180dp"
fresco:actualImageScaleType="focusCrop"
android:layout_centerVertical="true" />

世家莫不见到,属性中存在fresco:开首的宣示。那一个是fresco的自定义属性,即便大家须要动用其自定义属性,必需在我们的xml根布局中增多注脚/命名空间,那点要求注意

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

其三:在代码中具体的接纳

Uri uri = Uri.parse(http://b.hiphotos.baidu.com/image/pic/item/e78.jpg);
mAvatorImg.setImageURI(uri);

3.现行反革命牵线一些fresco的习性,通过这个属性大家能够很方便的定制一些效率

<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/my_image_view"
android:layout_width="20dp"   // 不支持wrap_content 如果要设置宽高比, 需要在Java代码中指定setAspectRatio(1.33f);
android:layout_height="20dp"// 不支持wrap_content 
fresco:fadeDuration="300"
fresco:actualImageScaleType="focusCrop"
 // 设置图片缩放. 通常使用focusCrop,该属性值会通过算法把人头像放在中间
fresco:placeholderImage="@color/wait_color"
 // 下载成功之前显示的图片
fresco:placeholderImageScaleType="fitCenter"

fresco:failureImage="@drawable/error"
// 加载失败的时候显示的图片
fresco:failureImageScaleType="centerInside"
fresco:retryImage="@drawable/retrying"
// 加载失败,提示用户点击重新加载的图片(会覆盖failureImage的图片)
fresco:retryImageScaleType="centerCrop"
fresco:progressBarImage="@drawable/progress_bar"// 提示用户正在加载,和加载进度无关
fresco:progressBarImageScaleType="centerInside"
fresco:progressBarAutoRotateInterval="1000"
fresco:backgroundImage="@color/blue"
fresco:overlayImage="@drawable/watermark"
fresco:pressedStateOverlayImage="@color/red"
fresco:roundAsCircle="false"
// 是不是设置圆圈
fresco:roundedCornerRadius="1dp"
// 圆角角度,180的时候会变成圆形图片
fresco:roundTopLeft="true"
fresco:roundTopRight="false"
fresco:roundBottomLeft="false"
fresco:roundBottomRight="true"
fresco:roundWithOverlayColor="@color/corner_color"
fresco:roundingBorderWidth="2dp"
fresco:roundingBorderColor="@color/border_color"
  />


修改图片尺寸
Uri uri = "file:///mnt/sdcard/MyApp/myfile.jpg";
int width = 50, height = 50;
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.build();
PipelineDraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(mDraweeView.getController())
.setImageRequest(request)
.build();
mSimpleDraweeView.setController(controller);


自动旋转
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setAutoRotateEnabled(true)
.build();

本文由明仕msyz手机版发布于家居装修-蜗牛装饰,转载请注明出处:Fresco中setFirstAvailableImageRequests其他情况

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。