Android图片加载框架Fresco在实际项目中的使用技巧

  • Fresco是FaceBook公司开发的可以说是近几年来最出色的一款图片加载框架
  • 支持Android2.3以上的版本
  • 还没有用过的点这里中文文档和基本用法
    今天介绍下使用技巧, 基本的用法我也就不多说了

使用技巧

  1. 重置图片高度

  2. 高度自适应

  3. 下载图片到本地

  4. 常用的图片URI格式

Android图片加载框架Fresco在实际项目中的使用技巧_第1张图片

重置图片宽高

非常有用的一个技巧
ps: 我最开始没这样压缩时, 把4张5M左右的图不做处理直接显示, app直接卡着动不了, 内存秒升到300M+, 多么痛的领悟
使用场景:
比如一个电商app有一个晒单功能, 用户传了几张产品的晒单图片, 现在的手机拍出的图基本都是5MB左右了
不可能就把这么大的图片完全显示上去, 这样的话app一会就卡死了
但是在商品详情页显示用户的晒单图片时, 可能只需要显示200*200的图片, 就需要使用到下面的方法了

压缩成一个200*200的图片
FrescoUtils.resetImageSize(200, 200, Uri.parse(imgUrl), sdv_cart_image);

    /**
     * 重置指定链接图片的宽高
     * 

等比例缩放 * * @param width 需要缩放的宽 * @param height 需要缩放的高 * @param uri 网络图片的URI * @param image 显示图片的控件 */ public static void resetImageSize(int width, int height, Uri uri, SimpleDraweeView image) { ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri) .setResizeOptions(new ResizeOptions(width, height)) .build(); PipelineDraweeController controller = (PipelineDraweeController) Fresco.newDraweeControllerBuilder() .setOldController(image.getController()) .setImageRequest(request) .build(); image.setController(controller); } ``` --- ####图片高度自适应 使用场景: `SimpleDraweeView`本身是**不支持高度自适应**的, 文档也有说到 如果必须要使用, 只能通过一些特殊的方法来实现 比如经常见到的一些长图高度都是`3000px、5000px、10000px`等等 显示这些长图的控件下面可能还会有其他的布局`View`之类的 **在加载时我们不知道到图片的准确高度** 这种情况就必须使用高度自适应了 > `FrescoUtils.setControllerListener(sdv_goods_detail, "http://*****.jpg", 1080);` ``` /** * 通过imageWidth的宽度,自动适应高度 * @param simpleDraweeView view * @param imagePath Uri * @param imageWidth width */ public static void setControllerListener(final SimpleDraweeView simpleDraweeView, String imagePath, final int imageWidth) { final ViewGroup.LayoutParams layoutParams = simpleDraweeView.getLayoutParams(); ControllerListener controllerListener = new BaseControllerListener() { @Override public void onFinalImageSet(String id, @Nullable ImageInfo imageInfo, @Nullable Animatable anim) { if (imageInfo == null) { return; } int height = imageInfo.getHeight(); int width = imageInfo.getWidth(); layoutParams.width = imageWidth; layoutParams.height = (int) ((float) (imageWidth * height) / (float) width); simpleDraweeView.setLayoutParams(layoutParams); } @Override public void onIntermediateImageSet(String id, @Nullable ImageInfo imageInfo) { } @Override public void onFailure(String id, Throwable throwable) { throwable.printStackTrace(); } }; DraweeController controller = Fresco.newDraweeControllerBuilder().setControllerListener(controllerListener).setUri(Uri.parse(imagePath)).build(); simpleDraweeView.setController(controller); } ``` --- ####下载图片到本地 ``` /** 图片在本地sd卡文件名 */ public static final String HEAD_PICTURE_PATH = "head_pic.jpg"; /** 图片在本地sd卡的目录 */ public static final String HEAD_PICTURE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/missbear/"; /** * 下载图片保存到本地路径 * * @param context * @param url */ public static void downloadHeadPic(final Context context, String url) { Fresco.getImagePipeline().fetchDecodedImage(getImageRequest(url), context).subscribe(new BaseBitmapDataSubscriber() { @Override public void onNewResultImpl(Bitmap bitmap) { saveBitmapToSdCard(bitmap); } @Override public void onFailureImpl(DataSource dataSource) {} }, CallerThreadExecutor.getInstance()); } /** * 保存图片到SD卡 * * @param bitmap */ private static boolean saveBitmapToSdCard(Bitmap bitmap) { if (bitmap == null) { return false; } File appDir = new File(HEAD_PICTURE_DIR); if (!appDir.exists()) { appDir.mkdir(); } File file = new File(appDir, HEAD_PICTURE_PATH); try { FileOutputStream outputStream = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream); outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); LogUtils.i("在保存图片时出错"); return false; } return true; } /** * 获取下载图片请求 * * @param url * @return */ public static ImageRequest getImageRequest(String url) { return ImageRequestBuilder .newBuilderWithSource(Uri.parse(url)) .setProgressiveRenderingEnabled(true) .build(); } ``` --- ####支持图片URI格式 **显示一个本地路径的图** `FrescoUtils.setImageLocal(sdv_pic, "/storage/emulated/0/Android/data/com.okhqb.missbear/cache/1492398117360.jpg");` ``` /** * 指定本地图片让SimpleDraweeView显示 * * @param simpleDraweeView * @param paramString 本地图片路径 */ public static void setImageLocal(SimpleDraweeView simpleDraweeView, String paramString) { simpleDraweeView.setImageURI(Uri.parse("file://" + paramString)); } ``` **显示一个工程里的资源图片** `FrescoUtils.setImageResources(sdv_pic, R.mipmap.ic_launcher);` ``` /** * 指定工程里的图片资源让SimpleDraweeView显示 * @param simpleDraweeView * @param paramInt */ public static void setImageResources(SimpleDraweeView simpleDraweeView, int paramInt) { String packageName = "your package name"; simpleDraweeView.setImageURI(Uri.parse("res://" + packageName + "/" + paramInt)); } ``` **常用的图片URI格式** `FrescoUtils.setImageUrl(sdv_pic, "https://*****.jpg");` ``` /** * 指定网络链接图片资源让SimpleDraweeView显示 * @param simpleDraweeView * @param paramString */ public static void setImageUrl(SimpleDraweeView simpleDraweeView, String paramString) { simpleDraweeView.setImageURI(Uri.parse(paramString)); } ``` ---

你可能感兴趣的:(Android图片加载框架Fresco在实际项目中的使用技巧)