android继续探索Fresco
我们接着上文继续说,上篇博客中我们已经知道了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,一个线程用来解码。最后一个你知道它做什么。其余你想了解的东西自己去官网找找
android继续探索Fresco的更多相关文章
- Android Studio导入Fresco
大概一周之前,Facebook开源了专为Android系统定制的图片下载缓存工具,当天该消息就上了各大技术论坛网站的头条,也成为了各个技术群里讨论的最主要的话题.也就在当天stay4it的QQ群里面就 ...
- Android自动化测试探索
Android自动化测试探索 前言 通常来说,我们开发完成产品之后,都是由测试组或者是我们自己点一点,基本上没有问题了就开始上线.但是,随着时间的堆叠,一款产品的功能也越来越多.这时,我们为了保证产品 ...
- Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装
前言: 最近在看<Android深度探索(卷1)HAL与驱动开发>安装随书带的虚拟环境浪费了很多时间,说是虚拟环境的安装倒不如说是虚拟环境的导入,其实没什么技术含量,也没有什么复杂的,只是 ...
- Android深度探索总结
Android深度探索前四章总结 通过这几章的学习真实体会到“移植”的概念:为特定设备定制Android的过程,但是移植的过程中开发最多的就是支持各种硬件设备的Linux驱动程序,本章对Android ...
- 《Android深度探索》(卷1)HAL与驱动开发读后感:
第一章:安卓系统移植与驱动开发概述 全书分为4篇,分别从搭建开发环境,Linux驱动和Android HAL的基础知识,开发Linux驱动的高级技术和分析典型的Linux驱动源代码4个方面介绍Andr ...
- Android Studio 引入 Fresco
首选在build.gradle文件中配置 查看NDK路径 然后在gradle.properties文件中配置 ndk.path=C\:\\Users\\lixishuang\\AppData\\Loc ...
- Android 模块化探索与实践
首发于<程序员>杂志五月刊 一.前言 万维网发明人 Tim Berners-Lee 谈到设计原理时说过:"简单性和模块化是软件工程的基石:分布式和容错性是互联网的生命." ...
- Android自动化测试探索(五)代码覆盖率统计
Android 代码覆盖率统计 本周开始准备统计Android自动化用例的代码覆盖率,将最终使用的方法记录下来. 覆盖率监测的原理 覆盖率监测的原理跟iOS上的原理差不多,大致的思路参考下吧, iOS ...
- Android学习探索之Java 8 在Android 开发中的应用
前言: Java 8推出已经将近2年多了,引入很多革命性变化,加入了函数式编程的特征,使基于行为的编程成为可能,同时减化了各种设计模式的实现方式,是Java有史以来最重要的更新.但是Android上, ...
随机推荐
- android 添加新的键值,自定义按键【转】
本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871 在Android中,上层可使用的键值默认情况下是92个,从0-91:一般情况下 ...
- 中文分词--最大正向与逆向匹配算法python实现
最大匹配法:最大匹配是指以词典为依据,取词典中最长单词为第一个次取字数量的扫描串,在词典中进行扫描(为提升扫描效率,还可以跟据字数多少设计多个字典,然后根据字数分别从不同字典中进行扫描).例如:词典中 ...
- php保存远程图片
php获取远程图片并把它保存到本地 来源: 时间:2013-09-05 19:26:57 阅读数:45006 分享到:1 [导读] 在php中我们经常使用写一些简单的采集功能,这样可以自动把远 ...
- weixin js接口
<!DOCTYPE HTML><html><head> <meta http-equiv="content-type" content=& ...
- css兼容性的一些问题
1. 文字本身的大小不兼容.同样是font-size:14px的宋体文字,在不同浏览器下占的空间是不一样的,ie下实际占高16px,下留白3px,ff 下实际占高17px,上留白1px,下留白3px, ...
- 运维自动化-Ansible
前言 天天说运维,究竟是干什么的?先看看工作流程呗.一般来说,运维工程师在一家企业里属于个位数的岗位,甚至只有一个.面对生产中NNN台服务器,NN个人员,工作量也是非常大的.所以嘛,图中的我好歹也会配 ...
- C#中DBNull问题
当数据库中一个字段不是必填项时,在往数据库中插入数据的时候往往会插入一个空字符串就草草了事了.在这里用DBNull可以解决这个问题 /// <summary> /// 插入数据 /// & ...
- hdu3873 Invade the Mars 有限制的最短路
此段略过.看完题目,觉得这真的是一道好题目.自己有想法,但是实现起来却很难.看题解,写代码,然后写题解,意义何在?我不认为自己总是这么弱.就算抄代码,我也要有自己的理解.菜鸟总会成长. 首先,题目必须 ...
- element-ui Cascader 级联选择器示例
<html> <head>test</head> <style> @import url("http://unpkg.com/element- ...
- Windows平台上使用ANT编译Hadoop Eclipse Plugin
一.准备工作: 1.安装JDK 下载页面:http://www.oracle.com/technetwork/java/javase/downloads/index.html JDK6,JDK7都 ...