fresco的多种要求


fresco的多种要求

fresco的多种要求

使用fresco需要添加依赖,一般只用添加一个就可以,但是如果需要做多种操作的话就需要添加其他的

优势:底层直接用C语言,对于内存的管理特别强大,,一张图片,如果你用Picasso去处理,内存占用80%,那么fresco就是40%
Fresco遇到什么问题,你可以在Issues上面进行提问,或者找一下,看其他人遇到了吗
第三方:Fresco,RxJava,EventBus,Retrofit,
依赖包太大,APK的体积过大,如果你app,apk体积一个G,还有一个APP功能和你一样,体积12M
apk瘦身,以后说
因此你使用Fresco,根据你的需求,你去依赖对应依赖包
webP图片的一种格式,apk瘦身里面的知识点,以后说
如果你用Fresco,他会导致你项目耦合度过高
SimpleDraweeView,加载图片必须用这个空间,而不是ImageView,
这会导致你要是弃用Fresco,修改的地方就特别多

几百个类里面的SimpleDraweeView改成ImageView

 Fresco
优点:
1,使用简便,学习成本低
2,十分强大,使用起来非常流畅,内存管理不用愁,不用担心OOM。
3,自带加载时淡入效果,开发起来不费劲.
4,图片加载时可在布局中直接设置加载动画等等,代码量大大减少
缺点:
1,必须使用fresco自定义的控件,如果需求更换,想要更换其他图片加载框架会有一定的麻烦,比如必须要改布局
2,方法数太多,多达近4k方法,对于比较大的项目来说简直是压死骆驼的最后一个稻草,整项目方法数超过65k,不 得不分包.而且打包之后整个项目整整多了3M.确实大得很.
3,必须全套使用fresco的图片加载,否则连获取简简单单的一个缓存中的bitmap都异常费劲
总结:
如果自己的项目不是社交软件,涉及到特别多图片加载的话,还是慎用吧.
当然,在我的印象中,fresco就是你项目中图片加载处理的专业管家,几乎一切繁杂的事情它都帮你处理妥当,用起来简直贴心.

依赖

//fresco图片依赖
compile 'com.facebook.fresco:fresco:1.5.0'
compile 'com.facebook.fresco:animated-gif:1.5.0'//加载gif动图需添加此库
compile 'com.facebook.fresco:animated-webp:1.5.0'//加载webp动图需添加此库
compile 'com.facebook.fresco:webpsupport:1.5.0'//支持webp需添加此库
compile 'com.facebook.fresco:imagepipeline-okhttp3:1.5.0'//网络实现层使用okhttp3需添加此库
compile 'jp.wasabeef:fresco-processors:[email protected]'//用于提供fresco的各种图片变换

清单文件中只需要添加一个网络请求权限和fresco的Application

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

主页面

package com.example.lx_fresco;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.view.DongTaiZhanShi;
import com.example.lx_fresco.view.DuoTuQingQiu;
import com.example.lx_fresco.view.GIF;
import com.example.lx_fresco.view.JianJinShi;
import com.example.lx_fresco.view.JinDuTiao;
import com.example.lx_fresco.view.Main2Activity;
import com.example.lx_fresco.view.TuPianJianTing;
import com.example.lx_fresco.view.XiuGaiNeiCunDaXiao;
import com.example.lx_fresco.view.XiuGaiTuPian;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.decoder.ProgressiveJpegConfig;
import com.facebook.imagepipeline.decoder.SimpleProgressiveJpegConfig;
import com.facebook.imagepipeline.image.ImmutableQualityInfo;
import com.facebook.imagepipeline.image.QualityInfo;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

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

    private void initView() {
        Button jdt = findViewById(R.id.bt_fresco_spimg);
        Button cj = findViewById(R.id.bt_fresco_crop);
        Button yj = findViewById(R.id.bt_fresco_circleAndCorner);
        Button jj = findViewById(R.id.bt_fresco_jpeg);
        Button gifdh = findViewById(R.id.bt_fresco_gif);
        Button tpfy = findViewById(R.id.bt_fresco_multi);
        Button tpjt = findViewById(R.id.bt_fresco_listener);
        Button sf = findViewById(R.id.bt_fresco_resize);
        Button xg = findViewById(R.id.bt_fresco_modifyImg);
        Button dt = findViewById(R.id.bt_fresco_autoSizeImg);
        jdt.setOnClickListener(this);
        cj.setOnClickListener(this);
        yj.setOnClickListener(this);
        jj.setOnClickListener(this);
        gifdh.setOnClickListener(this);
        tpfy.setOnClickListener(this);
        tpfy.setOnClickListener(this);
        tpjt.setOnClickListener(this);
        sf.setOnClickListener(this);
        xg.setOnClickListener(this);
        dt.setOnClickListener(this);
    }

    //按钮点击事件
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            //带进度条的图片
            case R.id.bt_fresco_spimg:
                Intent intent2 = new Intent(MainActivity.this, JinDuTiao.class);
                startActivity(intent2);
                break;
                //图片的不同裁剪
            case R.id.bt_fresco_crop:
                break;
                //圆形和圆角图片
            case R.id.bt_fresco_circleAndCorner:
                Intent intent = new Intent(MainActivity.this, Main2Activity.class);
                startActivity(intent);
                break;
                //渐进式展示图片
            case R.id.bt_fresco_jpeg:
