Android在开发中的实用技巧Android知识Android技术知识

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

2017-04-17  本文已影响186人  coexist
  • FrescoFaceBook公司开发的可以说是近几年来最出色的一款图片加载框架

使用技巧

  1. 重置图片高度

  2. 高度自适应

  3. 下载图片到本地

  4. 常用的图片URI格式

重置图片宽高

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

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

    /**
     * 重置指定链接图片的宽高
     * <p>等比例缩放
     *
     * @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<ImageInfo>() {
            @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));
    }
```
---
上一篇 下一篇

猜你喜欢

热点阅读