首先导入依赖:
compile 'com.facebook.fresco:fresco:0.12.0' compile 'com.facebook.fresco:animated-gif:0.14.1'
布局:
<com.facebook.drawee.view.SimpleDraweeView android:layout_width="200dp" android:layout_height="200dp" android:id="@+id/onesdv" fresco:progressBarImage="@drawable/b" fresco:progressBarImageScaleType="centerInside" fresco:progressBarAutoRotateInterval="5000" fresco:failureImage="@drawable/c" fresco:failureImageScaleType="centerInside" fresco:retryImage="@drawable/d" fresco:retryImageScaleType="centerCrop" />
剪切图片:
package wld.bawei.com.myapplication.My; import android.graphics.PointF; 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.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.view.SimpleDraweeView; import wld.bawei.com.myapplication.R; public class MyCut extends AppCompatActivity implements View.OnClickListener{ private SimpleDraweeView sdv_fresco_crop; private TextView tv_fresco_explain; private Button bt_fresco_center; private Button bt_fresco_centercrop; private Button bt_fresco_focuscrop; private Button bt_fresco_centerinside; private Button bt_fresco_fitcenter; private Button bt_fresco_fitstart; private Button bt_fresco_fitend; private Button bt_fresco_fitxy; private Button bt_fresco_none; private GenericDraweeHierarchyBuilder builder; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_cut); sdv_fresco_crop = (SimpleDraweeView) findViewById(R.id.sdv_fresco_crop); tv_fresco_explain = (TextView) findViewById(R.id.tv_fresco_explain); bt_fresco_center = (Button) findViewById(R.id.bt_fresco_center); bt_fresco_centercrop = (Button) findViewById(R.id.bt_fresco_centercrop); bt_fresco_focuscrop = (Button) findViewById(R.id.bt_fresco_focuscrop); bt_fresco_centerinside = (Button) findViewById(R.id.bt_fresco_centerinside); bt_fresco_fitcenter = (Button) findViewById(R.id.bt_fresco_fitcenter); bt_fresco_fitstart = (Button) findViewById(R.id.bt_fresco_fitstart); bt_fresco_fitend = (Button) findViewById(R.id.bt_fresco_fitend); bt_fresco_fitxy = (Button) findViewById(R.id.bt_fresco_fitxy); bt_fresco_none = (Button) findViewById(R.id.bt_fresco_none); bt_fresco_center.setOnClickListener(this); bt_fresco_centercrop.setOnClickListener(this); bt_fresco_focuscrop.setOnClickListener(this); bt_fresco_centerinside.setOnClickListener(this); bt_fresco_fitcenter.setOnClickListener(this); bt_fresco_fitstart.setOnClickListener(this); bt_fresco_fitend.setOnClickListener(this); bt_fresco_fitxy.setOnClickListener(this); bt_fresco_none.setOnClickListener(this); builder=new GenericDraweeHierarchyBuilder(getResources()); uri = Uri.parse("http://img4q.duitang.com/uploads/item/201305/20/20130520115416_VrUUR.jpeg"); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.bt_fresco_center: tv_fresco_explain.setText("居中,无缩放"); GenericDraweeHierarchy CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER).build(); sdv_fresco_crop.setHierarchy(CENTER); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_centercrop: tv_fresco_explain.setText("保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示"); GenericDraweeHierarchy CENTER_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP).build(); sdv_fresco_crop.setHierarchy(CENTER_CROP); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_focuscrop: tv_fresco_explain.setText("同centerCrop, 但居中点不是中点,而是指定的某个点,这里我设置为图片的左上角那点"); PointF pointF = new PointF(0, 0); GenericDraweeHierarchy FOCUS_CROP = builder.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP).setActualImageFocusPoint(pointF).build(); sdv_fresco_crop.setHierarchy(FOCUS_CROP); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_centerinside: tv_fresco_explain.setText("使两边都在显示边界内,居中显示。如果图尺寸大于显示边界,则保持长宽比缩小图片"); GenericDraweeHierarchy CENTER_INSIDE = builder.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE).build(); sdv_fresco_crop.setHierarchy(CENTER_INSIDE); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_fitcenter: tv_fresco_explain.setText("保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示"); GenericDraweeHierarchy FIT_CENTER = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER).build(); sdv_fresco_crop.setHierarchy(FIT_CENTER); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_fitstart: tv_fresco_explain.setText("保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,不居中,和显示边界左上对齐"); GenericDraweeHierarchy FIT_START = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_START).build(); sdv_fresco_crop.setHierarchy(FIT_START); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_fitend: tv_fresco_explain.setText("保持宽高比,缩小或者放大,使得图片完全显示在显示边界内,不居中,和显示边界右下对齐"); GenericDraweeHierarchy FIT_END = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_END).build(); sdv_fresco_crop.setHierarchy(FIT_END); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_fitxy: tv_fresco_explain.setText("不保持宽高比,填充满显示边界"); GenericDraweeHierarchy FIT_XY = builder.setActualImageScaleType(ScalingUtils.ScaleType.FIT_XY).build(); sdv_fresco_crop.setHierarchy(FIT_XY); sdv_fresco_crop.setImageURI(uri); break; case R.id.bt_fresco_none: tv_fresco_explain.setText("如要使用title mode显示, 需要设置为none"); GenericDraweeHierarchy build = builder.setActualImageScaleType(null).build(); sdv_fresco_crop.setHierarchy(build); sdv_fresco_crop.setImageURI(uri); } } }
动态添加fresco:
package wld.bawei.com.myapplication.My; 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.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 wld.bawei.com.myapplication.R; public class MyDongtaiAdd extends AppCompatActivity { private Button bt_fresco_loadsmall; private LinearLayout ll_fresco; private SimpleDraweeView simpleDraweeView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_dongtai_add); ll_fresco = (LinearLayout) findViewById(R.id.ll_fresco); simpleDraweeView = new SimpleDraweeView(this); simpleDraweeView.setAspectRatio(0.5f); } public void Bt_fresco_loadsmall(View view){ Uri uri = Uri.parse("http://img4q.duitang.com/uploads/item/201304/27/20130427043538_wAfHC.jpeg"); // 图片的请求 ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .build(); // 加载图片的控制 PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder() .setOldController(simpleDraweeView.getController()) .setImageRequest(request) .build(); // 加载图片 simpleDraweeView.setController(controller); // 将simpleDraweeView控件对象,添加到线性布局中 ll_fresco.addView(simpleDraweeView); } }加载动态图:package wld.bawei.com.myapplication.My; import android.graphics.drawable.Animatable; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; import wld.bawei.com.myapplication.R; public class MyGif extends AppCompatActivity { private SimpleDraweeView gigfresco; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_gif); gigfresco = (SimpleDraweeView) findViewById(R.id.gigfresco); Uri uri = Uri.parse("http://image.xcar.com.cn/attachments/a/day_150313/2015031312_f6e8d2e135a233ae91430aU3yQSw2ptu.gif"); DraweeController mDraweeController = Fresco.newDraweeControllerBuilder() .setAutoPlayAnimations(false) .setUri(uri) .build(); gigfresco.setController(mDraweeController); } public void Start(View view){ Animatable animatableStart = gigfresco.getController().getAnimatable(); //进行非空及是否动画在播放判断 if(animatableStart != null && !animatableStart.isRunning()) { //动画停止播放,播放动画 animatableStart.start(); } } public void Stop(View view){ Animatable animatableStop = gigfresco.getController().getAnimatable(); //进行非空及是否动画在播放判断 if(animatableStop != null && animatableStop.isRunning()) { //动画在播放,停止动画播放 animatableStop.stop(); } } }渐变式加载图片:
package wld.bawei.com.myapplication.My; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; 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; import wld.bawei.com.myapplication.R; public class MyJianBian extends AppCompatActivity { private SimpleDraweeView sdv_fresco_askImg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_jian_bian); sdv_fresco_askImg = (SimpleDraweeView) findViewById(R.id.sdv_fresco_askImg); } public void JianJin(View view){ Uri uri = Uri.parse("http://www.quanjing.com/image/2017index/lx4.png"); // 加载质量配置,为了实现节省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(sdv_fresco_askImg.getController()) .build(); // 1设置加载的控制 sdv_fresco_askImg.setController(draweeController); } }监听图片下载获得图片大小属性:package wld.bawei.com.myapplication.My; 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 android.widget.Toast; 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; import wld.bawei.com.myapplication.R; public class MyJianTingSize extends AppCompatActivity { private SimpleDraweeView sdv_fresco_listener; private TextView tv_fresco_listener; private TextView tv_fresco_listener2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_jian_ting_size); sdv_fresco_listener = (SimpleDraweeView) findViewById(R.id.sdv_fresco_listener); tv_fresco_listener = (TextView) findViewById(R.id.tv_fresco_listener); tv_fresco_listener2 = (TextView) findViewById(R.id.tv_fresco_listener2); } public void Bt_fresco_listener(View view) { Uri uri = Uri.parse("http://images2015.cnblogs.com/blog/845964/201607/845964-20160711092355951-167427278.png"); // 加载质量配置,为了实现节省CPU,随着图片下载的进行,下载完的扫描序列如下: 1, 4, 5, 10 /* 首次调用getNextScanNumberToDecode返回为2, 因为初始时,解码的扫描数为0。 那么1将不会解码,下载完成4个扫描时,解码一次。下个解码为扫描数为6(5不会解码,10才会解码)*/ ProgressiveJpegConfig jpegConfig = new ProgressiveJpegConfig() { @Override public int getNextScanNumberToDecode(int scanNumber) { return scanNumber + 2; } @Override public QualityInfo getQualityInfo(int scanNumber) { boolean isGoodEnough = (scanNumber >= 5); return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false); } }; //上面的和下面一行是固定代码.使用使复制粘贴即可 ImagePipelineConfig.newBuilder(this).setProgressiveJpegConfig(jpegConfig).build(); // 图片请求, ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)//指定加载图片地址 .setProgressiveRenderingEnabled(true)打开渐进 渲染 .build(); // 图片加载的控制 DraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(sdv_fresco_listener.getController()) .setImageRequest(request) //设置监听器监听图片的加载 .setControllerListener(controllerListener) .build(); // 加载图片 sdv_fresco_listener.setController(controller); } private ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() { // 加载图片完毕回调 @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) { super.onFinalImageSet(id, imageInfo, animatable); //图片信息对象非空判断 if (imageInfo == null) { return; } // 获取图片的质量信息 QualityInfo qualityInfo = imageInfo.getQualityInfo(); tv_fresco_listener.setText("Final image received! " + "\nSize: " + imageInfo.getWidth() //图片宽 + "x" + imageInfo.getHeight() //图片高 + "\nQuality level: " + qualityInfo.getQuality() //图片等级 + "\ngood enough: " + qualityInfo.isOfGoodEnoughQuality() //图片是否效果完全显示 + "\nfull quality: " + qualityInfo.isOfFullQuality()); //图片是否完全显示 } }; }加载带进度条:package wld.bawei.com.myapplication.My; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import com.facebook.drawee.drawable.ProgressBarDrawable; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.view.SimpleDraweeView; import wld.bawei.com.myapplication.R; public class MyJindutiao extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_jindutiao); SimpleDraweeView sdv_fresco_spimg = (SimpleDraweeView) findViewById(R.id.sdv_fresco_spimg); Uri uri = Uri.parse("http://pic1.sc.chinaz.com/Files/pic/pic9/201711/zzpic8416_s.jpg"); GenericDraweeHierarchyBuilder Builder = new GenericDraweeHierarchyBuilder(getResources()); GenericDraweeHierarchy build = Builder.setProgressBarImage(new ProgressBarDrawable()).build(); sdv_fresco_spimg.setHierarchy(build); sdv_fresco_spimg.setImageURI(uri); } }修改图片大小(清晰度)package wld.bawei.com.myapplication.My; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; 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.common.RotationOptions; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import wld.bawei.com.myapplication.R; public class MyXiuGai extends AppCompatActivity { private SimpleDraweeView sdv_fresco_resize; private RotationOptions rotationOptions; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_xiu_gai); sdv_fresco_resize = (SimpleDraweeView) findViewById(R.id.sdv_fresco_resize); } public void Bt_fresco_resize(View view){ Uri uri = Uri.parse("http://c.hiphotos.baidu.com/image/pic/item/962bd40735fae6cd21a519680db30f2442a70fa1.jpg"); //图片的请求 ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) //重新设置这张图片的宽高.以便解决内存 .setResizeOptions(new ResizeOptions(10, 10)) .build(); // 控制图片的加载 PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder() .setOldController(sdv_fresco_resize.getController()) .setImageRequest(request) .build(); // 加载图片 sdv_fresco_resize.setController(controller); } }
旋转图片:
package wld.bawei.com.myapplication.My; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.PipelineDraweeController; import com.facebook.drawee.controller.AbstractDraweeController; import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.imagepipeline.common.RotationOptions; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import wld.bawei.com.myapplication.R; public class MyXuanZhuan extends AppCompatActivity { private SimpleDraweeView xzSimple; private Uri uri; private RotationOptions rotationOptions; private int i=90; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_xuan_zhuan); uri = Uri.parse("http://img.ivsky.com/img/tupian/t/201709/20/shejijingmeideshoubiaotupian-003.jpg"); xzSimple = (SimpleDraweeView) findViewById(R.id.xzSimple); xzSimple.setImageURI(uri); } public void Xz(View view){ rotationOptions = RotationOptions.forceRotation(i); ImageRequest imageRequestBuilder = ImageRequestBuilder.newBuilderWithSource(uri).setRotationOptions(rotationOptions).build(); PipelineDraweeController build = (PipelineDraweeController) Fresco.newDraweeControllerBuilder().setImageRequest(imageRequestBuilder).build(); xzSimple.setController(build); i+=90; if(i==360){ i=0; } } }
圆形图片加载:
package wld.bawei.com.myapplication.My; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.generic.RoundingParams; import com.facebook.drawee.view.SimpleDraweeView; import wld.bawei.com.myapplication.R; public class MyYuanXing extends AppCompatActivity { private SimpleDraweeView sdv_fresco_circleandcorner; private GenericDraweeHierarchyBuilder builder; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my_yuan_xing); sdv_fresco_circleandcorner = (SimpleDraweeView) findViewById(R.id.sdv_fresco_circleandcorner); builder = new GenericDraweeHierarchyBuilder(getResources()); uri = Uri.parse("http://img4q.duitang.com/uploads/item/201304/27/20130427043538_wAfHC.jpeg"); } public void Yx(View view){ RoundingParams roundingParams = RoundingParams.asCircle(); GenericDraweeHierarchy build = builder.setRoundingParams(roundingParams).build(); sdv_fresco_circleandcorner.setHierarchy(build); sdv_fresco_circleandcorner.setImageURI(uri); } public void Yj(View view){ RoundingParams roundingParams = RoundingParams.fromCornersRadius(20f); GenericDraweeHierarchy build = builder.setRoundingParams(roundingParams).build(); sdv_fresco_circleandcorner.setHierarchy(build); sdv_fresco_circleandcorner.setImageURI(uri); } }