//                ProgressiveJpegConfig progressiveJpegConfig = 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);
//                    }
//                };
//                //具体含义可参考 http://wiki.jikexueyuan.com/project/fresco/progressive-jpegs.html
//                ImagePipelineConfig.Builder builder = ImagePipelineConfig.newBuilder(this);
//                builder.setProgressiveJpegConfig(progressiveJpegConfig);
//                //默认效果
//                builder.setProgressiveJpegConfig(new SimpleProgressiveJpegConfig());
                    Intent intent1 = new Intent(MainActivity.this, JianJinShi.class);
                    startActivity(intent1);
                break;
                //GIF动画图片
            case R.id.bt_fresco_gif:
                Intent intent3 = new Intent(MainActivity.this, GIF.class);
                startActivity(intent3);
                break;
                //多图请求及图片复用
            case R.id.bt_fresco_multi:

                startActivity(new Intent(MainActivity.this, DuoTuQingQiu.class));
                break;
                //图片加载监听
            case R.id.bt_fresco_listener:
                startActivity(new Intent(MainActivity.this, TuPianJianTing.class));
                break;
                //修改内存中图片大小
            case R.id.bt_fresco_resize:
                startActivity(new Intent(MainActivity.this, XiuGaiNeiCunDaXiao.class));
                break;
                //修改图片
            case R.id.bt_fresco_modifyImg:
                startActivity(new Intent(MainActivity.this, XiuGaiTuPian.class));
                break;
                //动态展示图片
            case R.id.bt_fresco_autoSizeImg:
                startActivity(new Intent(MainActivity.this, DongTaiZhanShi.class));
                break;
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <Button
                android:id="@+id/bt_fresco_spimg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="带进度条的图片"/>

            <Button
                android:id="@+id/bt_fresco_crop"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="图片的不同裁剪"/>

            <Button
                android:id="@+id/bt_fresco_circleAndCorner"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="圆形和圆角图片"/>

            <Button
                android:id="@+id/bt_fresco_jpeg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="渐进式展示图片"/>

            <Button
                android:id="@+id/bt_fresco_gif"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="GIF动画图片"/>

            <Button
                android:id="@+id/bt_fresco_multi"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="多图请求及图片复用"/>

            <Button
                android:id="@+id/bt_fresco_listener"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="图片加载监听"/>

            <Button
                android:id="@+id/bt_fresco_resize"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="修改内存中图片大小"/>

            <Button
                android:id="@+id/bt_fresco_modifyImg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="修改图片"/>

            <Button
                android:id="@+id/bt_fresco_autoSizeImg"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:text="动态展示图片"/>

        </LinearLayout>

    </ScrollView>

</LinearLayout>

MyApplication

package com.example.lx_fresco;

import android.app.Application;

import com.facebook.drawee.backends.pipeline.Fresco;

/**
 * data:2018/06/06.
 * author : 殷成龙(Administrator)
 * function :
 */

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

动态展示图片类DongTaiZhanShi

package com.example.lx_fresco.view;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

import com.example.lx_fresco.MainActivity;
import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

import java.net.URL;

//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
public class DongTaiZhanShi extends AppCompatActivity {

    private Uri uri;
    private SimpleDraweeView img;
    private Button dt;
    private SimpleDraweeView simpleDraweeView;
    private LinearLayout ll;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dong_tai_zhan_shi);
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
        img = findViewById(R.id.img);
        dt = findViewById(R.id.dt);
        ll = findViewById(R.id.ll);

        dt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //创建Fresco加载图片的控件对象
                simpleDraweeView = new SimpleDraweeView(DongTaiZhanShi.this);
                // 设置控件对象的宽高比,必须设置,参数浮点型,大于1,则宽度是高度的几倍.
                simpleDraweeView.setAspectRatio(0.5f);
                //使用控件,并添加到布局中
                // 图片的地址
                // 图片的请求
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                        .build();
                // 加载图片的控制
                PipelineDraweeController controller= (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setOldController(simpleDraweeView.getController())
                        .setImageRequest(request)
                        .build();
                // 加载图片
                simpleDraweeView.setController(controller);
                // 将simpleDraweeView控件对象,添加到线性布局中
                ll.addView(simpleDraweeView);
            }
        });
    }
}

