Android圖片加載框架Fresco在實(shí)際項(xiàng)目中的使用技巧

  • FrescoFaceBook公司開(kāi)發(fā)的可以說(shuō)是近幾年來(lái)最出色的一款圖片加載框架
  • 支持Android2.3以上的版本
  • 還沒(méi)有用過(guò)的點(diǎn)這里中文文檔和基本用法
    今天介紹下使用技巧, 基本的用法我也就不多說(shuō)了

使用技巧

  1. 重置圖片高度

  2. 高度自適應(yīng)

  3. 下載圖片到本地

  4. 常用的圖片URI格式

重置圖片寬高

非常有用的一個(gè)技巧
ps: 我最開(kāi)始沒(méi)這樣壓縮時(shí), 把4張5M左右的圖不做處理直接顯示, app直接卡著動(dòng)不了, 內(nèi)存秒升到300M+, 多么痛的領(lǐng)悟
使用場(chǎng)景:
比如一個(gè)電商app有一個(gè)曬單功能, 用戶傳了幾張產(chǎn)品的曬單圖片, 現(xiàn)在的手機(jī)拍出的圖基本都是5MB左右了
不可能就把這么大的圖片完全顯示上去, 這樣的話app一會(huì)就卡死了
但是在商品詳情頁(yè)顯示用戶的曬單圖片時(shí), 可能只需要顯示200*200的圖片, 就需要使用到下面的方法了

壓縮成一個(gè)200*200的圖片
FrescoUtils.resetImageSize(200, 200, Uri.parse(imgUrl), sdv_cart_image);

    /**
     * 重置指定鏈接圖片的寬高
     * <p>等比例縮放
     *
     * @param width  需要縮放的寬
     * @param height 需要縮放的高
     * @param uri    網(wǎng)絡(luò)圖片的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);
    }
```
---
####圖片高度自適應(yīng)
使用場(chǎng)景:
`SimpleDraweeView`本身是**不支持高度自適應(yīng)**的, 文檔也有說(shuō)到
如果必須要使用, 只能通過(guò)一些特殊的方法來(lái)實(shí)現(xiàn)

比如經(jīng)常見(jiàn)到的一些長(zhǎng)圖高度都是`3000px、5000px、10000px`等等
顯示這些長(zhǎng)圖的控件下面可能還會(huì)有其他的布局`View`之類的
**在加載時(shí)我們不知道到圖片的準(zhǔn)確高度**
這種情況就必須使用高度自適應(yīng)了

> 
`FrescoUtils.setControllerListener(sdv_goods_detail, "http://*****.jpg", 1080);`

```
    /**
     * 通過(guò)imageWidth的寬度,自動(dòng)適應(yīng)高度
     *  @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("在保存圖片時(shí)出錯(cuò)");
            return false;
        }
        return true;
    }

    /**
     * 獲取下載圖片請(qǐng)求
     *
     * @param url
     * @return
     */
    public static ImageRequest getImageRequest(String url) {
        return ImageRequestBuilder
                .newBuilderWithSource(Uri.parse(url))
                .setProgressiveRenderingEnabled(true)
                .build();
    }
```


---

####支持圖片URI格式
**顯示一個(gè)本地路徑的圖**
`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));
    }
```

**顯示一個(gè)工程里的資源圖片**
`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");`
```
    /**
     * 指定網(wǎng)絡(luò)鏈接圖片資源讓SimpleDraweeView顯示
     * @param simpleDraweeView
     * @param paramString
     */
    public static void setImageUrl(SimpleDraweeView simpleDraweeView, String paramString) {
        simpleDraweeView.setImageURI(Uri.parse(paramString));
    }
```
---
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,983評(píng)論 25 709
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,322評(píng)論 0 17
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,545評(píng)論 19 139
  • 如果你已習(xí)慣了Glide、Picasso的使用方式, Fresco能不能像Glide、Picasso 一樣使用呢?...
    android_ls閱讀 5,426評(píng)論 2 38
  • 如果陽(yáng)光不那么高遠(yuǎn)我愿意摘取一籃每天把它種在地里施肥、除草、澆水直到收獲 如果大地不這么廣袤我愿擇取一隅種些糧食和...
    郭安安閱讀 358評(píng)論 11 15

友情鏈接更多精彩內(nèi)容