Fresco的使用

1.首先按照需求导入相应的依赖

/*Fresco的基础依赖*/(必须导入)
implementation 'com.facebook.fresco:fresco:0.14.1'
/*Fresco的GIF功能的依赖*/(实现gif动图功能)
implementation 'com.facebook.fresco:animated-gif:0.14.1'

2.在Application中初始化操作

@Override
public void onCreate() {
    super.onCreate();
    Fresco.initialize(this);
}

记得要在清单注册

3.下面开始代码

★★★★★★★★★★★★★★★★★★★带进度条★★★★★★★★★★★★★★★★★★

 //进度条
        //显示出所要加载的图片
        Uri parse = Uri.parse("http://assets.kgc.cn/upload/openteacher/20160831/1472636067718985.jpg");

        //创建Build对象
        GenericDraweeHierarchyBuilder genericDraweeHierarchyBuilder = new GenericDraweeHierarchyBuilder(getResources());
        //通过这个对象设置今天的样式
        GenericDraweeHierarchy build = genericDraweeHierarchyBuilder.setProgressBarImage(new ProgressBarDrawable()).build();

        //把样式设置给图片控件
        sdv_fresco_spimg.setHierarchy(build);
        //加载图片成功
        sdv_fresco_spimg.setImageURI(parse);

★★★★★★★★★★★★★★★★图片裁剪★★★★★★★★★★★★★★★★★★★

 case R.id.bt_fresco_center:// 居中,无缩放
                // 样式设置,使图片只显示中间的部分
                GenericDraweeHierarchy center = mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build();
                //加载图片
                imageDisplay(center);
                break;
            case R.id.bt_fresco_centercrop:// 保持宽高比缩小或放大,使得两边都大于或等于显示边界(也就是裁剪成正方形)。以中间的点为图片中心
                // 样式设置,使图片按比例缩小或放大,且裁剪成正方形.
                GenericDraweeHierarchy centercrop = mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP).build();
                //加载图片
                imageDisplay(centercrop);
                break;
            case R.id.bt_fresco_focuscrop:// 同centerCrop, 但居中点不是中点,而是指定的某个点,这里设置为图片的左上角那点
                //指定中心点位置
                PointF point = new PointF(200, 300);
                //根据指定的点设置为图片中心,使图片按比例缩小或放大,且裁剪成正方形.
                GenericDraweeHierarchy focuscrop = mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP)
                        .setActualImageFocusPoint(point).build();
                //加载图片
                imageDisplay(focuscrop);
                break;

            case R.id.bt_fresco_centerinside: //使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片
                // 样式设置,使图片按比例显示在控件内
                GenericDraweeHierarchy centerinside=mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE)
                        .build();
                //加载图片
                imageDisplay(centerinside);
                break;
            case R.id.bt_fresco_fitcenter:// 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示
                //样式设置,保持宽高比例,对图片进行缩或放,图片位置居中显示(效果和上面一种类似)
                GenericDraweeHierarchy FIT_CENTER =mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER).build();
                //加载图片
                imageDisplay(FIT_CENTER);
                break;
            case R.id.bt_fresco_fitstart:// 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,不居中,和显示边界左上对齐
                // 样式设置,保持宽高比例,对图片进行缩或放,图片位置,不居中,和显示边界左上对齐
                GenericDraweeHierarchy FIT_START =mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_START).build();
                //加载图片
                imageDisplay(FIT_START);
                break;
            case R.id.bt_fresco_fitend:// 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,不居中,和显示边界右下对齐
                // 样式设置,保持宽高比例,对图片进行缩或放,图片位置,不居中,和显示边界右下对齐
                GenericDraweeHierarchy FIT_END =mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_END).build();
                imageDisplay(FIT_END);

                break;
            case R.id.bt_fresco_fitxy:// 不保持宽高比,填充满显示边界
                // 样式设置,使图片填充整个控件,不保证宽高比例.
                GenericDraweeHierarchy FIT_XY=mBuilder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_XY).build();
                // 图片显示
                imageDisplay(FIT_XY);
                break;
            case R.id.bt_fresco_none:// 如要使用titlemode显示, 需要设置为none

               // 样式设置
                GenericDraweeHierarchy none= mBuilder.setActualImageScaleType(null).build();
                // 图片显示
                imageDisplay(none);
                break;

图片显示

 /*
    加载图片
     */
    private void imageDisplay(GenericDraweeHierarchy center) {
        Uri uri = Uri.parse("https://img-blog.csdnimg.cn/20181128100748307.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1h1ZXh4XzUyMA==,size_16,color_FFFFFF,t_70");
        sdv_fresco_crop.setHierarchy(center);
        sdv_fresco_crop.setImageURI(uri);
    }

