Fresco加载图片

简介:
由Facebook最新推出的一款用于Android应用中展示图片的强大图片库,采用MVC设计模式。(被誉为最好的图片处理框架,facebook出品,必出精品)
优势:
底层直接用的是C语言,所以对于内存的管理特别强大,一张图片如果 picasso 来处理要用80%的话,那么fresco只占40%,必须使用它的自定义控件(这一点也是弊端,导致如果后期更换图片处理框架,不用Fresco,会特别麻烦),设置src属性,可以直接引用GIF…,各方面都不用管的.

•Fresco中的image pipeline模块。负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。
•Fresco中的Drawees 模块,显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。
五大特点:
内存管理:在5.0以下系统,Fresco将图片放到一个特别的内存区域。然而,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM.(内存分配采用:系统匿名共享内存)

渐进式呈现图片:渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,在网速慢的情况下有极大的优越性,可带来更好的用户体验。
支持加载Gif图,支持WebP格式。PNG,JPG,Webp
图像的呈现:         
      (1)自定义居中焦点(对人脸等图片显示非常有帮助)。    
      (2)圆角图,当然圆圈也行。    
      (3)下载失败之后,点击重新下载。    
      (4)自定义占位图,自定义overlay, 或者进度条。    
      (5)指定用户按压时的overlay。
图像的加载:
      (1)为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片。                
      (2)先显示一个低解析度的图片,等高清图下载完毕再显示高清图。    
      (3)加载完成回调通知。    
      (4)对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图。       
      (5)缩放或者旋转图片。    
      (6)处理已下载的图片。

**

作用:

**带进度条的图片、图片的不同裁剪、圆形和圆角图片、渐进式展示图片、Gif动画图片、多图请求及图片复用、图片加载监听、图片缩放和旋转、修改图片和动态展示.
好了接下来 我们今天一起来看一下通过Fresco可以对图片进行哪些操作:(我们今天先列举一部分)
首先:
我们要想使用Fresco,我们需要导入依赖,这个就根据我们所需要的配置相应的依赖就可以

dependencies {
/*Fresco的基础依赖*/
 implementation 'com.facebook.fresco:fresco:0.14.1'
 /*Fresco的GIF功能的依赖*/
 implementation 'com.facebook.fresco:animated-gif:0.14.1'

/*支持 WebP (静态图+动图),需要添加*/
compile 'com.facebook.fresco:animated-webp:0.12.0'
compile 'com.facebook.fresco:webpsupport:0.12.0'

/* 仅支持 WebP 静态图,需要添加*/
compile 'com.facebook.fresco:webpsupport:0.12.0'
}

其次:
创建一个自定义类MyApplication,继承Application

package com.example.fresco;
import android.app.Application;
import com.facebook.drawee.backends.pipeline.Fresco;
/**
* date:2018/11/27
* author:李壮(HUAWEI)
* function:
*/
public class MyApplication extends Application {
 @Override
 public void onCreate() {
     super.onCreate();
     Fresco.initialize(this);
 }
}

既然我们自定义类那我们必须在(AndroidManifest.xml)清单文件中进行注册,并且我们加载图片的过程中需要访问网络,所以我们需要在此配置网络权限

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

好到这里我们就将fresc所需的环境搭建完毕
接下来我们就开始具体功能的操作:
MainActivity:
初始化控件id,获取相应的资源控件,实现页面跳转至具体功能的页面

package com.example.fresco;

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

