使用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
优点:
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:2.1.0@aar'//用于提供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"