Fresco的使用及简单的几种用法

 //Fresco,无论使用哪个模块的功能,都必须要添加的基础依赖
  compile 'com.facebook.fresco:fresco:0.14.1'


// 仅支持 WebP 静态图,需要添加

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


// 支持 GIF 动图,需要添加 

  compile 'com.facebook.fresco:animated-gif:0.14.1'


// 支持 WebP静态图及 WebP 动图,需要添加

  compile 'com.facebook.fresco:animated-webp:0.14.1'

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


//  API < 14 上的机器支持 WebP 时,需要添加

  compile 'com.facebook.fresco:animated-base-support:0.14.1'


application中初始化Fresco(记得在清单文件里配置application)

   Fresco.initialize(this);

配置网络权限 

   

xml布局文件中,加入命名空间

    xmlns:fresco="http://schemas.android.com/apk/res-auto">


xml中引入SimpleDraweeView控件(fresco:placeholderImage="@drawable/my_drawable":默认占位图片)

    android:id="@+id/my_image_view"

    android:layout_width="130dp"

    android:layout_height="130dp"

    fresco:placeholderImage="@drawable/my_drawable"

  />

//加载网络图片的网址

Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png");

//初始化控件

SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view);

//加载图片

draweeView.setImageURI(uri);

带进度条的图片
//所要加载图片的网址
Uri uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
//创建Builder对象,一般创建出参数对象
GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());
//创建参数对象,设置其样式为进度条
GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build();
//将参数对象设置给图片控件
myImageView.setHierarchy(hierarchy);
//控件加载图片,参数:网络图片的网址.
myImageView.setImageURI(uri);
 
  
 
  
图片的不同裁剪
//主线程中
 
  
builder = new GenericDraweeHierarchyBuilder(getResources());
//点击事件
 
  
case R.id.btn1:
            // 设置描述
            tvFrescoExplain.setText("居中,无缩放");
            // 样式设置,使图片只显示中间的部分
            GenericDraweeHierarchy CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build();
            // 显示图片
            imageDisplay(CENTER);
            break;

        case R.id.btn2:
            // 设置描述
            tvFrescoExplain.setText("保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示");
            // 样式设置,使图片按比例缩小或放大,且裁剪成正方形.
            GenericDraweeHierarchy CENTER_CROP =builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP).build();
            // 图片显示
            imageDisplay(CENTER_CROP);
            break;

        case R.id.btn3:
            // 设置描述
            tvFrescoExplain.setText("同centerCrop, 但居中点不是中点,而是指定的某个点,这里我设置为图片的左上角那点");
            //指定中心点位置
            PointF point = new PointF(0,0);
            //根据指定的点设置为图片中心,使图片按比例缩小或放大,且裁剪成正方形.
            GenericDraweeHierarchy FOCUS_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP)
                    .setActualImageFocusPoint(point).build();
            // 图片显示
            imageDisplay(FOCUS_CROP);
            break;

        case R.id.btn4:
            // 设置描述
            tvFrescoExplain.setText("使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片");
            // 样式设置,使图片按比例显示在控件内,
            GenericDraweeHierarchy CENTER_INSIDE =builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE).build();
            // 图片显示
            imageDisplay(CENTER_INSIDE);
            break;

        case R.id.btn5:
            // 设置描述
            tvFrescoExplain.setText("保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示");
            // 样式设置,保持宽高比例,对图片进行缩或放,图片位置居中显示(效果和上面一种类似)
            GenericDraweeHierarchy FIT_CENTER =builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER).build();
            // 图片显示
            imageDisplay(FIT_CENTER);
            break;

        case R.id.btn6:
            // 设置描述
            tvFrescoExplain.setText("保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,不居中,和显示边界左上对齐");
            // 样式设置,保持宽高比例,对图片进行缩或放,图片位置,不居中,和显示边界左上对齐
            GenericDraweeHierarchy FIT_START =builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_START).build();
            // 图片显示
            imageDisplay(FIT_START);
            break;

        case R.id.btn7:
            // 设置描述
            tvFrescoExplain.setText("保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,不居中,和显示边界右下对齐");
            // 样式设置,保持宽高比例,对图片进行缩或放,图片位置,不居中,和显示边界右下对齐
            GenericDraweeHierarchy FIT_END =builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_END).build();
            // 图片显示
            imageDisplay(FIT_END);
            break;

        case R.id.btn8:
            // 设置描述
            tvFrescoExplain.setText("不保持宽高比,填充满显示边界");
            // 样式设置,使图片填充整个控件,不保证宽高比例.
            GenericDraweeHierarchy FIT_XY = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_XY).build();
            // 图片显示
            imageDisplay(FIT_XY);
            break;

        case R.id.btn9:
            // 设置描述
            tvFrescoExplain.setText("如要使用title mode显示, 需要设置为none");
            // 样式设置
            GenericDraweeHierarchy hierarchy = builder.setActualImageScaleType(null).build();
            // 图片显示
            imageDisplay(hierarchy);
            break;
    }
}
private void imageDisplay(GenericDraweeHierarchy hierarchy) {
    // 加载图片
    Uri uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
    myImageView.setHierarchy(hierarchy);
    myImageView.setImageURI(uri);
}
 
  
 
  
圆形和圆角图片
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_circle_and_corner);
    ButterKnife.bind(this);
    builder = new GenericDraweeHierarchyBuilder(getResources());
    uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
}