import com.example.fresco.view.AutoSizeActivity;
import com.example.fresco.view.CircleAndCornerActivity;
import com.example.fresco.view.GifActivity;
import com.example.fresco.view.JpegActivity;
import com.example.fresco.view.MultiActivity;
import com.example.fresco.view.ProgressBarActivity;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button btn_progressBar_icon;
    private Button btn_crop_icon;
    private Button btn_circleAndCorner_icon;
    private Button btn_jpeg_icon;
    private Button btn_gif_icon;
    private Button btn_multi_icon;
    private Button btn_listener_icon;
    private Button btn_resize_icon;
    private Button btn_update_icon;
    private Button btn_autoSize_icon;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件资源
        initView();
    }

    //获取资源id
    private void initView() {
        btn_progressBar_icon = (Button) findViewById(R.id.btn_progressBar_icon);
        btn_crop_icon = (Button) findViewById(R.id.btn_crop_icon);
        btn_circleAndCorner_icon = (Button) findViewById(R.id.btn_circleAndCorner_icon);
        btn_jpeg_icon = (Button) findViewById(R.id.btn_jpeg_icon);
        btn_gif_icon = (Button) findViewById(R.id.btn_gif_icon);
        btn_multi_icon = (Button) findViewById(R.id.btn_multi_icon);
        btn_listener_icon = (Button) findViewById(R.id.btn_listener_icon);
        btn_resize_icon = (Button) findViewById(R.id.btn_resize_icon);
        btn_update_icon = (Button) findViewById(R.id.btn_update_icon);
        btn_autoSize_icon = (Button) findViewById(R.id.btn_autoSize_icon);

        btn_progressBar_icon.setOnClickListener(this);
        btn_crop_icon.setOnClickListener(this);
        btn_circleAndCorner_icon.setOnClickListener(this);
        btn_jpeg_icon.setOnClickListener(this);
        btn_gif_icon.setOnClickListener(this);
        btn_multi_icon.setOnClickListener(this);
        btn_listener_icon.setOnClickListener(this);
        btn_resize_icon.setOnClickListener(this);
        btn_update_icon.setOnClickListener(this);
        btn_autoSize_icon.setOnClickListener(this);
    }

    //根据相应的点击事件跳转至相应的功能页面
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_progressBar_icon://带进度条的图片
                Intent ProgressBarIntent = new Intent(this,ProgressBarActivity.class);
                startActivity(ProgressBarIntent);
                finish();
                break;
            case R.id.btn_crop_icon://图片的不同裁剪

                break;
            case R.id.btn_circleAndCorner_icon://圆形和圆角的图片
                Intent CircleAndCornerIntent = new Intent(this,CircleAndCornerActivity.class);
                startActivity(CircleAndCornerIntent);
                finish();
                break;
            case R.id.btn_jpeg_icon://渐进式展示图片
                Intent JpegIntent = new Intent(this,JpegActivity.class);
                startActivity(JpegIntent);
                finish();
                break;
            case R.id.btn_gif_icon://Gif动画图片
                Intent GifIntent = new Intent(this,GifActivity.class);
                startActivity(GifIntent);
                finish();
                break;
            case R.id.btn_multi_icon://多图请求及图片复用
                Intent MultiIntent = new Intent(this,MultiActivity.class);
                startActivity(MultiIntent);
                finish();
                break;
            case R.id.btn_listener_icon://图片加载监听

                break;
            case R.id.btn_resize_icon://图片缩放和旋转

                break;
            case R.id.btn_update_icon://修改图片

                break;
            case R.id.btn_autoSize_icon://动态展示图片
                Intent AutoSizeIntent = new Intent(this,AutoSizeActivity.class);
                startActivity(AutoSizeIntent);
                finish();
                break;
        }
    }
}

主页的布局文件:

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

   <Button
       android:id="@+id/btn_progressBar_icon"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:text="带进度条的图片"/>
    <Button
        android:id="@+id/btn_crop_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="图片的不同裁剪"/>
    <Button
        android:id="@+id/btn_circleAndCorner_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="圆形和圆角的图片"/>
    <Button
        android:id="@+id/btn_jpeg_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="渐进式展示图片"/>
    <Button
        android:id="@+id/btn_gif_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Gif动画图片"/>
    <Button
        android:id="@+id/btn_multi_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="多图请求及图片复用"/>
    <Button
        android:id="@+id/btn_listener_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="图片加载监听"/>
    <Button
        android:id="@+id/btn_resize_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="图片缩放和旋转"/>
    <Button
        android:id="@+id/btn_update_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改图片"/>
    <Button
        android:id="@+id/btn_autoSize_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="动态展示图片"/>

</LinearLayout>

1.展示带进度条样式的图片:
ProgressBarActivity:

package com.example.fresco.view;