★★★★★★★★★★★★★★★★圆形和圆角★★★★★★★★★★★★★★★★★★★★

 mUri = Uri.parse("http://img4q.duitang.com/uploads/item/201304/27/20130427043538_wAfHC.jpeg");

        //创建Builder对象
        mBuilder = new GenericDraweeHierarchyBuilder(getResources());
            case R.id.bt_fresco_circle://圆形
                //设置形状对象,形状为圆形
                RoundingParams mParams = RoundingParams.asCircle();
                //把形状设置给参数对象
                GenericDraweeHierarchy rounding = mBuilder.setRoundingParams(mParams).build();
                //设置给图片控件
                sdv_fresco_circleandcorner.setHierarchy(rounding);
                //加载图片控件
                sdv_fresco_circleandcorner.setImageURI(mUri);

                break;
            case R.id.bt_fresco_corner://圆角边界
                RoundingParams roundingParams = RoundingParams.fromCornersRadius(50f);

                GenericDraweeHierarchy build = mBuilder.setRoundingParams(roundingParams).build();
                sdv_fresco_circleandcorner.setHierarchy(build);
                //加载图片控件
                sdv_fresco_circleandcorner.setImageURI(mUri);

                break;

★★★★★★★★★★★★★★★★渐进式展示图片★★★★★★★★★★★★★★★★

  case R.id.sdv_fresco_askImg:
                // 获取图片URL
                Uri uri = Uri.parse("https://note.wiz.cn/wizas/a/users/avatar/36e04b40-cc54-41c5-995a-7aad33f45dd9");

                //加载质量配置,为了实现节省GPU,随着图片的下载,下完的扫描序列:1,4,5,10
                ProgressiveJpegConfig jpegConfig = new ProgressiveJpegConfig() {
                    @Override
                    public int getNextScanNumberToDecode(int scanNumber) {
                        return scanNumber + 2;
                    }

                    @Override
                    public QualityInfo getQualityInfo(int scanNumber) {
                        boolean isGoodEnough = (scanNumber >= 5);

                        return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false);
                    }
                };
                ImagePipelineConfig.newBuilder(this).setProgressiveJpegConfig(jpegConfig).build();
                //固定代码,直接复制使用即可,不用记忆
                //创建ImageRequest对象
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                        .setProgressiveRenderingEnabled(true)//打开渐进模式
                        .build();
                // 图片加载的控制
                AbstractDraweeController draweeController = Fresco.newDraweeControllerBuilder()
                        .setImageRequest(request)
                        .setTapToRetryEnabled(true)
                        .setOldController(sdv_fresco_jpeg.getController())
                        .build();

                sdv_fresco_jpeg.setController(draweeController);

                break;

★★★★★★★★★★★★★★★★Gif图片★★★★★★★★★★★★★★★★

记得添加gif依赖

 case R.id.bt_fresco_askImg:
                //GIF动画网址,加载需要一段时间
                Uri uri = Uri.parse("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514259038111&di=312e8557563f428353811cc457f96ee3&imgtype=0&src=http%3A%2F%2Fimg.mp.itc.cn%2Fupload%2F20161116%2Ffc10ee2abef545c7bbd6f46a09c20ed2_th.gif");

                AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setUri(uri)
                        .setAutoPlayAnimations(false)//是否自动播放动画,false不播放
                        .setOldController(sdv_fresco_gif.getController())//内存优化
                        .build();

                sdv_fresco_gif.setController(controller);

                break;
            case R.id.bt_fresco_stopAnim://动画停止
                try {//可能getController为空,所以抛异常
                    Animatable animatableStop=sdv_fresco_gif.getController().getAnimatable();
                    if(animatableStop!=null&&animatableStop.isRunning()){
                        animatableStop.stop();
                    }
                } catch (Exception e){
                   e.printStackTrace();
                }

                break;
            case R.id.bt_fresco_startAnim://动画开始
              try {
                  Animatable animatableStart = sdv_fresco_gif.getController().getAnimatable();
                  //非空判断同时判断有没有播放
                  if (animatableStart != null && !animatableStart.isRunning()) {
                      animatableStart.start();
                  }
              } catch (Exception e){
                  e.printStackTrace();
              }

                break;

★★★★★★★★★★★★★★★★★多图请求及图片复用★★★★★★★★★★★★★★★★★

