Fresco在项目中使用的越来越多,记录下最近写的个帮助类:
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.PointF;
import android.graphics.drawable.Animatable;
import android.net.Uri;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.controller.BaseControllerListener;
import com.facebook.drawee.controller.ControllerListener;
import com.facebook.drawee.drawable.ProgressBarDrawable;
import com.facebook.drawee.drawable.ScalingUtils;
import com.facebook.drawee.generic.GenericDraweeHierarchy;
import com.facebook.drawee.generic.RoundingParams;
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.BasePostprocessor;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import com.facebook.imagepipeline.request.Postprocessor;
/**
* Created by yangshuai in the 14:10 of 2016.01.05 .
* Fresco 图片加载帮助类
*/
public class ImageLoadUtils {
private ImageLoadUtils() {
}
private static class UtilsHolder {
public static ImageLoadUtils instance = new ImageLoadUtils();
}
public static ImageLoadUtils getInstance(Context context) {
UtilsHolder.instance.initContext(context);
return UtilsHolder.instance;
}
public static ImagePipelineConfig CusstomConfig(Context context) {
ProgressiveJpegConfig pjpegConfig = new ProgressiveJpegConfig() {
@Override
public int getNextScanNumberToDecode(int scanNumber) {
return scanNumber + 2;
}
public QualityInfo getQualityInfo(int scanNumber) {
boolean isGoodEnough = (scanNumber >= 5);
return ImmutableQualityInfo.of(scanNumber, isGoodEnough, false);
}
};
ImagePipelineConfig config = ImagePipelineConfig.newBuilder(context)
.setProgressiveJpegConfig(pjpegConfig)
.build();
return config;
}
private Context context;
private Postprocessor redMeshPostprocessor = null;
private ControllerListener controllerListener = null;
public void initContext(Context context){
this.context = context;
}
public GenericDraweeHierarchy initHierarchy(SimpleDraweeView simpleDraweeView) {
GenericDraweeHierarchy hierarchy = simpleDraweeView.getHierarchy();
hierarchy.setPlaceholderImage(R.mipmap.ic_launcher);
hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.FOCUS_CROP);
hierarchy.setActualImageFocusPoint(new PointF(0.5f, 0.5f));
RoundingParams roundingParams = RoundingParams.fromCornersRadius(10);
roundingParams.setCornersRadius(10);
roundingParams.setBorder(R.color.gray, 1);
hierarchy.setRoundingParams(roundingParams);
hierarchy.setFailureImage(context.getResources().getDrawable(R.mipmap.ic_launcher));
hierarchy.setRetryImage(context.getResources().getDrawable(R.mipmap.ic_launcher));
hierarchy.setProgressBarImage(new ProgressBarDrawable());
hierarchy.setFadeDuration(250);
return hierarchy;
}
public ImageLoadUtils setPostprocessor(Postprocessor redMeshPostprocessor) {
this.redMeshPostprocessor = redMeshPostprocessor;
return this;
}
public ImageLoadUtils setControllerListener(ControllerListener controllerListener) {
this.controllerListener = controllerListener;
return this;
}
public DraweeController initController(SimpleDraweeView simpleDraweeView, Uri uri) {
if (redMeshPostprocessor == null) {
redMeshPostprocessor = new BasePostprocessor() {
@Override
public String getName() {
return "redMeshPostprocessor";
}
@Override
public void process(Bitmap bitmap) {
}
};
}
if (controllerListener == null) {
controllerListener = new BaseControllerListener(){
@Override
public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) {
}
@Override
public void onIntermediateImageSet(String id, Object imageInfo) {
}
@Override
public void onFailure(String id, Throwable throwable) {
}
};
}
ImageRequest imageRequest =
ImageRequestBuilder
.newBuilderWithSource(uri)
.setAutoRotateEnabled(true)
.setPostprocessor(redMeshPostprocessor)
.setProgressiveRenderingEnabled(true)
.setLocalThumbnailPreviewsEnabled(true)
.setAutoRotateEnabled(true)
.build();
DraweeController controller =
Fresco.newDraweeControllerBuilder()
.setImageRequest(imageRequest)
.setControllerListener(controllerListener)
.setOldController(simpleDraweeView.getController())
.setTapToRetryEnabled(true)
.build();
return controller;
}
/**
* 支持的 URI 有 http://www.fresco-cn.org/docs/supported-uris.html#_ <br/>
* 远程图片:http://, https:// <br/>
* 本地文件:file:// <br/>
* Content provider: content:// <br/>
* asset目录下的资源: asset:// <br/>
* res目录下的资源: Uri uri = Uri.parse("res://包名(实际可以是任何字符串甚至留空)/" + R.drawable.ic_launcher);
* @param uri
* @param simpleDraweeView
*/
public void display(Uri uri, SimpleDraweeView simpleDraweeView) {
simpleDraweeView.setHierarchy(initHierarchy(simpleDraweeView));
simpleDraweeView.setController(initController(simpleDraweeView, uri));
}
public void display(String url, SimpleDraweeView simpleDraweeView) {
Uri uri = Uri.parse(url);
display(uri, simpleDraweeView);
}
}
在基类进行初始化:
Fresco.initialize(this, ImageLoadUtils.CusstomConfig(this));
使用
ImageLoadUtils.getInstance(context)
.setControllerListener(new BaseControllerListener(){
@Override
public void onFinalImageSet(String id, Object imageInfo, Animatable animatable) {
}
@Override
public void onIntermediateImageSet(String id, Object imageInfo) {
}
@Override
public void onFailure(String id, Throwable throwable) {
}
})
.display("图片Url", simpleDraweeView);