fresco几种图片加载效果

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

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView image;
    private Uri uri = Uri.parse("http://img.zcool.cn/community/01dc845668e8a032f875a5289bc703.jpg");
    private GenericDraweeHierarchyBuilder builder;
    private RoundingParams parames;
    private TextView text;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text = findViewById(R.id.text);
        image = findViewById(R.id.image);
        findViewById(R.id.progress).setOnClickListener(this);
        findViewById(R.id.center).setOnClickListener(this);
        findViewById(R.id.center_crop).setOnClickListener(this);
        findViewById(R.id.focus_crop).setOnClickListener(this);
        findViewById(R.id.center_inside).setOnClickListener(this);
        findViewById(R.id.fit_center).setOnClickListener(this);
        findViewById(R.id.fit_start).setOnClickListener(this);
        findViewById(R.id.fit_end).setOnClickListener(this);
        findViewById(R.id.fit_xy).setOnClickListener(this);
        findViewById(R.id.none).setOnClickListener(this);
        findViewById(R.id.circle).setOnClickListener(this);
        findViewById(R.id.round).setOnClickListener(this);
        findViewById(R.id.gradually).setOnClickListener(this);
        findViewById(R.id.high_and_low).setOnClickListener(this);
        findViewById(R.id.thumbnail).setOnClickListener(this);
        findViewById(R.id.local_picture_multiplexing).setOnClickListener(this);
        findViewById(R.id.listener).setOnClickListener(this);
        findViewById(R.id.modify_resource_size).setOnClickListener(this);
        findViewById(R.id.modify).setOnClickListener(this);
        findViewById(R.id.bt_fresco_gif).setOnClickListener(this);
        findViewById(R.id.bt_fresco_resize).setOnClickListener(this);
        findViewById(R.id.dynamic_diaplay).setOnClickListener(this);
        //创建Builder对象,一般创建出参数对象
        builder = new GenericDraweeHierarchyBuilder(getResources());
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.bt_fresco_gif:
          //请求GIF动画,采用MVC的设计模式(注意加载GIF动画还要添加依赖)
         /* 支持 GIF 动图,需要添加:compile 'com.facebook.fresco:animated-gif:0.14.1' */
         //GIF动画网址,加载需要一段时间
                Uri uri1 = Uri.parse("http://s1.dwstatic.com/group1/M00/6E/E4/801cd8b56959a9bd72197b5b6a3757b4.gif");
                DraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setUri(uri1)//设置GIF网址
                        .setAutoPlayAnimations(false)//是否自动播放动画,false为不播放
                        .setOldController(image.getController())//内存优化
                        .build();

                image.setController(controller);

             // 动画停止
             //拿到动画对象
                Animatable animatableStop = image.getController().getAnimatable();
            //进行非空及是否动画在播放判断
                if (animatableStop != null && animatableStop.isRunning()) {
             //动画在播放,停止动画播放
                    animatableStop.stop();
                }

          // 动画开始
         //拿到动画对象
                Animatable animatableStart = image.getController().getAnimatable();

         //进行非空及是否动画在播放判断
                if (animatableStart != null && !animatableStart.isRunning()) {
         //动画停止播放,播放动画
                    animatableStart.start();
                }
                break;
            case R.id.bt_fresco_resize:
              /*  RotationOptions rotationOptions = RotationOptions.forceRotation(360);
                ImageRequest build = ImageRequestBuilder.newBuilderWithSource(getUriForFresco(this, R.mipmap.ic_launcher))
                        .setRotationOptions(rotationOptions)
                        .build();
                PipelineDraweeController c = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setImageRequest(build)
                        .build();
                image.setController(c);*/
                break;
            case R.id.progress:
                //创建参数对象,设置其样式为进度条
                GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build();
                //将参数对象设置给图片控件
                image.setHierarchy(hierarchy);
                //控件加载图片,参数:网络图片的网址.
                image.setImageURI(uri);
                break;
            case R.id.center:
                // 样式设置,使图片只显示中间的部分
                GenericDraweeHierarchy CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build();
                imageDisplay(CENTER);
                break;
            case R.id.center_crop:
                GenericDraweeHierarchy CENTER_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP).build();
                imageDisplay(CENTER_CROP);
                break;
            case R.id.focus_crop:
                GenericDraweeHierarchy FOCUS_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP).build();
                imageDisplay(FOCUS_CROP);
                break;
            case R.id.center_inside:
                GenericDraweeHierarchy CENTER_INSIDE = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE).build();
                imageDisplay(CENTER_INSIDE);
                break;
            case R.id.fit_center:
                GenericDraweeHierarchy FIT_CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER).build();
                imageDisplay(FIT_CENTER);
                break;
            case R.id.fit_start:
                GenericDraweeHierarchy FIT_START = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_START).build();
                imageDisplay(FIT_START);
                break;
            case R.id.fit_end:
                GenericDraweeHierarchy FIT_END = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_END).build();
                imageDisplay(FIT_END);
                break;
            case R.id.fit_xy:
                GenericDraweeHierarchy FIT_XY = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_XY).build();
                imageDisplay(FIT_XY);
                break;
            case R.id.none:
                GenericDraweeHierarchy NONE = builder.setActualImageScaleType(null).build();
                imageDisplay(NONE);
                break;
            case R.id.circle:
                // 设置圆形图片
                // 设置形状对象,形状为圆形
                parames = RoundingParams.asCircle();
                //创建设置参数,设置一个形状,把形状对象塞入
                GenericDraweeHierarchy roundness = builder.setRoundingParams(parames).build();
                //将参数对象设置给图片控件
                image.setHierarchy(roundness);
                //控件加载图片
                image.setImageURI(uri);
                break;
            case R.id.round:
                // 设置圆角图片
                // 设置形状对象,形状为圆角
                parames = RoundingParams.fromCornersRadius(50f);
                //创建设置参数,设置一个形状,把形状对象塞入
                GenericDraweeHierarchy roundness1 = builder.setRoundingParams(parames).build();
                //将参数对象设置给图片控件
                image.setHierarchy(roundness1);
                //控件加载图片
                image.setImageURI(uri);
                break;
            case R.id.gradually:
                // 加载质量配置,为了实现节省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 对象.
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)//设置URL
                        .setProgressiveRenderingEnabled(true)//打开渐进 渲染
                        .build();
                DraweeController draweeController = Fresco.newDraweeControllerBuilder()
                        //必须要设置ImageRequest对象,里面包含了图片的网址.
                        .setImageRequest(request)
                        //开启用户点击重新加载图片的功能
                        .setTapToRetryEnabled(true)
                        //会复用以前的对象,可以节省内存.
                        .setOldController(image.getController())
                        .build();
                // 1设置加载的控制
                image.setController(draweeController);
                break;
            case R.id.high_and_low:
                // 先显示低分辨率的图,然后是高分辨率的图,MVC的设计模式
                // 同一个图片,不同分辨率的两个URL地址
                Uri lowUri = Uri.parse("http://img1.gamedog.cn/2012/03/11/19-120311133617-50.jpg");
                // 控制加载图片
                DraweeController controller1 = Fresco.newDraweeControllerBuilder()
                        //一开始加载一个低分辨率的URL
                        .setLowResImageRequest(ImageRequest.fromUri(lowUri))
                        //然后加载一个高分辨率的URL,你真正要加载的图片
                        .setImageRequest(ImageRequest.fromUri(uri))
                        .build();
                // 加载图片
                image.setController(controller1);
                break;
            case R.id.thumbnail:
                // 本地缩略图预览
                // 图片地址,参数1.File对象, 从手机手机SD卡里加载一张图片
                Uri local_uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/shuaige.jpg"));
                // 加载图片的请求
                ImageRequest request1 = ImageRequestBuilder.newBuilderWithSource(local_uri)
                        //开启缩略图预览模式
                        .setLocalThumbnailPreviewsEnabled(true)
                        .build();
                // 控制图片的加载
                DraweeController preview = Fresco.newDraweeControllerBuilder()
                        .setImageRequest(request1)
                        .build();
                // 加载图片
                image.setController(preview);
                break;
            case R.id.local_picture_multiplexing:
                //本地图片的复用
                //在请求之前,还会去内存中请求一次图片,没有才会先去本地,最后去网络uri
                //本地准备复用图片的uri 如果本地这个图片不存在,会自动去加载下一个uri
                // 本地图片的地址
                Uri uri2 = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/shuaige.jpg"));
                //图片的网址uri
                //创建ImageRequest对象,将其放入ImageRequest[]数组中.
                ImageRequest request2 = ImageRequest.fromUri(uri2);
                ImageRequest request3 = ImageRequest.fromUri(uri);
                ImageRequest[] requests = {request2, request3};
                // 控制加载图片
                DraweeController reuse = Fresco.newDraweeControllerBuilder()
                        //设置加载图片的顺序.参数ImageRequest[]数组
                        .setFirstAvailableImageRequests(requests)
                        .setOldController(image.getController())
                        .build();
                // 加载图片
                image.setController(reuse);
                break;
            case R.id.listener:
                // 加载质量配置,为了实现节省CPU,随着图片下载的进行,下载完的扫描序列如下: 1, 4, 5, 10
                /* 首次调用getNextScanNumberToDecode返回为2, 因为初始时,解码的扫描数为0。
                 那么1将不会解码,下载完成4个扫描时,解码一次。下个解码为扫描数为6(5不会解码,10才会解码)*/
                ProgressiveJpegConfig jpegConfig1 = 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(jpegConfig1).build();
                // 图片请求,
                ImageRequest request4 = ImageRequestBuilder.newBuilderWithSource(uri)//指定加载图片地址
                        .setProgressiveRenderingEnabled(true)打开渐进 渲染
                        .build();
                ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
                    // 加载图片完毕回调
                    @SuppressLint("SetTextI18n")
                    @Override
                    public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {
                        super.onFinalImageSet(id, imageInfo, animatable);
                        //图片信息对象非空判断
                        if (imageInfo == null) {
                            return;
                        }
                        // 获取图片的质量信息
                        QualityInfo qualityInfo = imageInfo.getQualityInfo();
                        text.setText("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);
                        text.setText("IntermediateImageSet image receiced");
                    }

                    // 加载图片失败回调
                    @Override
                    public void onFailure(String id, Throwable throwable) {
                        super.onFailure(id, throwable);
                        //这里的id参数就是图片加载失败的打印信息
                        text.setText("Error loading" + id);
                    }
                };
                // 图片加载的控制
                DraweeController controller5 = Fresco.newDraweeControllerBuilder()
                        .setOldController(image.getController())
                        .setImageRequest(request4)
                        //设置监听器监听图片的加载
                        .setControllerListener(controllerListener)
                        .build();
                // 加载图片
                image.setController(controller5);
                break;
            case R.id.modify_resource_size:
                //图片的请求
                ImageRequest request5 = ImageRequestBuilder.newBuilderWithSource(uri)
                        //重新设置这张图片的宽高.以便解决内存
                        .setResizeOptions(new ResizeOptions(50, 50))
                        .build();
                // 控制图片的加载
                PipelineDraweeController controller2 = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setOldController(image.getController())
                        .setImageRequest(request5)
                        .build();
                // 加载图片
                image.setController(controller2);
                break;
            case R.id.modify:
                // 修改图片
                Postprocessor postProcessor = new BasePostprocessor() {
                    //重新Postprocessor名称.
                    @Override
                    public String getName() {
                        return "postProcessor";
                    }

                    //具体的进行绘制,bitmap就是下载过来的图片,绘制红色点状网络
                    @Override
                    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 request6 = ImageRequestBuilder.newBuilderWithSource(uri)
                        //对加载进行处理.参数就是处理的模型Postprocessor对象.
                        .setPostprocessor(postProcessor)
                        .build();
                // 控制加载
                PipelineDraweeController controller3 = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setOldController(image.getController())
                        .setImageRequest(request6)
                        .build();
                // 加载图片
                image.setController(controller3);
                break;
            case R.id.dynamic_diaplay:
                startActivity(new Intent(MainActivity.this,Show.class));
                //Toast.makeText(MainActivity.this,"---",Toast.LENGTH_LONG).show();

                break;
        }
    }


    private void imageDisplay(GenericDraweeHierarchy hierarchy) {
        // 加载图片
        image.setHierarchy(hierarchy);
        image.setImageURI(uri);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值