import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.example.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 ProgressBarActivity extends AppCompatActivity {

    private SimpleDraweeView sdv_progressBar_icon;
    private String path = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543329113431&di=551287617c4e82f27f19f82d7af4da57&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D5bdd825b5b0fd9f9b41a5d2a4d44be5f%2Fd62a6059252dd42a9811ac8c093b5bb5c9eab8f9.jpg";

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

        //1.显示所要加载的图片
        Uri parse = Uri.parse(path);
        //2.创建Build对象
        GenericDraweeHierarchyBuilder genericDraweeHierarchyBuilder = new GenericDraweeHierarchyBuilder(getResources());
        //3.通过这个对象设置进度条的样式
        GenericDraweeHierarchy build = genericDraweeHierarchyBuilder.setProgressBarImage(new ProgressBarDrawable()).build();
        //4.把样式设置给图片控件
        sdv_progressBar_icon.setHierarchy(build);
        //5.加载图片成功
        sdv_progressBar_icon.setImageURI(parse);
    }

    private void initView() {
        sdv_progressBar_icon = (SimpleDraweeView) findViewById(R.id.sdv_progressBar_icon);
    }
}

相应布局文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:fresco="http://schemas.android.com/apk/res-auto"
    tools:context=".view.ProgressBarActivity">

    <!--fresco:placeholderImage="@drawable/my_drawable":默认占位图片-->
    <com.facebook.drawee.view.SimpleDraweeView
        android:id="@+id/sdv_progressBar_icon"
        android:layout_width="130dp"
        android:layout_height="130dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@mipmap/ic_launcher" />

</android.support.constraint.ConstraintLayout>

2.圆形和圆角样式的图片:
CircleAndCornerActivity:

package com.example.fresco.view;

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

import com.example.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 CircleAndCornerActivity extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView sdv_circleandcorner_icon;
    private Button bt_fresco_circle;
    private Button bt_fresco_corner;
    private GenericDraweeHierarchyBuilder mBuilder;
    private Uri mUri;
    private RoundingParams mParams;
    private String Path = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543329113431&di=551287617c4e82f27f19f82d7af4da57&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D5bdd825b5b0fd9f9b41a5d2a4d44be5f%2Fd62a6059252dd42a9811ac8c093b5bb5c9eab8f9.jpg";

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

        mUri = Uri.parse(Path);
        //1.创建Build对象
        mBuilder = new GenericDraweeHierarchyBuilder(getResources());
    }

    private void initView() {
        sdv_circleandcorner_icon = (SimpleDraweeView) findViewById(R.id.sdv_circleandcorner_icon);
        bt_fresco_circle = (Button) findViewById(R.id.bt_fresco_circle);
        bt_fresco_corner = (Button) findViewById(R.id.bt_fresco_corner);

        bt_fresco_circle.setOnClickListener(this);
        bt_fresco_corner.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_fresco_circle://1.设置圆形
                //1.1设置形状对象,形状为圆形
                mParams = RoundingParams.asCircle();
                //1.2把形状设置给参数对象
                GenericDraweeHierarchy rounding = mBuilder.setRoundingParams(mParams).build();
                //1.3设置图片给控件
                sdv_circleandcorner_icon.setHierarchy(rounding);
                //1.4加载图片控件
                sdv_circleandcorner_icon.setImageURI(mUri);
                break;
            case R.id.bt_fresco_corner://2.设置圆角
                //2.1设置形状对象,形状为圆角
                RoundingParams roundingParams = RoundingParams.fromCornersRadius(50f);
                //2.2把形状设置给参数对象
                GenericDraweeHierarchy build = mBuilder.setRoundingParams(roundingParams).build();
                //2.3设置图片给控件
                sdv_circleandcorner_icon.setHierarchy(build);
                //2.4加载图片控件
                sdv_circleandcorner_icon.setImageURI(mUri);
                break;
        }
    }
}

布局文件:

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

    <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>

3.渐进式展示图片:
JpegActivity:

package com.example.fresco.view;

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

import com.example.fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.AbstractDraweeController;
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;

