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<ImageInfo> 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<Bitmap> 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<CloseableReference<CloseableImage>> dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
|
DataSubscriber dataSubscriber = new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
|
@Override
|
public void onNewResultImpl(DataSource<CloseableReference<CloseableImage>> dataSource) {
|
if (!dataSource.isFinished()) {
|
if (loadImageResult != null) {
|
loadImageResult.onResult(null);
|
}
|
return;
|
}
|
|
CloseableReference<CloseableImage> imageReference = dataSource.getResult();
|
if (imageReference != null) {
|
final CloseableReference<CloseableImage> 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<CloseableReference<CloseableImage>>
|
dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
|
|
final DataSubscriber<CloseableReference<CloseableImage>> dataSubscriber = new
|
BaseDataSubscriber<CloseableReference<CloseableImage>>() {
|
@Override
|
public void onNewResultImpl(
|
DataSource<CloseableReference<CloseableImage>> dataSource) {
|
if (!dataSource.isFinished()) {
|
return;
|
}
|
CloseableReference<CloseableImage> 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<Bitmap> copyBitmap = new SoftReference<Bitmap>(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<CloseableReference<CloseableImage>>
|
dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);
|
|
dataSource.subscribe(new BaseDataSubscriber<CloseableReference<CloseableImage>>() {
|
@Override
|
public void onNewResultImpl(
|
DataSource<CloseableReference<CloseableImage>> dataSource) {
|
if (!dataSource.isFinished()) {
|
return;
|
}
|
CloseableReference<CloseableImage> 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<Bitmap> copyBitmap = new SoftReference<Bitmap>(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;
|
}
|
}
|