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,一个线程用来解码。最后一个你知道它做什么。其余你想了解的东西自己去官网找找

时间: 2024-10-10 08:22:53

android继续探索Fresco的相关文章

Android深度探索HAL与驱动开发 第四章

Android深度探索HAL与驱动开发 第四章 源代码的下载和编译 读书笔记 一.下载编译和测试Android源代码 1.配置Android源代码下载环境 创建一个用于存放下载脚本文件的目录(可将该文件放到任何一个目录在这里使用-/bin) # mkdir ~/bin # PATH=~/bin:$PATH 2.下载repo脚本文件(用于下载Android源代码) # curl htttps://dl-ssl.google.com/dl/googlesource/git-repo/repo> ~/

Android深度探索HAL与驱动开发 第三章

Android深度探索HAL与驱动开发 第三章 Git使用入门 读书笔记 Git是对源代码进行管理的软件. 一.安装Git # apt-get install git # apt-get install git-doc git-emall git-gui gitk 用以下命令控制Git: # apt-get install git-core # apt-get install git-doc git-svn git-email git-gui gitk 二.查看Git文档 查看git-check

Android深度探索(卷1)HAL与驱动开发学习笔记(2)

Android深度探索(卷1)HAL与驱动开发学习笔记(2) 第二章搭建Android开发环境 书中介绍了两种JDK的安装方法, 方法一: 从官网下载JDK并进行配置,解压后在终端打开profile文件来设置PATH环境变量(# soure /etc/profile),打开profile文件后输入下面的内容 export PATH=.:developer/jdk6/bin:$PATH 保存profile文件以后,有两种方法可以重新加载profile文件. 1.# sourse  /etc/pro

《Android深度探索》第十章心得体会

<Android深度探索>第十章讲的是嵌入式Linux的调试技术.对于复杂的Linux驱动及HAL等程序库,需要使用各种方法对其进行测试.printk函数的用法和printf函数类似,只不过printk函数运行在内核空间,printf函数运行在用户空间.也就是说,像Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息.在Linux文件系统中,/proc经常用来作为内核空间和用户空间进行数据交互的工具./proc文件系统的行为方式和设备文件系统(/dev)类似./proc是

Android深度探索HAL与驱动开发 第二章

Android深度探索HAL与驱动开发 第二章 搭建Android开发环境 读书笔记 一.Android底层开发需要的工具 1.JDK6或以上版本 2.Eclipse3.4或以上版本 3.ADT(用于开发Android的应用程序) 4.CDT(用于开发Android NDK程序) 5.Android SDK 6.Android NDK 7.交叉编译环境 8.Linux内核源代码 9.Android源代码 10.用于调试开发板的串口工具:minicom 二.安装JDK 下载JDK后在终端输入 #

Android深度探索总结

Android深度探索前四章总结 通过这几章的学习真实体会到“移植”的概念:为特定设备定制Android的过程,但是移植的过程中开发最多的就是支持各种硬件设备的Linux驱动程序,本章对Android和Linux做了总体介绍.接着介绍了Android的四层架构:Linux内核:C/C++代码库:Android SDK API;应用程序.又引入Android移植,Android移植包括两部分:应用移植,系统移植.而且为硬件平台添加新的模块,必须为此模块添加一个新的驱动程序,或者修改原来的程序. 学

《Android深度探索》第五章心得体会

<Android深度探索>第五章讲的是搭建S3C6410开发板的测试环境.S3C6410开发板是由三星公司生产的一款开发板产品,具有许多优点.本书的研究就是基于这块开发板的. 搭建环境需要先安装串口调试工具,然后烧入Android系统. 1. 安装串口调试工具:minicom, 第1步:输入命令 insmod | grep usbserial命令检测当前系统是否支持USB转串口: 第2步:输入命令apt-get install minicom命令安装minicom: 第3步:输入minicom

《Android深度探索卷一》第一章Android系统移植与驱动开发概述。

<Android深度探索>第一章讲的是Android系统移植与驱动开发概述.这一章节将对Android以及Linux驱动做一个总体的介绍. Android是一个非常优秀的的嵌入式操作系统.经过几年的发展和演进,Android已经形成了非常完善的系统架构.Android的系统架构分为四层,如下图 Android移植可分为两部分:应用移植和系统移植. Android系统移植是指让Android操作系统在某一个特定硬件平台上运行.使一个操作系统在特定硬件平台上运行的一个首要条件就是该操作系统支持硬件

android深度探索第一章

Android深度探索HAL与驱动开发的第一章学习了android系统移植与系统开发详述. 正如书上的导言所说,,android已经成为当前智能手机操作系统的老大.所以其重要性可想而知,其学习的意义非比寻常.其发展的迅速,很大程度上取决于任何人都可以利用android的源代码定制完全属于自己的嵌入式系统,而不需要向Google交钱.而由于android原生的代码支持的设备不多,因此,要想在自己的设备(包括手机.智能电视.平板等)上完美运行android,就需要另外一些开发程序,使得android