android之Fresco框架--Fresco基本使用

当下最常用的图片加载框架是:Gilde,Fresco,Picasso。Fresco是Facebook提供的开源图片加载库,它能够从网络,本地存储和Android资源文件中加载图片,且具有三级缓存设计(2级内存,1级文件)。Fresco中实现了各种加载过程以及加载后的图片绘制,整体都很强大。所以准备来好好学学这个框架啦。

Frescp框架的设计主要采用的是MVC模式。DraweeView实现了View的功能,DraweeHierarchy实现了Model的功能,DraweeController实现Controller的功能。

基本用法

首先在build.gradle中添加依赖,

 compile 'com.facebook.fresco:webpsupport:1.8.1'

在Android studio会自动下载相应的依赖包。

在进行图片加载之前,需要配置Fresco类,Fresco.initialize只需要调用一次,所以我们在Application中进行初始化:

public class MyApplication extends Application {
    @Override
    public void onCreate(){
        super.onCreate();
        Fresco.initialize(this);
    }
}

在AndroidManifest.xml中配置MyApplication,如果要从网络下载图片,还需要添加网络访问权限:

<uses-permission android:name="android.permission.INTERNET" />

在xml中配置SimpleDraweeView:

<com.facebook.drawee.view.SimpleDraweeView
    android:id="@+id/id_main_sdv"
    android:layout_width="20dp"        
    android:layout_height="20dp"
    fresco:placeholderImage="@drawable/imgbg"
/>

在Activity中加载图片:

SimpleDraweeView sdv = (SimpleDraweeView) findViewById(R.id.id_main_sdv);
Uri uri = Uri.parse("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1523079111408&di=7783555b20885592a8034c6e729a6414&imgtype=0&src=http%3A%2F%2Fimg.zcool.cn%2Fcommunity%2F01ea90595f5ca4a8012193a3d93648.jpeg");
sdv.setImageURI(uri);

接下来就是等待Fresco下载完图片并展示出来了。

XML中配置使用Drawees

一个大致的XML配置例示如下:

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/id_main_sdv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        fresco:actualImageScaleType="focusCrop"             //加载得到的图片的缩放类型
        fresco:fadeDuration="1000"                          //进度条,占位图片消失,加载图片展现的时间间隔
        fresco:failureImage="@drawable/imgbg"               //加载失败之后显示的图片
        fresco:failureImageScaleType="centerInside"         //图片缩放类型
        fresco:placeholderImage="@drawable/imgbg"           //占位图片(未加载之前显示的图片)
        fresco:placeholderImageScaleType="fitCenter"      
        fresco:progressBarAutoRotateInterval="1000"         //加载进度条图片旋转周期
        fresco:progressBarImage="@drawable/progress_bar"    //加载进度条图片
        fresco:progressBarImageScaleType="centerInside"
        fresco:retryImage="@mipmap/ic_launcher"             //提示重新加载的图片资源
        fresco:retryImageScaleType="centerCrop"
        fresco:backgroundImage="@color/colorWhite"          //背景图片
        fresco:roundAsCircle="false"                        //是否要将图片剪切成圆形
        fresco:viewAspectRatio="1"                          //图片宽高比
        fresco:overlayImage="@drawable/overlay"             //在图片上方覆盖一个图片资源
        fresco:pressedStateOverlayImage="@color/colorBlack"
        fresco:roundedCornerRadius="20dp"                   //圆角角度,
        fresco:roundTopLeft="true"                          //设置哪个角需要变成圆角
        fresco:roundTopRight="false"
        fresco:roundBottomLeft="false"
        fresco:roundBottomRight="true"
        fresco:roundWithOverlayColor="@color/colorWhite"    //圆角部分填充色
        fresco:roundingBorderWidth="2dp"                    //边框宽度
        fresco:roundingBorderColor="@color/colorBlack"      //边框填充色
        />

注意的是,在设置宽和高的时候,一定要设置成固定值,因为下载的图片,原始的占位图片,出错后的图片,这些的尺寸可能各不相同,如果用wrap_content,View将重新layout。

在一种情况下可以用wrap_content,就是我们设置了viewAspectRatio属性确定宽高比,这样我们将其中一个属性设为定值,另一个属性设为warp_content,可以通过计算宽高比得到目标值。

DraweeHierarchy和DraweeHierarchyBuilder

在Java中配置需要用到DraweeHierarchy,如前面所说,DraweeHierarchy类似于MVC中的Model,所以我们对最后显示的drawable的显示设置都在着里面进行。

下面的代码实现了跟上面XML基本一致的功能,至于dp转float我就没去弄了。
 

