Fresco图片加载(二)

上篇文章讲了fresco图片最基本的加载方式,这篇讲讲他的进阶

基本概念:
Drawees
Drawee是图片的渲染控件,有三部分组成,类似MVC框架.

DraweeView

继承自Android的View类.

我们应当在app的XML或java代码使用SimpleDraweeView类,调用其setImageURI方法,加载图片的URL。

DraweeView的其他xml属性介绍,后面再补充。

DraweeHierarchy

DraweeHierarchy是实质上渲染图片内容的类,可以把它当作MVC中的Model,并且我们可以通过它在java代码里设置图片的属性。

DraweeController

DraweeController类负责框架底层的图片加载,如果我们不仅仅是需要一个简单的URI来指定要显示的图片,那么我们就会用到这个类。

DraweeControllerBuilder

DraweeController一旦创建便不可更改,他们通过建造者模式创建。

Listener

只要用了builder指定了一个Listener,那么可以利用数据从服务器传输到客户端的传输比率。

The Image Pipeline

Fresco通过Image Pipeline(图形管道)完成图片的获取,不管是通过网络、本地文件、content provider 还是本地资源,它都把图片压缩并缓存到本地,并且把内存作为第二缓存存储着解压后的图片。

图形管道使用pinned purgeable技术将图片存储到java堆中,当管道的任务完成时,需要调用者 close图片。

SimpleDraweeView自动为我们做了这些,因此,这个View应该是我们的首选,只有很少的app需要直接的使用图形管道。

1,首先初始化,规定不同图片大小质量存储在不同的保存方式

(一)在Appliaction中进行初始化

Fresco.initialize(this, FrescoConfig.getImagePipelineConfig(this));

(二)对于fresco进行初始化配置;

ImagePipelineConfig:本身就是一个图片加载组件;
大致流程如下:
检查内存缓存,如有,返回
后台线程开始后续工作
检查是否在未解码内存缓存中。如有,解码,变换,返回,然后缓存到内存缓存中。
检查是否在文件缓存中,如果有,变换,返回。缓存到未解码缓存和内存缓存中。
从网络或者本地加载。加载完成后,解码,变换,返回。存到各个缓存中。
图片加载组件

 public static ImagePipelineConfig getImagePipelineConfig(Context context) {
        if (sImagePipelineConfig == null) {
            sImagePipelineConfig = configureCaches(context);
        }
        return sImagePipelineConfig;
    }

基本控件配置

 private static ImagePipelineConfig configureCaches(Context context) {
        final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
                FrescoConfig.MAX_MEMORY_CACHE_SIZE, // Max total size of elements in the cache
                Integer.MAX_VALUE,                     // Max entries in the cache
                FrescoConfig.MAX_MEMORY_CACHE_SIZE, // Max total size of elements in eviction queue
                Integer.MAX_VALUE,                     // Max length of eviction queue
                Integer.MAX_VALUE);                    // Max cache entry size

        //修改内存图片缓存数量
        Supplier<MemoryCacheParams> mSupplierMemoryCacheParams = new Supplier<MemoryCacheParams>() {
            @Override
            public MemoryCacheParams get() {
                return bitmapCacheParams;
            }
        };
        //小图片的磁盘配置
        DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder(context)
                .setBaseDirectoryPath(FileUtil.getExternalCacheDir(context))
                .setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)
                .setMaxCacheSize(FrescoConfig.MAX_DISK_CACHE_SIZE)
                .setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE)
                .setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE)
                .build();

        //默认图片的磁盘配置
        DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(context)
                .setBaseDirectoryPath(Environment.getExternalStorageDirectory().getAbsoluteFile())
                .setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)
                .setMaxCacheSize(FrescoConfig.MAX_DISK_CACHE_SIZE)
                .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE)
                .setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE)
                .build();
        //缓存图片配置
        ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context)
                .setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)
                .setMainDiskCacheConfig(diskCacheConfig)
                .setSmallImageDiskCacheConfig(diskSmallCacheConfig);
        return configBuilder.build();
    }

以上操作完成之后,就开始可以使用fresco进行图片加载了,当然你也不需要在activity或者fragment里面进行初始化咯。下面正式开始:
1,xml中定义

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/simpleDraweeView"
    android:layout_width="150dp"
    android:layout_height="150dp"/>

2,加载普通图片,两种方式(simpleDraweeView 表示显示图片的控件,url 图片链接)

(1)直接设置

simpleDraweeView.setImageURI(Uri.parse(url));

(2)添加控制器

DraweeController draweeController = Fresco.newDraweeControllerBuilder()
                .setUri(Uri.parse(url))
                .setAutoPlayAnimations(true)
                .build();
simpleDraweeView.setController(controller);

上述方法的确满足图片加载,但是有些情况如果需要一个占位图,图片显示错误图片肯定就没有办法满足了。
DraweeHierarchy是实质上渲染图片内容的类,可以把它当作MVC中的Model,并且我们可以通过它在java代码里设置图片的属性。:

public static GenericDraweeHierarchy getGenericDraweeHierarchy(Context context) {
        GenericDraweeHierarchy gdh = new GenericDraweeHierarchyBuilder(context.getResources())
                .setFailureImage(context.getResources().getDrawable(R.mipmap.icon_failure), ScalingUtils.ScaleType.FIT_XY)//fresco:failureImage="@drawable/error"失败图
                .setPlaceholderImage(context.getResources().getDrawable(R.mipmap.ic_placeholder), ScalingUtils.ScaleType.FIT_XY)//fresco:placeholderImage="@color/wait_color"占位图
                .reset()//重置
                .setActualImageColorFilter(colorFilter)//颜色过滤
                .setActualImageFocusPoint(focusPoint)//focusCrop, 需要指定一个居中点
                .setActualImageMatrix(actualImageMatrix)
                .setActualImageScaleType(actualImageScaleType)//fresco:actualImageScaleType="focusCrop"缩放类型
                .setBackground(background)//fresco:backgroundImage="@color/blue"背景图片
                .setBackgrounds(backgrounds)
                .setFadeDuration(fadeDuration)//fresco:fadeDuration="300"加载图片动画时间
                .setOverlay(overlay)//fresco:overlayImage="@drawable/watermark"叠加图
                .setOverlays(overlays)
                .setPressedStateOverlay(drawable)//fresco:pressedStateOverlayImage="@color/red"按压状态下的叠加图
                .setProgressBarImage(new ProgressBarDrawable())//进度条fresco:progressBarImage="@drawable/progress_bar"进度条
                .setProgressBarImage(progressBarImage, progressBarImageScaleType)//fresco:progressBarImageScaleType="centerInside"进度条类型
                .setRetryImage(retryDrawable)//fresco:retryImage="@drawable/retrying"点击重新加载
                .setRetryImage(retryDrawable, retryImageScaleType)//fresco:retryImageScaleType="centerCrop"点击重新加载缩放类型
                .setRoundingParams(RoundingParams.asCircle())//圆形/圆角fresco:roundAsCircle="true"圆形
                .build();
        return gdh;
    }

simpleDraweeView图片设置属性

simpleDraweeView.setHierarchy(getGenericDraweeHierarchy(context));

以上就可以满足,即可以正常显示图片,当图片出现问题的情况下也可以正常显示

FrescoDemo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值