fresco 图片加载
注意 SimpleDraweeView 控件
的高不能是
wrap_content
原网址 https://www.fresco-cn.org/docs/getting-started.html
http://blog.csdn.net/android_ls/article/details/53137867
https://www.cnblogs.com/liushilin/p/5659301.html
https://www.jianshu.com/p/e67baa8b867d
先导入依赖:
dependencies {// 其他依赖compile 'com.facebook.fresco:fresco:0.12.0' } |
下面的依赖需要根据需求添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
dependencies {// 在 API < 14 上的机器支持 WebP 时,需要添加compile 'com.facebook.fresco:animated-base-support:0.12.0'// 支持 GIF 动图,需要添加compile 'com.facebook.fresco:animated-gif:0.12.0'// 支持 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' } |
如果你仅仅是想简单下载一张网络图片,在下载完成之前,显示一张占位图,那么简单使用 SimpleDraweeView 即可。
在加载图片之前,你必须初始化Fresco
类。你只需要调用Fresco.initialize
一次即可完成初始化,在 Application
里面做这件事再适合不过了(如下面的代码),注意多次的调用初始化是无意义的。
1 2 3 4 5 6 7 8 |
[MyApplication.java] public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();Fresco.initialize(this);} } |
做完上面的工作后,你需要在 AndroidManifest.xml
中指定你的 Application 类。为了下载网络图片,请确认你声明了网络请求的权限。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<manifest...><uses-permission android:name="android.permission.INTERNET" /><application...android:label="@string/app_name"android:name=".MyApplication">...</application>...</manifest> |
在xml布局文件中, 加入命名空间:
1 2 3 4 5 6 |
<!-- 其他元素--> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:fresco="http://schemas.android.com/apk/res-auto"android:layout_height="match_parent"android:layout_width="match_parent"> |
加入SimpleDraweeView
:
1 2 3 4 5 6 |
<com.facebook.drawee.view.SimpleDraweeViewandroid:id="@+id/my_image_view"android:layout_width="130dp"android:layout_height="130dp"fresco:placeholderImage="@drawable/my_drawable"/> |
开始加载图片:
1 2 3 |
Uri uri = Uri.parse("https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png"); SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view); draweeView.setImageURI(uri); |
类型 | 描述 |
---|---|
center | 居中,无缩放 |
centerCrop | 保持宽高比缩小或放大,使得两边都大于或等于显示边界。居中显示。 |
focusCrop | 同centerCrop, 但居中点不是中点,而是指定的某个点 |
centerInside |
使两边都在显示边界内,居中显示。 如果图尺寸大于显示边界,则保持长宽比缩小图片。 |
fitCenter | 保持宽高比,缩小或者放大,使得图片完全显示在显示边界内。居中显示 |
fitStart | 同上。但不居中,和显示边界左上对齐 |
fitEnd | 同fitCenter, 但不居中,和显示边界右下对齐 |
fitXY | 不保存宽高比,填充满显示边界 |
none | 如要使用tile mode显示, 需要设置为none |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
fresco:fadeDuration= "300" // 淡入淡出的持续时间
fresco:actualImageScaleType= "focusCrop" // 实际图像的缩放类型
fresco:placeholderImage= "@color/wait_color" //占位图
fresco:placeholderImageScaleType= "fitCenter" //占位图的缩放类型
fresco:failureImage= "@drawable/error" //下载失败显示的图片
fresco:failureImageScaleType= "centerInside" //失败图的缩放类型
fresco:retryImage= "@drawable/retrying"
//图片加载失败时显示,提示用户点击重新加载,重复加载4次还是没有加载出来的时候才会显示failureImage的图片
fresco:retryImageScaleType= "centerCrop" //重新加载的图片缩放类型
fresco:progressBarImage= "@drawable/progress_bar" //进度条图片
fresco:progressBarImageScaleType= "centerInside"
fresco:progressBarAutoRotateInterval= "1000"
//进度图自动旋转间隔时间(单位:毫秒ms)
fresco:backgroundImage= "@color/blue"
//背景图片,这里的背景图片首先被绘制
fresco:overlayImage= "@drawable/watermark"
// 设置叠加图,在xml中只能设置一张叠加图片,如果需要多张图片的话,需要在java代码中设置哦
fresco:pressedStateOverlayImage= "@color/red"
// 设置点击状态下的叠加图
fresco:roundAsCircle= "false" //设置为圆形图
fresco:roundedCornerRadius= "1dp" // 圆角半径
fresco:roundTopLeft= "true" // 左上角是否为圆角
fresco:roundTopRight= "false"
fresco:roundBottomLeft= "false"
fresco:roundBottomRight= "true"
fresco:roundWithOverlayColor= "@color/corner_color"
fresco:roundingBorderWidth= "2dp" //边框的宽度
fresco:roundingBorderColor= "@color/border_color" //边框颜色
|
private SimpleDraweeView dra;private String doongpath = "http://ww1.sinaimg.cn/large/85cccab3gw1ete12o9vtwg20dc0a0n9w.jpg";private String jingtai = "https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1514206108&di=15ef513018095a6115eddc8dec65b2be&src=http://i1.hdslb.com/bfs/archive/6fe21b97ccb59d8328a1dd68e8c35df0c75f2073.jpg";private String jianjin = "http://pic.baike.soso.com/p/20130709/20130709124204-549816457.jpg";private Uri uri;private SimpleDraweeView jinttai;@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);jinttai = (SimpleDraweeView) findViewById(R.id.jingtai);//动态图设置圆形 必须设置背景颜色 静态图片只设置圆的属性就可以 dra = (SimpleDraweeView) findViewById(R.id.drawee);uri = Uri.parse(doongpath);Uri uri1 = Uri.parse(jingtai);//jinttai.setImageURI(uri1); }public void xuanzhuan(View view) {Uri uri1 = Uri.parse(jingtai);/* ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri1) .setAutoRotateEnabled(true) .build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request) .build(); jinttai.setController(controller);*/ jinttai.setImageURI(uri1);}public void tiaoxing(View view) {ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).setAutoRotateEnabled(true).build();GenericDraweeHierarchyBuilder builder = new GenericDraweeHierarchyBuilder(getResources()); //创建参数对象,设置其样式为进度条 GenericDraweeHierarchy hierarchy = builder.setProgressBarImage(new ProgressBarDrawable()).build();DraweeController controller = Fresco.newDraweeControllerBuilder() // 支持动图 .setAutoPlayAnimations(true).setImageRequest(request).build();dra.setHierarchy(hierarchy);dra.setController(controller);}public void suofang(View view) {Uri uri1 = Uri.parse(jingtai); // 让图片变模糊 /* int width = 100, height = 100; ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri1) .setResizeOptions(new ResizeOptions(width, height)) .build();*/ // 图片缩放 GenericDraweeHierarchy hierarchy = jinttai.getHierarchy(); // 缩放类型 // hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_INSIDE); // 放大的类型 hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER); // 根据point设置的缩放先拿个方向偏移 hierarchy.setActualImageScaleType(FOCUS_CROP);PointF point = new PointF();point.set(0f, 0f);hierarchy.setActualImageFocusPoint(point);}public void jianjin(View view) {Uri uri2 = Uri.parse(jianjin); // 获取图片URL // 加载质量配置,为了实现节省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(uri2)//设置URL .setProgressiveRenderingEnabled(true)//打开渐进 渲染 .build();DraweeController draweeController = Fresco.newDraweeControllerBuilder() //必须要设置ImageRequest对象,里面包含了图片的网址. .setImageRequest(request) //开启用户点击重新加载图片的功能 .setTapToRetryEnabled(true) //会复用以前的对象,可以节省内存. .setOldController(jinttai.getController()).build(); // 1设置加载的控制 jinttai.setController(draweeController);}public void jianting(View view) {Uri uri1 = Uri.parse(jingtai); // fresco的监听事件 DraweeController controller = Fresco.newDraweeControllerBuilder().setUri(uri1).setControllerListener(new BaseControllerListener<ImageInfo>() {@Override public void onSubmit(String id, Object callerContext) {super.onSubmit(id, callerContext);}// 成功的方法了 @Override public void onFinalImageSet(String id, ImageInfo imageInfo, Animatable animatable) {super.onFinalImageSet(id, imageInfo, animatable);if (imageInfo == null) {return;}QualityInfo qualityInfo = imageInfo.getQualityInfo();FLog.d("Final image received! " +"Size %d x %d","Quality level %d, good enough: %s, full quality: %s",imageInfo.getWidth(),imageInfo.getHeight(),qualityInfo.getQuality(),qualityInfo.isOfGoodEnoughQuality(),qualityInfo.isOfFullQuality());}// 如果允许呈现渐进式JPEG,同时图片也是渐进式图片, //onIntermediateImageSet会在每个扫描被解码后回调。 // 具体图片的那个扫描会被解码,参见渐进式JPEG图 @Override public void onIntermediateImageSet(String id, ImageInfo imageInfo) {super.onIntermediateImageSet(id, imageInfo);}//中间的失败 @Override public void onIntermediateImageFailed(String id, Throwable throwable) {super.onIntermediateImageFailed(id, throwable);}//失败 @Override public void onFailure(String id, Throwable throwable) {super.onFailure(id, throwable);}// 释放 @Override public void onRelease(String id) {super.onRelease(id);}}).build();jinttai.setController(controller);}public void wangge(View view) {Uri uri3 = Uri.parse(jingtai); // 添加红色的网格 Postprocessor redMeshPostprocessor = new BasePostprocessor() {@Override public String getName() {return "redMeshPostprocessor";}@Override public void process(Bitmap bitmap) {for (int x = 0; x < bitmap.getWidth(); x += 2) {for (int y = 0; y < bitmap.getHeight(); y += 2) {bitmap.setPixel(x, y, Color.RED);}}}};ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri3).setPostprocessor(redMeshPostprocessor).build();PipelineDraweeController controller = (PipelineDraweeController)Fresco.newDraweeControllerBuilder().setImageRequest(request).setOldController(jinttai.getController())// other setters as you need .build();jinttai.setController(controller);}public void xiaogai(View view) {Uri uri3 = Uri.parse(jingtai); // 添加红色的网格 Postprocessor redMeshPostprocessor = new BasePostprocessor() {@Override public String getName() {return "redMeshPostprocessor";}@Override public CloseableReference<Bitmap> process(Bitmap sourceBitmap,PlatformBitmapFactory bitmapFactory) {CloseableReference<Bitmap> bitmapRef = bitmapFactory.createBitmap(sourceBitmap.getWidth() / 2,sourceBitmap.getHeight() / 2);try {Bitmap destBitmap = bitmapRef.get();for (int x = 0; x < destBitmap.getWidth(); x+=2) {for (int y = 0; y < destBitmap.getHeight(); y+=2) {destBitmap.setPixel(x, y, sourceBitmap.getPixel(x, y));}}return CloseableReference.cloneOrNull(bitmapRef);} finally {CloseableReference.closeSafely(bitmapRef);}}};ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri3).setPostprocessor(redMeshPostprocessor).build();PipelineDraweeController controller = (PipelineDraweeController)Fresco.newDraweeControllerBuilder().setImageRequest(request).setOldController(jinttai.getController())// other setters as you need .build();jinttai.setController(controller);} }
fresco 图片加载相关推荐
- Fresco图片加载+EventBus+Butterknife+Retrofit+RxJava+RxAndroid
使用MVP框架搭建,分包明确,V层和M层解耦,通过接口完成V层和P层以及P层和M层通信,解决内存泄漏问题 Retrofit做网络请求,封装网络请求工具类,使用单例模式,添加日志拦截器打印网络请求内容 ...
- (三) 技术选型 1.项目框架模式:MVP(得分点);注意:分包分层,避免内存泄漏; 2.图片加载:Fresco图片加载框架; 3.网络加载框架:retrofit;使用Retrofit+RxJ
首先呢 先把业务逻辑需求讲一下 大致思路都是根据自己所想的去做,下面是我个人做的一个小model,希望能帮到有需要的人 业务逻辑需求 1.MVP分包分层:Model.View.Presente ...
- Fresco图片加载框架的介绍,相关开源库以及工具类的封装
Fresco图片加载框架的介绍,相关开源库以及工具类的封装 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发. 简介 Fresco 是Facebook开源的安卓上的 ...
- Fresco图片加载框架使用方法完全指南
简介 Fresco 是Facebook开源的安卓上的图片加载框架,也可以说是至今为止安卓上最强大的图片加载框架. 相对于其他几个图片加载框架,Fresco主要的优点在于更好的内存管理和更强大的功能,更 ...
- Fresco图片加载工具
原文链接:http://www.fresco-cn.org/ 关于 Fresco Fresco 是一个强大的图片加载组件. Fresco 中设计有一个叫做 image pipeline 的模块.它负责 ...
- Fresco图片加载库的使用(SimpleDraweeView的简单使用 )
一.简介 Fresco 的出现,似乎将 Android 的图片加载做到了极致 Fresco 中文说明:http://www.fresco-cn.org/ Fresco 项目GitHub地址:https ...
- 【Android】Fresco图片加载框架(二)————Producer
/** * 本文可以随意转载到任何网站或者App, * BUT * 转载也要按"基本法", * 请注明原文出处和作者 */ 官方源码地址 fresco官方高大上介绍(1)(注意:前 ...
- 常用的图片加载库的区别(Gilde,Picasso,Image-loader,Fresco)
Gilde,Picasso,Image-loader,Fresco图片加载库的使区别 Glide Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内 ...
- Universal-Image-Loader(UIL)图片加载框架使用简单介绍
这个也是最近项目中使用到的第三方图片加载框架,在这里也自己总结一下,简单的介绍一些使用的方式. UIL图片加载框架特点 简介: 项目地址:https://github.com/nostra13/And ...
最新文章
- Windows如何 cmd 查找文件路径 开机启动 CMD语音播放 CMD切换到管理员!
- 字母s开头的c语言的工具,C语言库函数(S类字母) - 3
- Day 5: GruntJS——重复乏味的工作总会有人做(反正我不做)
- 栈的应用实例——计算后缀表达式
- 动态规划/贪心 - 无重叠区间
- 如何关闭Windows7的UAC
- org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved
- .net实现URL重写
- Hibernate 对c3p0配置不支持导致的错误
- MySQL的position值是什么_MySQL数据库中系统函数POSITION功能简介
- scrapy_全站爬取
- java父类与子类的构造方法,java父类子类构造方法及方法的调用
- w10 桌面计算机垃圾桶,win10垃圾桶图标不见了怎么办
- Java中this关键字的作用和用法
- Android开发:ZXing条码扫描-竖屏解决方案
- 使用python包scanpy读取单细胞h5ad文件
- 万彩办公大师OfficeBox3.1.0(小小工具箱几乎满足各种办公需求)
- ios安卓模拟器_iOS模拟器来了?苹果大一统时代会对游戏行业造成哪些冲击?
- oracle提示符sqlprompt
- 警惕新型钓鱼邮件诈骗~伪装的“再次发送”邮件