//新建一个DraweeHierarchyBuilder类
GenericDraweeHierarchyBuilder builder =new GenericDraweeHierarchyBuilder(getResources());
//设置的到图片的缩放类型
builder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP);
//缩放类型为focusCrop时,需要设定一个居中点
//(0f,0f)表示左上对齐显示,(1f,1f)表示右下对齐显示
PointF pf = new PointF(1f,1f);
builder.setActualImageFocusPoint(pf);
//进度条,占位图片消失,加载图片展现的时间间隔
builder.setFadeDuration(1000);
//加载失败之后显示的图片及图片缩放类型
builder.setFailureImage(R.drawable.imgbg, ScalingUtils.ScaleType.CENTER_INSIDE);
//设置占位图片及缩放类型
builder.setPlaceholderImage(R.drawable.imgbg, ScalingUtils.ScaleType.FIT_CENTER);
//加载进度条图片及缩放类型
builder.setProgressBarImage(R.drawable.progress_bar, ScalingUtils.ScaleType.CENTER_INSIDE);
//提示重新加载的图片及缩放类型
builder.setRetryImage(R.mipmap.ic_launcher, ScalingUtils.ScaleType.CENTER_CROP);
//设置背景图片
builder.setBackground(getResources().getDrawable(R.color.colorWhite));
//在图片上方覆盖一个图片资源
builder.setOverlay(getResources().getDrawable(R.drawable.overlay));
builder.setPressedStateOverlay(getResources().getDrawable(R.color.colorBlack));
RoundingParams rp = new RoundingParams();
//是否要将图片剪切成圆形
rp.setRoundAsCircle(false);
//设置哪个角需要变成圆角
rp.setCornersRadii(100f,0f,100f,0f);
//圆角部分填充色
rp.setOverlayColor(getResources().getColor(R.color.colorWhite));
//边框宽度
rp.setBorderWidth(20f);
//边框填充色
rp.setBorderColor(getResources().getColor(R.color.colorBlack));
builder.setRoundingParams(rp);
//得到DraweeHierarchy实例
GenericDraweeHierarchy hierachy = builder.build();
//在Drawee中设置DraweeHierarchy
sdv.setHierarchy(hierachy);

除了这些之外,在Java中还可以设置在图片上方覆盖多个图片资源,我们也可以在加载的时候使用Fresco自定义的加载条。

//多个图片资源
List<Drawable> overlaysList;
builder.setOverlays(overlaysList);
//进度条
builder.setProgressBarImage(new ProgressBarDrawable());

上面基本介绍了MVC中的Model和View,接下来就来介绍一下Controller了。

DraweeController和DraweeControllerBuilder

DraweeController主要是用于对图片进行更多的控制和定制,我们可以设置对加载事件进行监听,对加载之后的图片进行压缩或者修改,可以在加载失败之后重新加载图片,也可以实现多图请求。

在代码中,我们利用DraweeControllerBuilder生成一个DraweeController实例,再将其传给SimpleDraweeView就可以了。
 

PipelineDraweeControllerBuilder sdcb = Fresco.newDraweeControllerBuilder();
//设置uri
sdcb.setUri(uri);
//加载失败之后,点击提示重新加载的图片资源重新加载
sdcb.setTapToRetryEnabled(true);
//在指定一个新的controller的时候,使用setOldController,这可节省不必要的内存分配。
sdcb.setOldController(sdv.getController());
DraweeController controller = sdcb.build();
sdv.setController(controller);

在Controller中,如果我们想要对下载事件进行监听,需要为Controller设置一个自定义的ControllerListener。

ControllerListener

在ControllerListener中可以对我们的下载过程进行监听。代码如下

ControllerListener listener = new BaseControllerListener<ImageInfo>(){
    @Override
    public void onSubmit(String id, Object callerContext) {
        //提交请求之前调用的方法
        Log.d(TAG, "onSubmit: " + id);
    }
    @Override
    public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
        // 所有图片都加载成功时触发的方法
        Log.d(TAG, "onFinalImageSet: " + id);
    }
 
    @Override
    public void onIntermediateImageSet(String id, ImageInfo imageInfo) {
        //当中间图片下载成功的时候触发,用于多图请求
    }
 
    @Override
    public void onIntermediateImageFailed(String id, Throwable throwable) {
        //当中间图片下载失败的时候触发,用于多图请求
    }
 
    @Override
    public void onFailure(String id, Throwable throwable) {
        // 加载图片失败时回调的方法
        Log.d(TAG, "onFailure: " + id);
    }
    @Override
    public void onRelease(String id) {
        //释放图片资源时加载的方法
        Log.d(TAG, "onRelease: " + id);
    }
};
PipelineDraweeControllerBuilder sdcb = Fresco.newDraweeControllerBuilder();
sdcb.setControllerListener(listener);

如果我们在请求图片的过程中,需要进行更多的操作的话,我们需要用ImageRequest来进行实现。

ImageRequest

ImageRequest支持很多的功能,例如自动旋转图片,渐进式加载,图片缩放,后处理器,图片复用,最低请求级别等等。基本的实现源码如下:

ImageRequest request = ImageRequestBuilder
                        //设置URI
                        .newBuilderWithSource(uri)
                        //自动旋转
                        .setAutoRotateEnabled(true)
                        //最低级别请求
                        .setLowestPermittedRequestLevel(ImageRequest.RequestLevel.FULL_FETCH)
                        //图片缩放
                        .setResizeOptions(new ResizeOptions(width,height))
                        //渐进式加载
                        .setProgressiveRenderingEnabled(false)
                        .build();
PipelineDraweeControllerBuilder sdcb = Fresco.newDraweeControllerBuilder();
sdcb.setImageRequest(request);
DraweeController controller = sdcb.build();
sdv.setController(controller);

最低请求级别包含以下几种取值 :

BITMAP_MEMORY_CACHE 检查内存缓存,有如,立刻返回。这个操作是实时的。 
ENCODED_MEMORY_CACHE检查未解码的图片缓存,如有,解码并返回。 
DISK_CACHE检查磁盘缓存,如果有加载,解码,返回。 
FULL_FETCH    下载或者加载本地文件。调整大小和旋转(如有),解码并返回。 

图片复用

后处理器:PostProcessor

渐进式JPEG图,动画支持,多图请求

用到了再补充

转载:https://blog.csdn.net/xuyueqing1225/article/details/79842292

更多基础用法及运行效果参考:https://www.cnblogs.com/zhujiabin/p/8252149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值