@OnClick({R.id.btn1, R.id.btn2})
public void onViewClicked(View view) {
    switch (view.getId()) {
        case R.id.btn1:
            params = RoundingParams.asCircle();
            //创建设置参数,设置一个形状,把形状对象塞入
            GenericDraweeHierarchy roundness = builder.setRoundingParams(params).build();
            //将参数对象设置给图片控件
            myImageView.setHierarchy(roundness);
            //控件加载图片
            myImageView.setImageURI(uri);
            break;

        case R.id.btn2:
            roundingParams = RoundingParams.fromCornersRadius(50f);
            GenericDraweeHierarchy circularBead = builder.setRoundingParams(roundingParams).build();
            myImageView.setHierarchy(circularBead);
            // 加载图片
            myImageView.setImageURI(uri);
            break;
    }
}
 
  
 
  
渐进式展示图片
 
  
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_jpeg);
    ButterKnife.bind(this);
    uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
}
// 加载质量配置,为了实现节省CPU,随着图片下载的进行,下载完的扫描序列如下: 1, 4, 5, 10
    /* 首次调用getNextScanNumberToDecode返回为2, 因为初始时,解码的扫描数为0。
    那么1将不会解码,下载完成4个扫描时,解码一次。下个解码为扫描数为6(5不会解码,10才会解码)*/
@OnClick(R.id.btn)
public void onViewClicked() {
    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)//设置URL
            .setProgressiveRenderingEnabled(true)//打开渐进 渲染
            .build();
    DraweeController draweeController = Fresco.newDraweeControllerBuilder()
            //必须要设置ImageRequest对象,里面包含了图片的网址.
            .setImageRequest(request)
            //开启用户点击重新加载图片的功能
            .setTapToRetryEnabled(true)
            //会复用以前的对象,可以节省内存.
            .setOldController(myImageView.getController())
            .build();
    // 1设置加载的控制
    myImageView.setController(draweeController);
}
 
  
 
  
GIF动画图片
 
  
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_gif);
    ButterKnife.bind(this);
    uri = Uri.parse("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1514215468722&di=0bfc021987ca0c9a843923bc2707714b&imgtype=0&src=http%3A%2F%2Fimg2.ph.126.net%2F8F_xhNZSxkEkEqmIsiAATg%3D%3D%2F1834090948346827460.gif");
}

@OnClick({R.id.btn, R.id.btn1, R.id.btn2})
public void onViewClicked(View view) {
    switch (view.getId()) {
        case R.id.btn:
            DraweeController controller = Fresco.newDraweeControllerBuilder()
                    .setUri(uri)//设置GIF网址
                    .setAutoPlayAnimations(false)//是否自动播放动画,false为不播放
                    .setOldController(myImageView.getController())//内存优化
                    .build();
            myImageView.setController(controller);
            break;
        case R.id.btn1:
            Animatable animatableStart = myImageView.getController().getAnimatable();
            //进行非空及是否动画在播放判断
            if(animatableStart != null && !animatableStart.isRunning()) {
            //动画停止播放,播放动画
                animatableStart.start();
            }
            break;
        case R.id.btn2:
            Animatable animatableStop = myImageView.getController().getAnimatable();
            //进行非空及是否动画在播放判断
            if(animatableStop != null && animatableStop.isRunning()) {
            //动画在播放,停止动画播放
                animatableStop.stop();
            }
            break;
    }
}
 
  
 
  
多图请求及图片复用
 
  
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_multi);
    ButterKnife.bind(this);
    lowUri = Uri.parse("http://img1.gamedog.cn/2012/03/11/19-120311133617-50.jpg");
    highUri = Uri.parse("http://img5.duitang.com/uploads/item/201312/03/20131203153823_Y4y8F.jpeg");

}