//先显示低分辨率的图,再显示高分辨率的图,Fresco就是MVC的代码架构
            case R.id.bt_fresco_multiImg:
                Uri lowUri = Uri.parse("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=91883135,2320948421&fm=111&gp=0.jpg");
                Uri highUri = Uri.parse("https://img5.duitang.com/uploads/item/201312/03/20131203153823_Y4y8F.jpeg");
                //控制加载的图片控制器
                AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setLowResImageRequest(ImageRequest.fromUri(lowUri))
                        .setImageRequest(ImageRequest.fromUri(highUri))
                        .build();

                //加载图片
                sdv_fresco_multi.setController(controller);

                break;
            case R.id.bt_fresco_thumbnailImg://使用Fresco加载本地的图片
                Uri thumbnailImgUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/Pictures/Screenshots/a.png"));
               //加载图片的请求
                ImageRequest request =ImageRequestBuilder.newBuilderWithSource(thumbnailImgUri)
                //开启缩略图预览模式
                        .setLocalThumbnailPreviewsEnabled(true)
                        .build();
               // 控制图片的加载
                DraweeController preview =Fresco.newDraweeControllerBuilder()
                        .setImageRequest(request)
                        .build();
                // 加载图片
                sdv_fresco_multi.setController(preview);

                break;
            case R.id.bt_fresco_multiplexImg://本地图片复用
                //在请求之前,还会去内存中请求一次图片,没有才会先去本地,最后去网络uri
                //本地准备复用图片的uri 如果本地这个图片不存在,会自动去加载下一个uri
                // 本地图片的地址
                Uri multiplexImgUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/Pictures/Screenshots/a.png"));
               //图片的网址
                Uri uri2 = Uri.parse("http://img5.duitang.com/uploads/item/201312/03/20131203153823_Y4y8F.jpeg");

                 //创建ImageRequest对象,将其放入ImageRequest[]数组中.

                ImageRequest request1 =ImageRequest.fromUri(multiplexImgUri);
                ImageRequest request2 =ImageRequest.fromUri(uri2);
                ImageRequest[] requests = {request1,request2};
               // 控制加载图片
                DraweeController reuse =Fresco.newDraweeControllerBuilder()
                 //设置加载图片的顺序.参数ImageRequest[]数组
                 .setFirstAvailableImageRequests(requests)
                  .setOldController(sdv_fresco_multi.getController())
                  .build();
                // 加载图片
                sdv_fresco_multi.setController(reuse);
                break;

★★★★★★★★★★★★★★★★★图片加载监听★★★★★★★★★★★★★★★★★

case R.id.bt_fresco_listener:
                ControllerListener controllerListener = new BaseControllerListener<ImageInfo>(){
                    @Override
                    public void onFinalImageSet(String id,ImageInfo imageInfo, Animatable animatable) {
                        super.onFinalImageSet(id, imageInfo, animatable);
                        //图片信息对象非空判断
                        if (imageInfo == null) {
                            return;
                        }
                        // 获取图片的质量信息
                        QualityInfo qualityInfo = imageInfo.getQualityInfo();
                        Log.e("获取图片质量","Final image received! "+

                                "\nSize: "+ imageInfo.getWidth()//图片宽

                        +"x"+ imageInfo.getHeight()//图片高

                        +"\nQuality level:"+qualityInfo.getQuality()//图片等级

                        +"\ngood enough:"+qualityInfo.isOfGoodEnoughQuality()//图片是否效果完全显示

                        +"\nfull quality:"+ qualityInfo.isOfFullQuality());
                    }
                   // 渐进式加载图片回调(只有启用图片的渐进式,方有效)
                    @Override
                    public void onIntermediateImageSet(String id,ImageInfo imageInfo) {
                        super.onIntermediateImageSet(id, imageInfo);
                        Log.e("启动渐进", "IntermediateImageSet image receiced");
                    }
                    // 加载图片失败回调
                    @Override
                    public void onFailure(String id, Throwable throwable) {
                        super.onFailure(id, throwable);
                        //这里的id参数就是图片加载失败的打印信息
                        Log.e("加载图片失败", "Error loading" + id);
                    }
                };
                // 图片地址

                Uri uri = Uri.parse("http://h.hiphotos.baidu.com/zhidao/pic/item/58ee3d6d55fbb2fbac4f2af24f4a20a44723dcee.jpg");

    // 加载质量配置,为了实现节省CPU,随着图片下载的进行,下载完的扫描序列如下: 1, 4, 5, 10

    /* 首次调用getNextScanNumberToDecode返回为2,因为初始时,解码的扫描数为0。

    那么1将不会解码,下载完成4个扫描时,解码一次。下个解码为扫描数为6(5不会解码,10才会解码)*/
             ProgressiveJpegConfig jpegConfig=new ProgressiveJpegConfig() {
                 @Override
                 public int getNextScanNumberToDecode(int scanNumber) {
                     return scanNumber + 2;
                 }

                 @Override
                 public QualityInfo getQualityInfo(int scanNumber) {
                     boolean isGoodEnough =(scanNumber >= 5);
                     return ImmutableQualityInfo.of(scanNumber,isGoodEnough, false);
                 }
             };

            //上面的和下面一行是固定代码.使用使复制粘贴即可
            ImagePipelineConfig.newBuilder(this).setProgressiveJpegConfig(jpegConfig).build();
                // 图片请求,
                ImageRequest request =ImageRequestBuilder.newBuilderWithSource(uri)//指定加载图片地址
                    .setProgressiveRenderingEnabled(true)打开渐进渲染
                    .build();
                    // 图片加载的控制
                    DraweeController controller =Fresco.newDraweeControllerBuilder()
                    .setOldController(sdv_fresco_listener.getController())
                    .setImageRequest(request)
                    //设置监听器监听图片的加载
                    .setControllerListener(controllerListener)
                    .build();
                   // 加载图片
                   sdv_fresco_listener.setController(controller);
                break;

