Fresco是FaceBook开发用来加载图片的框架,可以说这是当前最好的加载图片以及缓存图片等工具了。在以前我们使用的是ImageLoader或者Pissco。与这两种框架相比Fresco又好在哪里呢?
首先Fresco已经将图片等缓冲封装,我们不需要再使用LrcCache来缓存图片了。而且Fresco还带有许多功能。
我们可以通过以下图片看一下Fresco的特点及功能
至于渐进式加载图片与多图请求该如何做,请看代码:
package com.example.frescodemo;
import android.graphics.drawable.Animatable;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import com.facebook.common.logging.FLog;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
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.image.ImageInfo;
import com.facebook.imagepipeline.image.QualityInfo;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
public class MainActivity extends AppCompatActivity {
@ViewInject(R.id.image_view)
private SimpleDraweeView draweeView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewUtils.inject(this);
Uri uri = Uri.parse("http://...");
draweeView = (SimpleDraweeView) findViewById(R.id.image_view);
draweeView.setImageURI(uri);
}
/**
* 要先在MyApplication配置ImagePipelineConfig
* 渐进式加载图片
*/
public void requestImage(){
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse("http://"))
.setProgressiveRenderingEnabled(true)
.build();
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setImageRequest(request)
.build();
draweeView.setController(controller);
}
/**
* 多图请求,图片可设置两个地址
*/
public void moreImage(){
/**
* 监听事件
*/
ControllerListener controllerListener = new BaseControllerListener<ImageInfo>() {
/**
* 图片加载成功时调用
* @param id
* @param imageInfo
* @param anim
*/
@Override
public void onFinalImageSet(
String id,
@Nullable ImageInfo imageInfo,
@Nullable Animatable anim) {
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());
}
@Override
public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) {
FLog.d("","Intermediate image received");
}
/**
* 加载失败时调用
* @param id
* @param throwable
*/
@Override
public void onFailure(String id, Throwable throwable) {
FLog.e(getClass(), throwable, "Error loading %s", id);
}
};
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setLowResImageRequest(ImageRequest.fromUri("http://小图"))
.setImageRequest(ImageRequest.fromUri("http:大图"))
.setControllerListener(controllerListener)
.build();
draweeView.setController(controller);
}
}
<span style="font-family:Microsoft YaHei;">当然我们要新建一个类继承Application在里面对Fresco进行初始化,如下:</span>
<span style="font-family:Microsoft YaHei;"></span><pre name="code" class="java">package com.example.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 傅炫阳 on 2016/9/21.
*/
public class MyApplication extends Application{
@Override
public void onCreate() {
super.onCreate();
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(this)
.setProgressiveJpegConfig(new SimpleProgressiveJpegConfig())
.build();
Fresco.initialize(this,config);
}
}