android继续探索Fresco
来源:互联网 发布:mmd格斗动作数据下载 编辑:程序博客网 时间:2024/05/16 14:07
我们接着上文继续说,上篇博客中我们已经知道了Fresco怎么用,也知道了它的很多属性,但是很多时候xml文件是不能满足你的要求的,这就需要你在代码中动态的改变显示的内容,今天我们就来探索一下如何在代码中改变图片实现的状态和内容
前面我们已经使用过SimpleDraweeView这个控件了,显示图片的时候直接写了一个setImageURI(uri),Fresco不仅仅提供了这一个方法来显示图片,它还提供了setController(controller)方法加载图片
- DraweeController controller = Fresco.newDraweeControllerBuilder()
- .setUri(uri)
- .build();
- imageView.setController(controller);
- 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);
说完了如何加载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);
- GenericDraweeHierarchy hierarchy1 = imageView.getHierarchy();
首先是渐进式图片加载,这方面的功能充分考虑了网络比较慢的情况下,用户不至于一致在等,最起码能看到模糊的照片,这个所谓的渐进式加载就是说用户从图片加载之后,图片会从模糊到清晰的一个渐变过程,当然这个过程仅限于从网络加载图片,本地或者缓存等地方的图片也不需要渐进式加载,没有意义
- 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里面手动控制当我们要从服务器端下载一张高清图片,图片比较大,下载很慢的情况下有些服务器会提供一张缩略图,同样的Fresco也支持这种方法,在controller中提供了两个不同的方法setLowResImageRequest和setImageRequest,看到方法名你应该明白了怎么用
个人认为这个框架最巧妙的地方,就是把bitmap保存到ashmen,不会启动gc,使的界面不会因为gc而卡死,Fresco使用三级缓存,第一级缓存就是保存bitmap,第二级缓存保存在内存,但是没有解码,使用时需要界面,第三级缓存就是保存在本地文件,同样文件也未解码,使用的时候要先解码啦!
上面谈到的保存的很多内容都未解码,这也是fresco默认使用3个线程的原因,一个线程用来加载uri,一个线程用来解码,最后一个你知道它做什么,其余你想了解的东西自己去官网找找
- android继续探索Fresco
- android继续探索Fresco
- Android Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco图片框架内部实现原理探索
- Fresco(Facebook开源的android项目)图片缓存框架的eclipse整合与使用探索(较详细配置说明)
- Android图片库Fresco
- Android图片库Fresco介绍
- Android Studio导入Fresco
- Android 图片缓存 - Fresco
- android 初识Fresco
- Android Studio编译Fresco
- Android 浅析fresco
- C语言2(程序结构)
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式
- iOS学习笔记-----UITextField与UITextView属性与方法
- iOS iPhone屏幕尺寸、分辨率及适配
- 《JAVA并发编程实战---读书笔记2》
- android继续探索Fresco
- POJ 2594 Treasure Exploration
- iOS 数组学习
- 解决Hibernate native sql中双冒号(:)转义的问题
- 向JAVA项目中导入jar包,需要进行设置。(安卓项目可直接导入)
- 概率与期望2
- xilinx 的4个 HDMI的IPCORE, 用一个 Microblaze控制。
- 设计模式之适配器模式
- 第二篇博客