package com.doumee.lib_coremodel.http.utils; import android.content.Context; import android.graphics.Bitmap; import android.net.Uri; import android.text.TextUtils; import com.facebook.common.executors.UiThreadImmediateExecutorService; import com.facebook.common.references.CloseableReference; import com.facebook.common.util.UriUtil; import com.facebook.datasource.BaseDataSubscriber; import com.facebook.datasource.DataSource; import com.facebook.datasource.DataSubscriber; import com.facebook.drawee.backends.pipeline.Fresco; import com.facebook.drawee.backends.pipeline.PipelineDraweeControllerBuilder; import com.facebook.drawee.controller.ControllerListener; import com.facebook.drawee.drawable.ScalingUtils; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.interfaces.DraweeController; import com.facebook.drawee.view.DraweeView; import com.facebook.drawee.view.SimpleDraweeView; import com.facebook.fresco.helper.ImageLoader; import com.facebook.fresco.helper.blur.BitmapBlurHelper; import com.facebook.fresco.helper.listener.IResult; import com.facebook.imagepipeline.animated.base.AnimatedImageResult; import com.facebook.imagepipeline.common.ImageDecodeOptions; import com.facebook.imagepipeline.common.ResizeOptions; import com.facebook.imagepipeline.common.RotationOptions; import com.facebook.imagepipeline.core.ImagePipeline; import com.facebook.imagepipeline.image.CloseableAnimatedImage; import com.facebook.imagepipeline.image.CloseableBitmap; import com.facebook.imagepipeline.image.CloseableImage; import com.facebook.imagepipeline.image.ImageInfo; import com.facebook.imagepipeline.request.BasePostprocessor; import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import timber.log.Timber; //import com.nostra13.universalimageloader.core.assist.ImageSize; /** * Created by Administrator on 2017/9/18. */ public class FrescoUtils { public interface ImageLoadingListener { void onSuccess(Bitmap var1); void onFailure(); } public static void clearMeary(){ /*ImagePipeline imagePipeline = Fresco.getImagePipeline(); imagePipeline.clearMemoryCaches(); imagePipeline.clearDiskCaches(); // combines above two lines imagePipeline.clearCaches();*/ } /*public static void displayImageFresco(String url, SimpleDraweeView draweeView) { *//*if(url!=null){ url="http://picture.yxshow.tv/default.jpg"; }*//* try { if(TextUtils.isEmpty(url)){ draweeView.setImageURI((new Uri.Builder()).scheme("res").path(String.valueOf(R.mipmap.circle_nomal_pic)).build()); }else { //draweeView.setImageURI(url); ImageLoader.loadImage(draweeView,url,false); } }catch (Exception e){ } *//*ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri).build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setImageRequest(request).setAutoPlayAnimations(true).build(); draweeView.setController(controller);*//* }*/ public static void displayImageFresco(final String url, final SimpleDraweeView simpleDraweeView) { if(url==null){ return; } DraweeController controller = Fresco.newDraweeControllerBuilder() .setUri(Uri.parse(url)) .setRetainImageOnFailure(false) .setTapToRetryEnabled(false) .setOldController(simpleDraweeView.getController()) .build(); simpleDraweeView.setController(controller); } /* isUnGIF:是否要去除gif * */ public static void displayImageFresco(final String url, final SimpleDraweeView simpleDraweeView, final boolean isSmall, final boolean isGIF, int type) { GenericDraweeHierarchy hierarchy = simpleDraweeView.getHierarchy(); /*if(isSmall){ hierarchy.setPlaceholderImage(R.drawable.default_user_head); }else { hierarchy.setPlaceholderImage(R.mipmap.circle_nomal_pic); }*/ if(type==1){ hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.FIT_CENTER); }else { hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP); } try { if(TextUtils.isEmpty(url)){ if(isSmall){ //simpleDraweeView.setImageURI((new Uri.Builder()).scheme("res").path(String.valueOf(R.drawable.default_user_head)).build()); }else { //simpleDraweeView.setImageURI((new Uri.Builder()).scheme("res").path(String.valueOf(R.mipmap.circle_nomal_pic)).build()); } }else { simpleDraweeView.post(new Runnable() { @Override public void run() { int width = simpleDraweeView.getWidth(); int height = simpleDraweeView.getHeight(); if(isGIF){ ImageLoader.loadImage(simpleDraweeView, Uri.parse(url.trim()),width,height,null,null,isSmall); }else { loadImageUnGIF(simpleDraweeView, Uri.parse(url.trim()),width,height,null,null ,isSmall); } } }); } }catch (Exception e){ } } public static void displayImageFresco(final String url, final SimpleDraweeView simpleDraweeView, final boolean isSmall, int nomalPic) { if(url==null){ return; } GenericDraweeHierarchy hierarchy = simpleDraweeView.getHierarchy(); if(nomalPic>0){ hierarchy.setPlaceholderImage(nomalPic); } hierarchy.setActualImageScaleType(ScalingUtils.ScaleType.CENTER_CROP); try { if(TextUtils.isEmpty(url)){ if(isSmall){ //simpleDraweeView.setImageURI((new Uri.Builder()).scheme("res").path(String.valueOf(R.drawable.default_user_head)).build()); }else { //simpleDraweeView.setImageURI((new Uri.Builder()).scheme("res").path(String.valueOf(R.mipmap.circle_nomal_pic)).build()); } }else { simpleDraweeView.post(new Runnable() { @Override public void run() { int width = simpleDraweeView.getWidth(); int height = simpleDraweeView.getHeight(); ImageLoader.loadImage(simpleDraweeView, Uri.parse(url.trim()),width,height,null,null,isSmall); } }); } }catch (Exception e){ } } public static void loadImageUnGIF(SimpleDraweeView simpleDraweeView, Uri uri, final int reqWidth, final int reqHeight, BasePostprocessor postprocessor, ControllerListener controllerListener, boolean isSmall) { ImageDecodeOptions options= ImageDecodeOptions.newBuilder().setForceStaticImage(true).setDecodePreviewFrame(true).build(); ImageRequestBuilder imageRequestBuilder = ImageRequestBuilder.newBuilderWithSource(uri); imageRequestBuilder.setImageDecodeOptions(options); imageRequestBuilder.setRotationOptions(RotationOptions.autoRotate()); // 不支持图片渐进式加载,理由:https://github.com/facebook/fresco/issues/1204 imageRequestBuilder.setProgressiveRenderingEnabled(false); if (isSmall) { imageRequestBuilder.setCacheChoice(ImageRequest.CacheChoice.SMALL); } if (reqWidth > 0 && reqHeight > 0) { imageRequestBuilder.setResizeOptions(new ResizeOptions(reqWidth, reqHeight)); } if (UriUtil.isLocalFileUri(uri)) { imageRequestBuilder.setLocalThumbnailPreviewsEnabled(true); } if (postprocessor != null) { imageRequestBuilder.setPostprocessor(postprocessor); } ImageRequest imageRequest = imageRequestBuilder.build(); PipelineDraweeControllerBuilder draweeControllerBuilder = Fresco.newDraweeControllerBuilder(); draweeControllerBuilder.setOldController(simpleDraweeView.getController()); draweeControllerBuilder.setImageRequest(imageRequest); if (controllerListener != null) { draweeControllerBuilder.setControllerListener(controllerListener); } draweeControllerBuilder.setTapToRetryEnabled(true); // 开启重试功能 draweeControllerBuilder.setAutoPlayAnimations(true); // 自动播放gif动画 DraweeController draweeController = draweeControllerBuilder.build(); simpleDraweeView.setController(draweeController); } /** * 从本地文件或网络获取Bitmap * * @param context * @param url * @param reqWidth * @param reqHeight * @param loadImageResult */ public static void loadImage(final Context context, String url, final int reqWidth, final int reqHeight, final IResult loadImageResult) { if (TextUtils.isEmpty(url)) { //MLog.i("url is null"); if(loadImageResult!=null){ loadImageResult.onResult(null); } return; } Uri uri = Uri.parse(url.trim()); if (!UriUtil.isNetworkUri(uri)) { uri = new Uri.Builder() .scheme(UriUtil.LOCAL_FILE_SCHEME) .path(url.trim()) .build(); } ImagePipeline imagePipeline = Fresco.getImagePipeline(); ImageRequestBuilder imageRequestBuilder = ImageRequestBuilder.newBuilderWithSource(uri); if (reqWidth > 0 && reqHeight > 0) { imageRequestBuilder.setResizeOptions(new ResizeOptions(reqWidth, reqHeight)); } ImageRequest imageRequest = imageRequestBuilder.build(); // 获取已解码的图片,返回的是Bitmap DataSource> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context); DataSubscriber dataSubscriber = new BaseDataSubscriber>() { @Override public void onNewResultImpl(DataSource> dataSource) { if (!dataSource.isFinished()) { if (loadImageResult != null) { loadImageResult.onResult(null); } return; } CloseableReference imageReference = dataSource.getResult(); if (imageReference != null) { final CloseableReference closeableReference = imageReference.clone(); try { CloseableImage closeableImage = closeableReference.get(); if (closeableImage instanceof CloseableAnimatedImage) { AnimatedImageResult animatedImageResult = ((CloseableAnimatedImage) closeableImage).getImageResult(); if (animatedImageResult != null && animatedImageResult.getImage() != null) { int imageWidth = animatedImageResult.getImage().getWidth(); int imageHeight = animatedImageResult.getImage().getHeight(); Bitmap.Config bitmapConfig = Bitmap.Config.ARGB_8888; Bitmap bitmap = Bitmap.createBitmap(imageWidth, imageHeight, bitmapConfig); animatedImageResult.getImage().getFrame(0).renderFrame(imageWidth, imageHeight, bitmap); if (loadImageResult != null) { loadImageResult.onResult(bitmap); } }else { if (loadImageResult != null) { loadImageResult.onResult(null); } } } else if (closeableImage instanceof CloseableBitmap) { CloseableBitmap closeableBitmap = (CloseableBitmap) closeableImage; Bitmap bitmap = closeableBitmap.getUnderlyingBitmap(); if (bitmap != null && !bitmap.isRecycled()) { // https://github.com/facebook/fresco/issues/648 final Bitmap tempBitmap = bitmap.copy(bitmap.getConfig(), false); if (loadImageResult != null) { loadImageResult.onResult(tempBitmap); } }else { if (loadImageResult != null) { loadImageResult.onResult(null); } } }else { if (loadImageResult != null) { loadImageResult.onResult(null); } } } finally { imageReference.close(); closeableReference.close(); } }else { if (loadImageResult != null) { loadImageResult.onResult(null); } } } @Override public void onFailureImpl(DataSource dataSource) { Throwable throwable = dataSource.getFailureCause(); if (throwable != null) { Timber.tag("ImageLoader").e("onFailureImpl = " + throwable.toString()); } if (loadImageResult != null) { loadImageResult.onResult(null); } } }; dataSource.subscribe(dataSubscriber, UiThreadImmediateExecutorService.getInstance()); } public static void loadImageBlur(final SimpleDraweeView draweeView, String url) { ImageLoader.loadImage(draweeView, url.trim(), new BasePostprocessor() { @Override public String getName() { return "blurPostprocessor"; } @Override public void process(Bitmap bitmap) { BitmapBlurHelper.blur(bitmap, 25); } }); } public static void loadImageBlur(final SimpleDraweeView draweeView, int resId) { ImageLoader.loadDrawable(draweeView, resId, new BasePostprocessor() { @Override public String getName() { return "blurPostprocessor"; } @Override public void process(Bitmap bitmap) { BitmapBlurHelper.blur(bitmap, 20); } }); } /*public static void loadImage(Context context, String url, ImageSize size, final ImageLoadingListener listener) { if (listener == null) { return; } if (TextUtils.isEmpty(url.trim())) { listener.onFailure(); return; } ImageRequestBuilder builder = ImageRequestBuilder .newBuilderWithSource(Uri.parse(url.trim())) .setProgressiveRenderingEnabled(false); if (size != null) { builder.setResizeOptions(new ResizeOptions(size.getWidth(), size.getHeight())); } ImageRequest imageRequest = builder.build(); ImagePipeline imagePipeline = Fresco.getImagePipeline(); final DataSource> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context); final DataSubscriber> dataSubscriber = new BaseDataSubscriber>() { @Override public void onNewResultImpl( DataSource> dataSource) { if (!dataSource.isFinished()) { return; } CloseableReference closeableReference = dataSource .getResult(); if (closeableReference == null) { return; } try { Bitmap bitmap = null; if (closeableReference.get() instanceof CloseableBitmap) { CloseableBitmap closeableBitmap = (CloseableBitmap) closeableReference.get(); bitmap = closeableBitmap.getUnderlyingBitmap(); } //Bitmap bitmap = closeableBitmap.getUnderlyingBitmap(); if (bitmap != null && !bitmap.isRecycled()) { //Bitmap copybitmap = SoftReference copyBitmap = new SoftReference(Bitmap.createBitmap(bitmap)); // Bitmap copybitmap = ImageBlur.createRGBABitmap(bitmap, bitmap.getWidth(), bitmap.getHeight(),1); listener.onSuccess(copyBitmap.get()); } } finally { closeableReference.close(); dataSource.close(); } } @Override public void onFailureImpl(DataSource dataSource) { listener.onFailure(); dataSource.close(); } }; dataSource.subscribe(dataSubscriber, CallerThreadExecutor.getInstance()); }*/ /*//(做处理压缩重新设置宽高)模糊化需要 public static void getImageThumbnail(Context context, String uri, ImageSize size, final ImageLoadingListener listener) { if (listener == null) { return; } if(uri!=null){ uri.trim(); } if (TextUtils.isEmpty(uri)) { listener.onFailure(); return; } ImageRequestBuilder builder = ImageRequestBuilder .newBuilderWithSource(Uri.parse(uri)) .setProgressiveRenderingEnabled(false); if (size != null) { builder.setResizeOptions(new ResizeOptions(size.getWidth(), size.getHeight())); } ImageRequest imageRequest = builder.build(); ImagePipeline imagePipeline = Fresco.getImagePipeline(); final DataSource> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context); dataSource.subscribe(new BaseDataSubscriber>() { @Override public void onNewResultImpl( DataSource> dataSource) { if (!dataSource.isFinished()) { return; } CloseableReference closeableReference = dataSource .getResult(); if (closeableReference != null) { try { Bitmap bitmap = null; if (closeableReference.get() instanceof CloseableBitmap) { CloseableBitmap closeableBitmap = (CloseableBitmap) closeableReference.get(); bitmap = closeableBitmap.getUnderlyingBitmap(); } //Bitmap bitmap = closeableBitmap.getUnderlyingBitmap(); if (bitmap != null && !bitmap.isRecycled()) { // Bitmap thumbbitmap = ThumbnailUtils.extractThumbnail(bitmap, 100, 100); SoftReference copyBitmap = new SoftReference(Bitmap.createBitmap(bitmap,0,0,100, 100)); listener.onSuccess(copyBitmap.get()); } } finally { closeableReference.close(); dataSource.close(); } } } @Override public void onFailureImpl(DataSource dataSource) { listener.onFailure(); dataSource.close(); } }, CallerThreadExecutor.getInstance()); }*/ public static DraweeController getDraweeController(DraweeView targetView, String filepath) { Uri uri= Uri.parse(filepath); int w=targetView.getWidth(); int h=targetView.getHeight(); ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) //根据View的尺寸放缩图片 .setResizeOptions(new ResizeOptions(targetView.getWidth(), targetView.getHeight())) .build(); DraweeController controller = Fresco.newDraweeControllerBuilder() .setOldController(targetView.getController()) .setImageRequest(request) .setCallerContext(uri) .build(); return controller; } }