布局(因为动态展示是直接在布局中展示的,所以不需要fresco)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <Button
        android:id="@+id/dt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="加载图片" />


</LinearLayout>

多图请求和图片复用类DuoTuQingQiu

package com.example.lx_fresco.view;

import android.net.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

import java.io.File;

public class DuoTuQingQiu extends AppCompatActivity implements View.OnClickListener {
//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
    private SimpleDraweeView dtqq;
    private Button fbl;
    private Button bdyl;
    private Button bdfy;
    private Uri uri;
    private Uri parse;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_duo_tu_qing_qiu);
        dtqq = findViewById(R.id.dtqq);
        fbl = findViewById(R.id.fbl);
        bdyl = findViewById(R.id.bdyl);
        bdfy = findViewById(R.id.bdfy);

        fbl.setOnClickListener(this);
        bdyl.setOnClickListener(this);
        bdfy.setOnClickListener(this);
        // 先显示低分辨率的图,然后是高分辨率的图,MVC的设计模式
        // 同一个图片,不同分辨率的两个URL地址
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
        //低分辨率图片
        parse = Uri.parse("http://img1.imgtn.bdimg.com/it/u=1616611717,1828515054&fm=11&gp=0.jpg");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.fbl:
                // 控制加载图片
                DraweeController controller = Fresco.newDraweeControllerBuilder()
                //一开始加载一个低分辨率的URL
                        .setLowResImageRequest(ImageRequest.fromUri(parse))
                //然后加载一个高分辨率的URL,你真正要加载的图片
                        .setImageRequest(ImageRequest.fromUri(uri))
                        .build();
                // 加载图片
                dtqq.setController(controller);
                break;
            case R.id.bdyl:
                // 本地缩略图预览
                // 图片地址,参数1.File对象, 从手机手机SD卡里加载一张图片
                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();
                // 加载图片
                dtqq.setController(preview);
                break;
            case R.id.bdfy:
                //本地图片的复用
                //在请求之前,还会去内存中请求一次图片,没有才会先去本地,最后去网络uri
                //本地准备复用图片的uri 如果本地这个图片不存在,会自动去加载下一个uri
                // 本地图片的地址
                Uri uri1 = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/shuaige.jpg"));
                //图片的网址
                Uri uri2 = Uri.parse("http://img1.imgtn.bdimg.com/it/u=1616611717,1828515054&fm=11&gp=0.jpg");
                //创建ImageRequest对象,将其放入ImageRequest[]数组中.
                ImageRequest request1 =ImageRequest.fromUri(uri1);
                ImageRequest request2 =ImageRequest.fromUri(uri2);
                ImageRequest[] requests = {request1,request2};
                // 控制加载图片
                DraweeController reuse =Fresco.newDraweeControllerBuilder()
                //设置加载图片的顺序.参数ImageRequest[]数组
                        .setFirstAvailableImageRequests(requests)
                        .setOldController(dtqq.getController())
                        .build();
                // 加载图片
                dtqq.setController(reuse);
                break;
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/dtqq"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />

    <Button
        android:id="@+id/fbl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="先显示低分辨率的图,然后显示高分辨率的" />

    <Button
        android:id="@+id/bdyl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="本地缩略图预览" />
    <Button
        android:id="@+id/bdfy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="本地图片复用" />

</LinearLayout>

展示GIF图片类GIF

package com.example.lx_fresco.view;

import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");

public class GIF extends AppCompatActivity implements View.OnClickListener {

