美文网首页Android在开发中的实用技巧Android知识Android技术知识
Android图片加载框架Fresco在实际项目中的使用技巧

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

作者: coexist | 来源:发表于2017-04-17 11:32 被阅读186次
    • FrescoFaceBook公司开发的可以说是近几年来最出色的一款图片加载框架
    • 支持Android2.3以上的版本
    • 还没有用过的点这里中文文档和基本用法
      今天介绍下使用技巧, 基本的用法我也就不多说了

    使用技巧

    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));
        }
    ```
    ---

    相关文章

      网友评论

        本文标题:Android图片加载框架Fresco在实际项目中的使用技巧

        本文链接:https://www.haomeiwen.com/subject/suzzattx.html