public class JpegActivity extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView sdv_fresco_jpeg;
    private Button sdv_fresco_askImg;
    private String Path = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543329113431&di=551287617c4e82f27f19f82d7af4da57&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D5bdd825b5b0fd9f9b41a5d2a4d44be5f%2Fd62a6059252dd42a9811ac8c093b5bb5c9eab8f9.jpg";

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

    }

    private void initView() {
        sdv_fresco_jpeg = (SimpleDraweeView) findViewById(R.id.sdv_fresco_jpeg);
        sdv_fresco_askImg = (Button) findViewById(R.id.sdv_fresco_askImg);

        sdv_fresco_askImg.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.sdv_fresco_askImg:
                //1.获取图片地址
                Uri parse = Uri.parse(Path);
                //2.加载质量配置,为了实现节省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(parse)
                        .setProgressiveRenderingEnabled(true)//设置打开渐进模式
                        .build();
                AbstractDraweeController draweeController = Fresco.newDraweeControllerBuilder()
                        .setImageRequest(request)
                        .setTapToRetryEnabled(true)
                        .setOldController(sdv_fresco_jpeg.getController())//内存优化
                        .build();
                sdv_fresco_jpeg.setController(draweeController);
                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:layout_gravity="center"
        android:id="@+id/sdv_fresco_jpeg"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginTop="48dp"
        fresco:placeholderImage="@mipmap/ic_launcher" />

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

</LinearLayout>

4.Gif动画图片:
GifActivity:

package com.example.fresco.view;

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

import com.example.fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.AbstractDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;

/**
 * 实现GIF的效果记得添加GIF的依赖
 */
public class GifActivity extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView sdv_fresco_gif;
    private Button bt_fresco_askImg;
    private Button bt_fresco_stopAnim;
    private Button bt_fresco_startAnim;
    private String GifPath = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543330405675&di=876ac3318ec9a21454e12a4f563cc04e&imgtype=0&src=http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_gif%2FXIbbJFPiamFAvjwicjXdEAPScWaQVdXicH8exiaD6vXibQU6c4jJiciaebibhUQQdib93wXLRIicHIrtPqvIU8OzleZpPK3g%2F640%3Fwx_fmt%3Dgif";

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

    private void initView() {
        sdv_fresco_gif = (SimpleDraweeView) findViewById(R.id.sdv_fresco_gif);
        bt_fresco_askImg = (Button) findViewById(R.id.bt_fresco_askImg);
        bt_fresco_stopAnim = (Button) findViewById(R.id.bt_fresco_stopAnim);
        bt_fresco_startAnim = (Button) findViewById(R.id.bt_fresco_startAnim);

        bt_fresco_askImg.setOnClickListener(this);
        bt_fresco_stopAnim.setOnClickListener(this);
        bt_fresco_startAnim.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_fresco_askImg:
                //1.首先加载Gif动画地址,这个加载过程需要一段时间
                Uri uri = Uri.parse(GifPath);
                AbstractDraweeController controller = Fresco.newDraweeControllerBuilder()
                        .setUri(uri)
                        .setAutoPlayAnimations(false)//设置是否自动播放,true为播放,false为不播放
                        .setOldController(sdv_fresco_gif.getController())//内存优化
                        .build();
                sdv_fresco_gif.setController(controller);
                break;
            case R.id.bt_fresco_stopAnim:
                if (sdv_fresco_gif.getController() != null){
                    Animatable animatable = sdv_fresco_gif.getController().getAnimatable();
                    //非空判断
                    if(animatable != null){
                        //停止播放
                        animatable.stop();
                    }
                }
                break;
            case R.id.bt_fresco_startAnim:
                if (sdv_fresco_gif.getController() != null){
                    Animatable animatable = sdv_fresco_gif.getController().getAnimatable();
                    //非空判断同时判断有没有播放
                    if(animatable != null && !animatable.isRunning()){
                        //开始播放
                        animatable.start();
                    }
                }
                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_gif"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginTop="48dp"
        android:layout_gravity="center"
        fresco:placeholderImage="@mipmap/ic_launcher" />

    <Button
        android:id="@+id/bt_fresco_askImg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="请求gif图片" />

    <Button
        android:id="@+id/bt_fresco_stopAnim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="动画停止" />

    <Button
        android:id="@+id/bt_fresco_startAnim"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="动画开始" />

</LinearLayout>

5.多图请求及图片复用:
MultiActivity :

package com.example.fresco.view;

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

import com.example.fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.AbstractDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;

import java.io.File;

public class MultiActivity extends AppCompatActivity implements View.OnClickListener {

    private SimpleDraweeView sdv_fresco_multi;
    private Button bt_fresco_multiImg;
    private Button bt_fresco_thumbnailImg;
    private Button bt_fresco_multiplexImg;
    private String lowPath = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543333820854&di=6d3a116b3dce45c9a475b2f11cacc947&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20171226%2Fb877aac2da3e489bad8638c5136f5e88.jpeg";
    private String highPath = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543329113431&di=551287617c4e82f27f19f82d7af4da57&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D5bdd825b5b0fd9f9b41a5d2a4d44be5f%2Fd62a6059252dd42a9811ac8c093b5bb5c9eab8f9.jpg";

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

    private void initView() {
        sdv_fresco_multi = (SimpleDraweeView) findViewById(R.id.sdv_fresco_multi);
        bt_fresco_multiImg = (Button) findViewById(R.id.bt_fresco_multiImg);
        bt_fresco_thumbnailImg = (Button) findViewById(R.id.bt_fresco_thumbnailImg);
        bt_fresco_multiplexImg = (Button) findViewById(R.id.bt_fresco_multiplexImg);

        bt_fresco_multiImg.setOnClickListener(this);
        bt_fresco_thumbnailImg.setOnClickListener(this);
        bt_fresco_multiplexImg.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_fresco_multiImg://先显示低分辨率的图,然后是高分辨率的图,Fresco就是
                Uri lowUri = Uri.parse(lowPath);
                Uri highUri = Uri.parse(highPath);
                //控制加载的图片控制器
                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://本地缩略图预览
                Uri uri = Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "lz.jpg"));
                break;
            case R.id.bt_fresco_multiplexImg://本地图片复用

                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_multi"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:layout_marginTop="48dp"
        fresco:placeholderImage="@mipmap/ic_launcher" />

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

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

    <Button
        android:id="@+id/bt_fresco_multiplexImg"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="本地图片复用" />

</LinearLayout>

6.动态展示图片:
AutoSizeActivity

package com.example.fresco.view;

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

import com.example.fresco.R;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.AbstractDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;

public class AutoSizeActivity extends AppCompatActivity implements View.OnClickListener {

    private Button bt_fresco_loadsmall;
    private LinearLayout ll_fresco_icon;
    private SimpleDraweeView mSimpleDraweeView;
    private String Path = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1543329113431&di=551287617c4e82f27f19f82d7af4da57&imgtype=0&src=http%3A%2F%2Fimgsrc.baidu.com%2Fimage%2Fc0%253Dshijue1%252C0%252C0%252C294%252C40%2Fsign%3D5bdd825b5b0fd9f9b41a5d2a4d44be5f%2Fd62a6059252dd42a9811ac8c093b5bb5c9eab8f9.jpg";


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

        mSimpleDraweeView = new SimpleDraweeView(this);
        //设置图片的宽高比,参数如果大于1,则宽度是高度的几倍
        mSimpleDraweeView.setAspectRatio(0.5f);
    }

    private void initView() {
        bt_fresco_loadsmall = (Button) findViewById(R.id.bt_fresco_loadsmall);
        ll_fresco_icon = (LinearLayout) findViewById(R.id.ll_fresco_icon);

        bt_fresco_loadsmall.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.bt_fresco_loadsmall:
                //1.设置图片的地址
                Uri parse = Uri.parse(Path);
                //2.图片请求
                ImageRequest request = ImageRequestBuilder.newBuilderWithSource(parse).build();
                //3.加载图片的控制
                AbstractDraweeController build = Fresco.newDraweeControllerBuilder()
                        .setOldController(mSimpleDraweeView.getController())//内存优化
                        .setImageRequest(request)
                        .build();
                //加载图片
                mSimpleDraweeView.setController(build);
                ll_fresco_icon.addView(mSimpleDraweeView);
                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">

    <Button
        android:id="@+id/bt_fresco_loadsmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="加载图片" />

    <LinearLayout
        android:id="@+id/ll_fresco_icon"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:orientation="vertical">
    </LinearLayout>

</LinearLayout>

好了 到这里就告一段落了,稍后我会为大家持续更新,希望能给大家带来帮助,下面给大家分享一下Fresco的网址:
https://www.fresco-cn.org/

猜你喜欢

转载自blog.csdn.net/LZ0419/article/details/84575112