★★★★★★★★★★★★★★★★★图片缩放和旋转★★★★★★★★★★★★★★★★★

case R.id.bt_fresco_resize://缩放图片
                //图片的请求
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                        //重新设置这张图片的宽高.以便解决内存
                        .setResizeOptions(new ResizeOptions(50, 50))
                        .build();
                // 控制图片的加载
                PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setOldController(sdv_fresco_resize.getController())
                        .setImageRequest(request)
                        .build();
                // 加载图片
                sdv_fresco_resize.setController(controller);
                break;
            case R.id.bt_fresco_autoRotate://自动旋转
                RotationOptions rotationOptions = RotationOptions.forceRotation(RotationOptions.ROTATE_90);
                ImageRequest build = ImageRequestBuilder.newBuilderWithSource(uri)
                        .setRotationOptions(rotationOptions)
                        .build();
                PipelineDraweeController autoRotate = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setImageRequest(build)
                        .build();
                sdv_fresco_resize.setController(autoRotate);
                break;

★★★★★★★★★★★★★★★★★修改图片★★★★★★★★★★★★★★★★★

 case R.id.bt_fresco_modify:
                // 图片地址
                Uri uri = Uri.parse("http://c.hiphotos.baidu.com/image/pic/item/962bd40735fae6cd21a519680db30f2442a70fa1.jpg");
                // 修改图片
                Postprocessor postProcessor=new BasePostprocessor() {
                    @Override
                    //重新Postprocessor名称.
                    public String getName() {
                        return "postProcessor";
                    }
                    @Override
                    //具体的进行绘制,bitmap就是下载过来的图片,绘制红色点状网络
                    public void process(Bitmap bitmap) {
                        for (int x = 0; x < bitmap.getWidth(); x += 2) {
                            for (int y = 0; y < bitmap.getHeight(); y += 2) {
                                //给图片点设置颜色,参数X轴,Y轴,颜色
                                bitmap.setPixel(x, y, Color.RED);
                            }
                        }
                    }
                };

            // 创建图片请求
            ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
            //对加载进行处理.参数就是处理的模型Postprocessor对象.
                    .setPostprocessor(postProcessor)
                    .build();
            // 控制加载
            PipelineDraweeController controller = (PipelineDraweeController)Fresco.newDraweeControllerBuilder()
                    .setOldController(sdv_fresco_modify.getController())
                    .setImageRequest(request)
                    .build();
            // 加载图片
            sdv_fresco_modify.setController(controller);
                break;

★★★★★★★★★★★★★★★★★动态展示图片★★★★★★★★★★★★★★★★★

mSimpleDraweeView = new SimpleDraweeView(this);
        //设置控件的宽高比 参数如果大于1,在宽度是高度的几倍
        mSimpleDraweeView.setAspectRatio(0.5f);
case R.id.bt_fresco_loadsmall://动态设置图片
                // 图片的地址
                Uri uri = Uri.parse("http://ww4.sinaimg.cn/mw690/9844520fjw1f4fqrpw1fvj21911wlb2b.jpg");
                //图片请求
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).build();
                //加载图片的控制
                AbstractDraweeController build = Fresco.newDraweeControllerBuilder()
                        .setOldController(mSimpleDraweeView.getController())
                        .setImageRequest(request)
                        .build();
                //加载图片
                mSimpleDraweeView.setController(build);
                ll_fresco.addView(mSimpleDraweeView);
                break;

★★★★★★★★★★★★★★★Fresco添加磁盘缓存★★★★★★★★★★★★★★★★★★★

  @Override
    public void onCreate() {
        super.onCreate();
        //磁盘缓存
        DiskCacheConfig diskCacheConfig=DiskCacheConfig.newBuilder(this)
                .setBaseDirectoryName("images")
                .setBaseDirectoryPath(Environment.getExternalStorageDirectory())
                .build();
        //配置
        ImagePipelineConfig config=ImagePipelineConfig.newBuilder(this)
                .setMainDiskCacheConfig(diskCacheConfig)
                .build();
        Fresco.initialize(this,config);
    }

记得添加sd卡权限

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值