关于 Fresco
Fresco 是一个强大的图片加载组件。
Fresco 中设计有一个叫做 image pipeline 的模块。它负责从网络,从本地文件系统,本地资源加载图片。为了最大限度节省空间和CPU时间,它含有3级缓存设计(2级内存,1级文件)。
Fresco 中设计有一个叫做 Drawees 模块,方便地显示loading图,当图片不再显示在屏幕上时,及时地释放内存和空间占用。
Fresco 支持 Android2.3(API level 9) 及其以上系统。
特性
1.内存管理
解压后的图片,即Android中的Bitmap,占用大量的内存。大的内存占用势必引发更加频繁的GC。在5.0以下,GC将会显著地引发界面卡顿。
在5.0以下系统,Fresco将图片放到一个特别的内存区域。当然,在图片不显示的时候,占用的内存会自动被释放。这会使得APP更加流畅,减少因图片内存占用而引发的OOM。
Fresco 在低端机器上表现一样出色,你再也不用因图片内存占用而思前想后。
2.图片的渐进式呈现
渐进式的JPEG图片格式已经流行数年了,渐进式图片格式先呈现大致的图片轮廓,然后随着图片下载的继续,呈现逐渐清晰的图片,这对于移动设备,尤其是慢网络有极大的利好,可带来更好的用户体验。
Android 本身的图片库不支持此格式,但是Fresco支持。使用时,和往常一样,仅仅需要提供一个图片的URI即可,剩下的事情,Fresco会处理。
3.Gif图和WebP格式
是的,支持加载Gif图,支持WebP格式。
4.图像的呈现(厉害的特性)
Fresco 的 Drawees 设计,带来一些有用的特性:
自定义居中焦点(对人脸等图片显示非常有帮助)
圆角图,当然圆圈也行。 下载失败之后,点击重现下载。 自定义占位图,自定义overlay, 或者进度条。
指定用户按压时的overlay, 图像的加载, Fresco 的 image pipeline 设计,允许用户在多方面控制图片的加载:
为同一个图片指定不同的远程路径,或者使用已经存在本地缓存中的图片, 先显示一个低解析度的图片,等高清图下载完之后再显示高清图, 加载完成回调通知。
对于本地图,如有EXIF缩略图,在大图加载完成之前,可先显示缩略图, 缩放或者旋转图片, 处理已下载的图片, WebP 支持。
程序运行截图
程序实现了fresco的渐进式加载图片和简单的使用方法,更多关于fresco可以点击这里查看官方API
xml清单文件配置
主要就是加入访问网络的权限和自定义一个MyAppcation
xml version="1.0" encoding="utf-8"?>
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.whoami.frescodemo">
android:name="android.permission.INTERNET"/>
android:name=".MyAppcation"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:name=".MainActivity">
android:name="android.intent.action.MAIN" />
android:name="android.intent.category.LAUNCHER" />
activity_main.xml
的布局
xml version="1.0" encoding="utf-8"?>
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="com.example.whoami.frescodemo.MainActivity">
android:id="@+id/my_image_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
fresco:placeholderImage="@android:drawable/stat_sys_download_done"
/>
新建MyAppcation.java
package com.example.whoami.frescodemo;
import android.app.Application;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.facebook.imagepipeline.decoder.SimpleProgressiveJpegConfig;
/**
* Created by whoami on 2016/6/8.
*/
public class MyAppcation extends Application {
@Override
public void onCreate() {
super.onCreate();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setProgressiveJpegConfig(new SimpleProgressiveJpegConfig())
.build();
Fresco.initialize(this,config);
}
}
MainActivity.java
package com.example.whoami.frescodemo;
import android.net.Uri;
import android.support.annotation.UiThread;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
import com.facebook.drawee.interfaces.DraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
public class MainActivity extends AppCompatActivity {
SimpleDraweeView my_image_view;
String url = "http://image55.360doc.com/DownloadImg/2012/09/1618/26871610_1.jpg";
String url2 = "http://d.hiphotos.baidu.com/image/pic/item/738b4710b912c8fc889cb8f2ff039245d68821a5.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.my_image_view = (SimpleDraweeView) findViewById(R.id.my_image_view);
//showImage();
showImage_1();
}
//简单使用的方法
private void showImage() {
Uri uri = Uri.parse("http://www.liaohuqiu.net/assets/img/qrcode_for_wechat_mp.jpg");
my_image_view.setImageURI(uri);
}
//带渐进显示的效果
public void showImage_1(){
Uri uri = Uri.parse(url);
ImageRequest request = ImageRequestBuilder
.newBuilderWithSource(uri)
.setProgressiveRenderingEnabled(true)
.build();
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.build();
my_image_view.setController(controller);
}
//多图显示,可以实现先显示缩略图,等高清图片加载完成以后再把缩略图替换成高清图片的功能
public void showImage_2(){
Uri lowResUri, highResUri;
lowResUri = Uri.parse("");//低分辨率uri
highResUri = Uri.parse("");//高分辨率uri
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setLowResImageRequest(ImageRequest.fromUri(lowResUri))
.setImageRequest(ImageRequest.fromUri(highResUri))
.setOldController(my_image_view.getController())
.build();
my_image_view.setController(controller);
}
}
源代码下载
百度云下载地址一
百度云下载地址二,提取码:5k3y