    private Uri uri;
    private SimpleDraweeView gif;
    private Button stat;
    private Button stop;
    private Button qq;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gif);
        uri = Uri.parse("http://img5.duitang.com/uploads/item/201411/29/20141129013744_UJEuu.gif");
        gif = findViewById(R.id.gif);
        stat = findViewById(R.id.stat);
        stop = findViewById(R.id.stop);
        qq = findViewById(R.id.qq);
        stat.setOnClickListener(this);
        stop.setOnClickListener(this);
        qq.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.qq:
                //请求GIF动画,采用MVC的设计模式(注意加载GIF动画还要添加依赖)
                /* 支持 GIF 动图,需要添加:compile 'com.facebook.fresco:animated-gif:0.14.1' */
                //GIF动画网址,加载需要一段时间
                DraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setUri(uri)//设置GIF网址
                        .setAutoPlayAnimations(false)//是否自动播放动画,false为不播放
                        .setOldController(gif.getController())//内存优化
                        .build();
                gif.setController(controller);
                break;
            case R.id.stat:
                // 动画开始
                //拿到动画对象
                Animatable animatableStart = gif.getController().getAnimatable();
                //进行非空及是否动画在播放判断
                if(animatableStart != null &&!animatableStart.isRunning()) {
                //动画停止播放,播放动画
                    animatableStart.start();
                }
                break;
            case R.id.stop:
                // 动画停止
                //拿到动画对象
                Animatable animatableStop = gif.getController().getAnimatable();
                //进行非空及是否动画在播放判断
                if(animatableStop != null &&animatableStop.isRunning()) {
                //动画在播放,停止动画播放
                    animatableStop.stop();
                }
                break;
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/gif"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />

    <Button
        android:id="@+id/qq"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="请求GIF" />

    <Button
        android:id="@+id/stat"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="开始" />
    <Button
        android:id="@+id/stop"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="停止" />

</LinearLayout>

渐进展示图片类JianJinShi

package com.example.lx_fresco.view;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.decoder.ProgressiveJpegConfig;
import com.facebook.imagepipeline.image.ImmutableQualityInfo;
import com.facebook.imagepipeline.image.QualityInfo;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
public class JianJinShi extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView img;
    private Button btn;
    private Uri uri;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jian_jin_shi);
        img = findViewById(R.id.img);
        btn = findViewById(R.id.btn);
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");

        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn:
                // 加载质量配置,为了实现节省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(img.getController())
                        .build();

                // 1设置加载的控制

                img.setController(draweeController);
                break;
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lx_fresco.view.JianJinShi">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/img"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="请求网络图片" />
</LinearLayout>

进度条展示图片类JinDuTiao

package com.example.lx_fresco.view;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.drawable.ProgressBarDrawable;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.view.SimpleDraweeView;

public class JinDuTiao extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView jdt;
    private Uri uri;
    private Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jin_du_tiao);
        jdt = findViewById(R.id.jdt);
        btn = findViewById(R.id.btn);
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
        btn.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn:
                //创建Builder对象,一般创建出参数对象
                GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources());
                //创建参数对象,设置其样式为进度条
                GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build();
                //将参数对象设置给图片控件
                jdt.setHierarchy(hierarchy);
                //控件加载图片,参数:网络图片的网址.
                jdt.setImageURI(uri);
                break;
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lx_fresco.view.JinDuTiao">
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/jdt"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />
    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:layout_gravity="center"
        android:gravity="center"
        android:text="请求网络图片" />
</LinearLayout>

圆形圆角图片类Main2Activity

package com.example.lx_fresco.view;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder;
import com.facebook.drawee.generic.RoundingParams;
import com.facebook.drawee.view.SimpleDraweeView;

public class Main2Activity extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView img;
    private Button yx;
    private Button yj;
    private Uri uri;
    private GenericDraweeHierarchyBuilder builder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        img = findViewById(R.id.sdv_fresco_circleandcorner);
        yx = findViewById(R.id.bt_fresco_circle);
        yj = findViewById(R.id.bt_fresco_corner);

        yx.setOnClickListener(this);
        yj.setOnClickListener(this);

        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_fresco_circle:
                //builder对象用一个即可,在这里创建出成员变量
                builder = new GenericDraweeHierarchyBuilder(getResources());
                // 设置圆形图片
                // 设置形状对象,形状为圆形
                RoundingParams params = RoundingParams.asCircle();
                //创建设置参数,设置一个形状,把形状对象塞入
                GenericDraweeHierarchy roundness= builder.setRoundingParams(params).build();
                //将参数对象设置给图片控件
                img.setHierarchy(roundness);
                //控件加载图片
                img.setImageURI(uri);
                break;
            case R.id.bt_fresco_corner:
                // 设置圆角图片
                //设置边角的弧度,使其为圆角
                RoundingParams parames = RoundingParams.fromCornersRadius(50f);
                /* //设置图片控件的背景颜色
                parames.setOverlayColor(getResources().getColor(android.R.color.holo_red_light));//覆盖层
                //设置图片的边框颜色及边框的粗细
                parames.setBorder(getResources().getColor(android.R.color.holo_blue_light),5);//边框*/
                //这里的代码和设置圆形图片这一块代码是一种的,唯一不同就是对parames的设置.
                GenericDraweeHierarchy circularBead = builder.setRoundingParams(parames).build();
                img.setHierarchy(circularBead);
                // 加载图片
                img.setImageURI(uri);
                break;
        }
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sdv_fresco_circleandcorner"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />

    <Button
        android:id="@+id/bt_fresco_circle"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="设置圆形图片" />

    <Button
        android:id="@+id/bt_fresco_corner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="设置圆角图片" />