@OnClick({R.id.btn, R.id.btn1, R.id.btn2})
public void onViewClicked(View view) {
    switch (view.getId()) {
        case R.id.btn:
            // 控制加载图片
            DraweeController controller = Fresco.newDraweeControllerBuilder()
            //一开始加载一个低分辨率的URL
                    .setLowResImageRequest(ImageRequest.fromUri(lowUri))
            //然后加载一个高分辨率的URL,你真正要加载的图片
                    .setImageRequest(ImageRequest.fromUri(highUri))
                    .build();
            // 加载图片
            myImageView.setController(controller);
            break;

        case R.id.btn1:
            Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() +"/shuaige.jpg"));
            // 加载图片的请求
            ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
            //开启缩略图预览模式
                    .setLocalThumbnailPreviewsEnabled(true)
                    .build();
            // 控制图片的加载
            DraweeController preview = Fresco.newDraweeControllerBuilder()
                    .setImageRequest(request)
                    .build();
            // 加载图片
            myImageView.setController(preview);
            break;
        case R.id.btn2:
            Uri uri1 = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/shuaige.jpg"));
            //图片的网址
            Uri uri2 = Uri.parse("http://img5.duitang.com/uploads/item/201312/03/20131203153823_Y4y8F.jpeg");
            //创建ImageRequest对象,将其放入ImageRequest[]数组中.
            ImageRequest request1 = ImageRequest.fromUri(uri1);
            ImageRequest request2 = ImageRequest.fromUri(uri2);
            ImageRequest[] requests = {request1, request2};
            // 控制加载图片
            DraweeController reuse = Fresco.newDraweeControllerBuilder()
            //设置加载图片的顺序.参数ImageRequest[]数组
                    .setFirstAvailableImageRequests(requests)
                    .setOldController(myImageView.getController())
                    .build();
            // 加载图片
            myImageView.setController(reuse);

            break;
    }
}
 
  
 
  
图片加载监听
 
  
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listener_avtivity);
    ButterKnife.bind(this);
    // Uri uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");

}

@OnClick(R.id.btn)
public void onViewClicked() {
    Uri uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
    ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
        @Override
        public void onFinalImageSet(
                String id,
                @Nullable ImageInfo imageInfo,
                @Nullable Animatable anim) {
            if (imageInfo == null) {
                return;
            }
            QualityInfo qualityInfo = imageInfo.getQualityInfo();
            t1.setText("宽:"+imageInfo.getWidth());
            t2.setText("高:"+imageInfo.getHeight()+"");
            t3.setText("图片等级:"+qualityInfo.getQuality()+"");
            t4.setText("图片效果是否完全显示:"+qualityInfo.isOfGoodEnoughQuality()+"");
            boolean ofFullQuality = qualityInfo.isOfFullQuality();
            t5.setText("图片是否完全显示" + ofFullQuality );
        }

        @Override
        public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
            //FLog.d("Intermediate image received");
        }

        @Override
        public void onFailure(String id, Throwable throwable) {
            FLog.e(getClass(), throwable, "Error loading %s", id);
        }
    };


    DraweeController controller = Fresco.newDraweeControllerBuilder()
            .setControllerListener(controllerListener)
            .setUri(uri)
            .build();
    myImageView.setController(controller);
}
 
  
 
  
图片旋转
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_modify_img);
    ButterKnife.bind(this);
    uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
    myImageView.setImageURI(uri);
}

@OnClick(R.id.btn)
public void onViewClicked() {
    rotate(myImageView,RotationOptions.ROTATE_90);
}
private void rotate(SimpleDraweeView img, int rotate) {
    RotationOptions rotationOptions = RotationOptions.forceRotation(rotate);
    ImageRequest build = ImageRequestBuilder.newBuilderWithSource(uri)
            .setRotationOptions(rotationOptions)
            .build();
    PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
            .setImageRequest(build)
            .build();
    myImageView.setController(controller);
}
 
  
 
  
修改图片
 
  
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_resize);
        ButterKnife.bind(this);
        uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
    }


    @OnClick(R.id.btn)
    public void onViewClicked() {
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
//重新设置这张图片的宽高.以便解决内存
                .setResizeOptions(new ResizeOptions(50, 50))
                .build();
// 控制图片的加载
        PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                .setOldController(myImageView.getController())
                .setImageRequest(request)
                .build();
// 加载图片
        myImageView.setController(controller);

    }
 
  
 
  
动态展示图片
 
  
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_auto_size_img);
        ButterKnife.bind(this);
        uri = Uri.parse("https://img-my.csdn.net/uploads/201407/26/1406383264_8243.jpg");
    }

    @OnClick(R.id.btn)
    public void onViewClicked() {
        ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                .build();
// 加载图片的控制
        PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                .setOldController(myImageView.getController())
                .setImageRequest(request)
                .build();
// 加载图片
        myImageView.setController(controller);
// 将simpleDraweeView控件对象,添加到线性布局中
       // ll_fresco.addView(simpleDraweeView);

    }
 
  
 
  

你可能感兴趣的:(Fresco的使用及简单的几种用法)