Fresco是Facebook出品的一個(gè)超級(jí)強(qiáng)大的開(kāi)源圖片加載庫(kù),支持Gif绊寻,Webp格式的圖片加載花墩,支持漸進(jìn)式顯示,支持……總之支持很多東西,2333澄步。
Fresco配置
Fresco的配置很重要冰蘑,配置的不好就很容易造成性能上的問(wèn)題
在A(yíng)pplication.java中配置
這里是我的配置,使用了OkHttp3作為網(wǎng)絡(luò)請(qǐng)求庫(kù)
gradle配置
compile 'com.facebook.fresco:fresco:0.11.0'
compile 'com.facebook.fresco:imagepipeline-okhttp3:0.11.0'
java代碼配置
//這里是添加Fresco的日志
Set<RequestListener> requestListeners = new HashSet<>();
requestListeners.add(new RequestLoggingListener());
//當(dāng)內(nèi)存緊張時(shí)采取的措施
MemoryTrimmableRegistry memoryTrimmableRegistry = NoOpMemoryTrimmableRegistry.getInstance();
memoryTrimmableRegistry.registerMemoryTrimmable(trimType -> {
final double suggestedTrimRatio = trimType.getSuggestedTrimRatio();
Log.e("Fresco", String.format("onCreate suggestedTrimRatio : %d", suggestedTrimRatio));
if (MemoryTrimType.OnCloseToDalvikHeapLimit.getSuggestedTrimRatio() == suggestedTrimRatio
|| MemoryTrimType.OnSystemLowMemoryWhileAppInBackground.getSuggestedTrimRatio() == suggestedTrimRatio
|| MemoryTrimType.OnSystemLowMemoryWhileAppInForeground.getSuggestedTrimRatio() == suggestedTrimRatio
) {
//清除內(nèi)存緩存
Fresco.getImagePipeline().clearMemoryCaches();
// Fresco.getImagePipeline().clearCaches();
}
});
//小圖片的磁盤(pán)配置,用來(lái)儲(chǔ)存用戶(hù)頭像之類(lèi)的小圖
DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder(this)
.setBaseDirectoryPath(this.getCacheDir())//緩存圖片基路徑
.setBaseDirectoryName(getString(R.string.app_name))//文件夾名
.setMaxCacheSize(20 * ByteConstants.MB)//默認(rèn)緩存的最大大小驮俗。
.setMaxCacheSizeOnLowDiskSpace(10 * ByteConstants.MB)//緩存的最大大小,使用設(shè)備時(shí)低磁盤(pán)空間懂缕。
.setMaxCacheSizeOnVeryLowDiskSpace(5 * ByteConstants.MB)//緩存的最大大小,當(dāng)設(shè)備極低磁盤(pán)空間
.build();
ImagePipelineConfig imagePipelineConfig = OkHttpImagePipelineConfigFactory
.newBuilder(this, client)
.setDownsampleEnabled(true)
.setResizeAndRotateEnabledForNetwork(true)
.setRequestListeners(requestListeners)
.setBitmapMemoryCacheParamsSupplier(new LolipopBitmapMemoryCacheSupplier((ActivityManager) getSystemService(ACTIVITY_SERVICE)))
.setMemoryTrimmableRegistry(memoryTrimmableRegistry)
.setSmallImageDiskCacheConfig(diskSmallCacheConfig)
.setBitmapsConfig(Bitmap.Config.RGB_565)
.build();
Fresco.initialize(this, imagePipelineConfig);
因?yàn)樵贏(yíng)ndroid5.0以上的機(jī)子不能肆意使用匿名內(nèi)存區(qū)域允跑,所以要特別區(qū)分一下
import android.app.ActivityManager;
import android.os.Build;
import com.facebook.common.internal.Supplier;
import com.facebook.common.util.ByteConstants;
import com.facebook.imagepipeline.cache.MemoryCacheParams;
/**
* Created by snowbean on 16-7-2.
*/
public class LolipopBitmapMemoryCacheSupplier implements Supplier<MemoryCacheParams> {
private ActivityManager activityManager;
public LolipopBitmapMemoryCacheSupplier(ActivityManager activityManager) {
this.activityManager = activityManager;
}
@Override
public MemoryCacheParams get() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
return new MemoryCacheParams(getMaxCacheSize(), 56, Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE);
} else {
return new MemoryCacheParams(
getMaxCacheSize(),
256,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE);
}
}
private int getMaxCacheSize() {
final int maxMemory = Math.min(activityManager.getMemoryClass() * ByteConstants.MB, Integer.MAX_VALUE);
if (maxMemory < 32 * ByteConstants.MB) {
return 4 * ByteConstants.MB;
} else if (maxMemory < 64 * ByteConstants.MB) {
return 6 * ByteConstants.MB;
} else {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD) {
return 8 * ByteConstants.MB;
} else {
return maxMemory / 4;
}
}
}
}
Fresco圖片加載
為了使用方便王凑,將圖片加載都使用靜態(tài)方法作為工具類(lèi)寫(xiě)在一起
import android.content.Context;
import android.net.Uri;
import android.text.TextUtils;
import android.util.Log;
import com.facebook.binaryresource.BinaryResource;
import com.facebook.binaryresource.FileBinaryResource;
import com.facebook.cache.common.CacheKey;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.backends.pipeline.PipelineDraweeController;
import com.facebook.drawee.view.SimpleDraweeView;
import com.facebook.imagepipeline.common.Priority;
import com.facebook.imagepipeline.common.ResizeOptions;
import com.facebook.imagepipeline.core.ImagePipelineFactory;
import com.facebook.imagepipeline.request.ImageRequest;
import com.facebook.imagepipeline.request.ImageRequestBuilder;
import java.io.File;
/**
* Created by snowbean on 16-7-2.
*/
public class PhotoUtil {
private static final String TAG = PhotoUtil.class.getSimpleName();
private PhotoUtil() {
}
//Fresco
public static void display(SimpleDraweeView draweeView, String url) {
if (TextUtils.isEmpty(url)) {
Log.e(TAG, "display: error the url is empty");
return;
}
draweeView.setImageURI(url);
}
public static void display(SimpleDraweeView draweeView, File file) {
if (file == null) {
Log.e(TAG, "display: error the file is empty");
return;
}
Uri uri = Uri.fromFile(file);
if (uri == null) return;
draweeView.setImageURI(uri);
}
public static void display(SimpleDraweeView draweeView, Uri uri) {
if (uri == null) {
Log.e(TAG, "display: error the url is empty");
return;
}
draweeView.setImageURI(uri);
}
public static void display(SimpleDraweeView draweeView, Uri uri, int width, int height) {
if (uri == null) {
Log.e(TAG, "display: error the url is empty");
return;
}
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.setAutoRotateEnabled(true)
.setLocalThumbnailPreviewsEnabled(true)
.build();
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setOldController(draweeView.getController())
.setImageRequest(request)
.build();
draweeView.setController(controller);
}
public static void display(SimpleDraweeView draweeView, String url, int width, int height) {
if (TextUtils.isEmpty(url)) {
Log.e(TAG, "display: error the url is empty");
return;
}
Uri uri = Uri.parse(url);
display(draweeView, uri, width, height);
}
public static void display(SimpleDraweeView draweeView, Uri uri, boolean isSmall) {
if (uri == null) {
Log.e(TAG, "display: error the url is empty");
return;
}
ImageRequest request;
if (isSmall) {
request = ImageRequestBuilder.newBuilderWithSource(uri)
.setAutoRotateEnabled(true)
.setImageType(ImageRequest.ImageType.SMALL)
.setLocalThumbnailPreviewsEnabled(true)
.build();
} else {
request = ImageRequestBuilder.newBuilderWithSource(uri)
.setAutoRotateEnabled(true)
.setImageType(ImageRequest.ImageType.DEFAULT)
.setLocalThumbnailPreviewsEnabled(true)
.build();
}
PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder()
.setOldController(draweeView.getController())
.setImageRequest(request)
.build();
draweeView.setController(controller);
}
public static void display(SimpleDraweeView draweeView, String url, boolean isSmall) {
if (TextUtils.isEmpty(url)) {
Log.e(TAG, "display: error the url is empty");
return;
}
Uri uri = Uri.parse(url);
display(draweeView, uri, isSmall);
}
public static void prefetchPhoto(Context context, Uri uri, int width, int height) {
if (uri == null) {
Log.e(TAG, "display: error the url is empty");
return;
}
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.setAutoRotateEnabled(true)
.setRequestPriority(Priority.LOW)
.setLocalThumbnailPreviewsEnabled(true)
.build();
Fresco.getImagePipeline().prefetchToDiskCache(request, context);
}
public static void prefetchPhoto(Context context, String url, int width, int height) {
if (TextUtils.isEmpty(url)) {
Log.e(TAG, "display: error the url is empty");
return;
}
Uri uri = Uri.parse(url);
prefetchPhoto(context, uri, width, height);
}
}
獲取Fresco磁盤(pán)緩存中的圖片
public static File obtainCachedPhotoFile(CacheKey cacheKey) {
File localFile = null;
if (cacheKey != null) {
if (ImagePipelineFactory.getInstance().getMainFileCache().hasKey(cacheKey)) {
BinaryResource binaryResource = ImagePipelineFactory.getInstance().getMainFileCache().getResource(cacheKey);
localFile = ((FileBinaryResource) binaryResource).getFile();
} else if (ImagePipelineFactory.getInstance().getSmallImageFileCache().hasKey(cacheKey)) {
BinaryResource binaryResource = ImagePipelineFactory.getInstance().getSmallImageFileCache().getResource(cacheKey);
localFile = ((FileBinaryResource) binaryResource).getFile();
}
}
return localFile;
}
Fresco暫停與繼續(xù)加載圖片
Fresco.getImagePipeline().resume();
Fresco.getImagePipeline().pause();