</LinearLayout>

图片监听类TuPianJianTing

package com.example.lx_fresco.view;

import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.controller.ControllerListener;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.decoder.ProgressiveJpegConfig;
import com.facebook.imagepipeline.image.ImageInfo;
import com.facebook.imagepipeline.image.ImmutableQualityInfo;
import com.facebook.imagepipeline.image.QualityInfo;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");

public class TuPianJianTing extends AppCompatActivity implements View.OnClickListener {

    private Uri uri;
    private SimpleDraweeView jt;
    private Button jz;
    private TextView tvv1,tvv2;
    private  ControllerListener controllerListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tu_pian_jian_ting);
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
        jt = findViewById(R.id.jianting);
        jz = findViewById(R.id.jz);
        tvv1 = findViewById(R.id.tvv1);
        tvv2 = findViewById(R.id.tvv2);

        jz.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.jz:
                // 加载质量配置,为了实现节省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(jt.getController())
                        .setImageRequest(request)
                //设置监听器监听图片的加载
                        .setControllerListener(controllerListener)
                        .build();
                // 加载图片
                jt.setController(controller);
                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();
                        tvv1.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);
                        tvv2.setText("IntermediateImageSet image receiced");
                    }
                    // 加载图片失败回调
                    @Override
                    public void onFailure(String id, Throwable throwable) {
                        super.onFailure(id,throwable);
                        //这里的id参数就是图片加载失败的打印信息
                        tvv1.setText("Error loading" + id);
                    }
                };
                break;
        }
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/jianting"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />

    <Button
        android:id="@+id/jz"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="开始加载图片" />

    <TextView
        android:id="@+id/tvv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="111"
         />
    <TextView
        android:id="@+id/tvv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="加载图片失败回调"
        />

</LinearLayout>

修改图片内存大小类XiuGaiNeiCunDaXiao

package com.example.lx_fresco.view;

import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.common.ResizeOptions;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");

public class XiuGaiNeiCunDaXiao extends AppCompatActivity {

    private Uri uri;
    private Button ncdx;
    private SimpleDraweeView xgnc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xiu_gai_nei_cun_da_xiao);
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
        ncdx = findViewById(R.id.tpncdx);
        xgnc = findViewById(R.id.xgdx);

        ncdx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //图片的请求
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
                //重新设置这张图片的宽高.以便解决内存
                        .setResizeOptions(new ResizeOptions(50, 50))
                        .build();
                // 控制图片的加载
                PipelineDraweeController controller= (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setOldController(xgnc.getController())
                        .setImageRequest(request)
                        .build();
                // 加载图片
                xgnc.setController(controller);
            }
        });
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/xgdx"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/ic_launcher_background" />

    <Button
        android:id="@+id/tpncdx"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="修改内存中图片大小" />


</LinearLayout>

修改图片类(给图片添加网格)XiuGaiTuPian

package com.example.lx_fresco.view;

import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.example.lx_fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.BasePostprocessor;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.imagepipeline.request.Postprocessor;

//Uri uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
public class XiuGaiTuPian extends AppCompatActivity {

    private Uri uri;
    private SimpleDraweeView img;
    private Button wangge;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xiu_gai_tu_pian);
        uri = Uri.parse("https://t12.baidu.com/it/u=3995997152,3688379538&fm=173&app=25&f=JPEG?w=554&h=413&s=41459B465FB5B25954D9D41B0300C083");
        img = findViewById(R.id.img);
        wangge = findViewById(R.id.wangge);

        wangge.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 修改图片
                Postprocessor postProcessor = new BasePostprocessor(){
                //重新Postprocessor名称.
                    public String StringgetName() {
                        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 request = ImageRequestBuilder.newBuilderWithSource(uri)
                //对加载进行处理.参数就是处理的模型Postprocessor对象.
                        .setPostprocessor(postProcessor)
                        .build();
                // 控制加载
                PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
                        .setOldController(img.getController())
                        .setImageRequest(request)
                        .build();
                // 加载图片
                img.setController(controller);
            }
        });
    }
}

布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/img"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@drawable/sss" />

    <Button
        android:id="@+id/wangge"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="图片添加网格" />

</LinearLayout>

圆角和圆形直接在布局中也可以实现

不过使用fresco时不仅仅要添加依赖,在布局中一定要添加一行代码,不然出不来

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