package licola.demo.com.huabandemo.HttpUtils.ImageLoad; import android.content.Context; import android.graphics.PointF; import android.graphics.drawable.Drawable; import android.net.Uri; import com.facebook.common.executors.CallerThreadExecutor; import com.facebook.common.references.CloseableReference; import com.facebook.datasource.DataSource; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; import com.facebook.drawee.drawable.AutoRotateDrawable; import com.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder; import com.facebook.drawee.generic.RoundingParams; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; /** * Created by LiCola on 2016/01/16 15:26 * 用Fresco加载图片的类 * 针对这个Demo已经配置很多默认的值 * 用构造器模式便于设置更多形式 * <p/> * 使用示例: * new ImageLoadFresco.ImageLoadBuilder(mContext,img_image_user,url_head) * .setIsCircle(true) * .build(); */ public class ImageLoadFresco { private static final String TAG = "ImageLoadFresco"; //必要参数 private SimpleDraweeView mSimpleDraweeView; private Context mContext; /** * 私有化的构造函数 得到builder的参数 构造对象 * * @param frescoBuilder 构造器 */ ImageLoadFresco(ImageLoadBuilder frescoBuilder) { this.mContext = frescoBuilder.mContext; this.mSimpleDraweeView = frescoBuilder.mSimpleDraweeView; //初始化M层 用于初始化图片中包含的数据 GenericDraweeHierarchyBuilder builderM = new GenericDraweeHierarchyBuilder(mContext.getResources()); //请求参数 主要配置url 和C层相关 ImageRequest request = ImageRequestBuilder.newBuilderWithSource(Uri.parse(frescoBuilder.mUrl)) .setResizeOptions(frescoBuilder.mResizeOptions) .build(); //初始化C层 用于控制图片的加载 是主要的实现控制类 PipelineDraweeControllerBuilder builderC = Fresco.newDraweeControllerBuilder() // .setOldController(mSimpleDraweeView.getController()) ; if (frescoBuilder.mUrlLow != null) { builderC.setLowResImageRequest(ImageRequest.fromUri(frescoBuilder.mUrlLow)); } builderC.setImageRequest(request); setViewPerformance(frescoBuilder, builderM, builderC); if (frescoBuilder.mControllerListener != null) { builderC.setControllerListener(frescoBuilder.mControllerListener); } DraweeController draweeController = builderC.build(); if (frescoBuilder.mBitmapDataSubscriber != null) { ImagePipeline imagePipeline = Fresco.getImagePipeline(); DataSource<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(request, mSimpleDraweeView.getContext()); dataSource.subscribe(frescoBuilder.mBitmapDataSubscriber, CallerThreadExecutor.getInstance()); } mSimpleDraweeView.setHierarchy(builderM.build()); mSimpleDraweeView.setController(draweeController); } /** * 配置DraweeView的各种表现效果 * 如 失败图 重试图 圆角或圆形 * * @param frescoBuilder * @param builderM * @param builderC */ private void setViewPerformance(ImageLoadBuilder frescoBuilder, GenericDraweeHierarchyBuilder builderM, PipelineDraweeControllerBuilder builderC) { //设置图片的缩放形式 builderM.setActualImageScaleType(frescoBuilder.mActualImageScaleType); if (frescoBuilder.mActualImageScaleType == ScalingUtils.ScaleType.FOCUS_CROP) { builderM.setActualImageFocusPoint(new PointF(0f, 0f)); } ; if (frescoBuilder.mPlaceHolderImage != null) { // builderM.setPlaceholderImage(ContextCompat.getDrawable(mContext, R.drawable.ic_account_circle_gray_48dp), ScalingUtils.ScaleType.CENTER); builderM.setPlaceholderImage(frescoBuilder.mPlaceHolderImage, ScalingUtils.ScaleType.CENTER); } if (frescoBuilder.mProgressBarImage != null) { Drawable progressBarDrawable = new AutoRotateDrawable(frescoBuilder.mProgressBarImage, 2000); builderM.setProgressBarImage(progressBarDrawable); //// TODO: 2016/3/18 0018 直接设置无效 是自定义Drawable setColor知识为了类里面的取值 // MyProgressBarDrawable progressBarDrawable=new MyProgressBarDrawable(); // builderM.setProgressBarImage(progressBarDrawable); } //设置重试图 同时需要C层支持点击控制 if (frescoBuilder.mRetryImage != null) { builderC.setTapToRetryEnabled(true); builderM.setRetryImage(frescoBuilder.mRetryImage); } if (frescoBuilder.mFailureImage != null) { builderM.setFailureImage(frescoBuilder.mFailureImage); } if (frescoBuilder.mBackgroundImage != null) { builderM.setBackground(frescoBuilder.mBackgroundImage); } if (frescoBuilder.mIsCircle) { if (frescoBuilder.mIsBorder) { //默认白色包边 builderM.setRoundingParams(RoundingParams.asCircle().setBorder(0xFFFFFFFF, 2)); } else { builderM.setRoundingParams(RoundingParams.asCircle()); } // builderM.setRoundingParams(RoundingParams.asCircle()); } //如果圆角取默认值10 或者是已经修改过的mRadius值 if (frescoBuilder.mIsRadius) { builderM.setRoundingParams(RoundingParams.fromCornersRadius(frescoBuilder.mRadius)); } } }