我们接着上文继续说,上篇博客中我们已经知道了Fresco怎么用,也知道了它的非常多属性。可是非常多时候xml文件是不能满足你的要求的。这就须要你在代码中动态的改变显示的内容,今天我们就来探索一下怎样在代码中改变图片实现的状态和内容

前面我们已经使用过SimpleDraweeView这个控件了。显示图片的时候直接写了一个setImageURI(uri),Fresco不只提供了这一个方法来显示图片,它还提供了setController(controller)方法载入图片

DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.build();
imageView.setController(controller);

当然假设你想监听载入的过程,就加一个ControllerListen

ControllerListener listener = new BaseControllerListener(){
@Override
public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) {
super.onFinalImageSet(id, imageInfo, animatable);
} @Override
public void onFailure(String id, Throwable throwable) {
super.onFailure(id, throwable);
} @Override
public void onIntermediateImageFailed(String id, Throwable throwable) {
super.onIntermediateImageFailed(id, throwable);
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.setControllerListener(listener)
.build();
imageView.setController(controller);

图片载入成功或者失败,会运行里面的方法,当中图片载入成功时会运行onFinalImageSet方法,图片载入失败时会运行onFailure方法,假设图片设置渐进式,onIntermediateImageFailed会被回调

说完了怎样载入uri之后。怎样实如今xml中的效果呢?我们继续在java代码中实现xml的效果

GenericDraweeHierarchy hierarchy = new GenericDraweeHierarchyBuilder(getResources())
.setFadeDuration(300)
.setBackground(getDrawable(R.drawable.ic_launcher))
.setPlaceholderImage(getDrawable(R.drawable.ic_launcher))
.setFailureImage(getDrawable(R.drawable.ic_launcher))
.build();
imageView.setHierarchy(hierarchy);

方法非常多,你在xml中用到的都能够在这里设置,有些在xml中不能设置的在这里也是能够的,比如,我能够设置多张背景图片,我能够设置多张叠加图。这里都能够帮你实现,是不是非常强大啊。想不想拿到特权了一样呢!可是DraweeHiererchy创建时比較耗时,所以要多次利用

 GenericDraweeHierarchy hierarchy1 = imageView.getHierarchy();

这个框架不不过这些东西。它还有非常多更牛逼的东西,比如:它提供了渐进式载入图片。显示gif动绘图片等等

首先是渐进式图片载入。这方面的功能充分考虑了网络比較慢的情况下,用户不至于一致在等,最起码能看到模糊的照片,这个所谓的渐进式载入就是说用户从图片载入之后,图片会从模糊到清晰的一个渐变过程,当然这个过程仅限于从网络载入图片,本地或者缓存等地方的图片也不须要渐进式载入。没有意义

ProgressiveJpegConfig config = new ProgressiveJpegConfig() {
@Override
public int getNextScanNumberToDecode(int i) {
return 0;
} @Override
public QualityInfo getQualityInfo(int i) {
return null;
}
}; ImagePipelineConfig imagePipelineConfig = ImagePipelineConfig.newBuilder(this)
.setProgressiveJpegConfig(config)
.build();
Fresco.initialize(getApplicationContext(),imagePipelineConfig);
当然你也能够使用ProgressiveJpegConfig config1= new SimpleProgressiveJpegConfig(list,2);
<pre name="code" class="java">FLog.setMinimumLoggingLevel(FLog.VERBOSE);
Set<RequestListener> listeners = new HashSet<>();
listeners.add(new RequestLoggingListener());
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setRequestListeners(listeners)
.build();
Fresco.initialize(this, config);
setContentView(R.layout.activity_main); mProgressiveJpegView = (SimpleDraweeView) findViewById(R.id.my_image_view); Uri uri = Uri.parse("http://pooyak.com/p/progjpeg/jpegload.cgi?o=1");
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.build();
mProgressiveJpegView.setController(controller);


ImageRequest request = ImageRequestBuilder
.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.setOldController(imageView.getController())
.build();
imageView.setController(controller);

哎吆,不错哦,但是这个image pipeline这个又是个什么啊?它的来头比較大。负责图片的载入工作

1.检查内存缓存,如有,返回

2.后台线程開始兴许工作

3.检查是否在未解码内存缓存中。

如有,解码,变换,返回。然后缓存到内存缓存中。

4.检查是否在文件缓存中。假设有,变换,返回。缓存到未解码缓存和内存缓存中。

5.从网络或者本地载入。

载入完毕后,解码,变换。返回。存到各个缓存中。

继续看gif图片,事实上跟显示图片没什么差。主要是动态图片涉及到的动画的停止与播放,假设仅仅是单纯的试用一下,那就直接在controller里面设置setAutoPlayAnimation为true,假设你想手动监听就new一个ControllerListener里面手动控制

当我们要从server端下载一张高清图片。图片比較大,下载非常慢的情况下有些server会提供一张缩略图。相同的Fresco也支持这样的方法。在controller中提供了两个不同的方法setLowResImageRequest和setImageRequest,看到方法名你应该明确了怎么用

个人觉得这个框架最巧妙的地方,就是把bitmap保存到ashmen,不会启动gc,使的界面不会由于gc而卡死。Fresco使用三级缓存,第一级缓存就是保存bitmap,第二级缓存保存在内存,可是没有解码,使用时须要界面,第三级缓存就是保存在本地文件,相同文件也未解码。使用的时候要先解码啦!

上面谈到的保存的非常多内容都未解码,这也是fresco默认使用3个线程的原因,一个线程用来载入uri,一个线程用来解码。最后一个你知道它做什么。其余你想了解的东西自己去官网找找

最新文章

  1. ECharts饼图试玩
  2. MongoDB上的索引
  3. AC自动机 &amp; Fail树 专题练习
  4. 把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列。
  5. 集合引入(ArrayList、LinkedList)
  6. SQL中使用WITH AS提高性能(二)
  7. 采用ToolRunner执行Hadoop基本面分析程序
  8. leetCode刷题(找到最长的回文字符串)
  9. Node的安装和进程管理
  10. 直方图均衡化与Matlab代码实现
  11. 【nowcoder】 4th T1 动态点分治
  12. Reactor反应器模式 (epoll)
  13. MIPS架构上函数调用过程的堆栈和栈帧
  14. jenkins 邮件配置 二 ***
  15. [转]PostgreSQL教程(十六):系统视图详解
  16. Datagrid分页、排序、删除代码
  17. J2EE--Servlet生命周期与原理
  18. 耗时任务DefaultEventExecutorGroup 定时任务
  19. Android -- Camera聚焦流程
  20. linux 查找php.ini在那个文件夹

热门文章

  1. CNN中的局部连接(Sparse Connectivity)和权值共享
  2. 【POJ 3696】 The Luckiest number
  3. BZOJ-3732 Network 图论 最小生成树 倍增
  4. vuejs开发H5页面总结
  5. hdu 1087 A Plug for UNIX 最大流
  6. 记一个男默女泪的 BUG
  7. 八种Docker容器开发模式解析
  8. IE兼容opacity
  9. VFS文件系统结构分析 与socket
  10. node——获取路由中的参数