Fresco保存图片

Fresco是facebook自家出的一个强大的图片加载组件,因为缓存各方面强大的特性,所以在开发趣刻的时候,自己也将他加了进去

出现的第一个问题是用RecyclerView实现瀑布流的时候,因为Fresco的SimpleDraweeView不能设置wrap_content,如果要使用则需设置setAspectRatio宽高比,所以除了获取网络加载图片的长宽之外,是比较难跟RecyclerView瀑布流结合的

第二个问题就是存储图片了,google了好久找不到答案,不过发现可以提取出缓存bitmap的方法,接着把bitmap存储就可以实现了,接下来贴代码:

ImageRequest imageRequest = ImageRequestBuilder
        .newBuilderWithSource(Uri.parse(url))
        .setProgressiveRenderingEnabled(true)
        .build();

ImagePipeline imagePipeline = Fresco.getImagePipeline();
DataSource<CloseableReference<CloseableImage>>
        dataSource = imagePipeline.fetchDecodedImage(imageRequest, context);

dataSource.subscribe(new BaseBitmapDataSubscriber() {
    @Override
    public void onNewResultImpl(Bitmap bitmap) {
        if (bitmap == null) {
            Toast.makeText(context, "保存图片失败啦,无法下载图片", Toast.LENGTH_SHORT).show();
        }
        File appDir = new File(Environment.getExternalStorageDirectory(), "Coderfun");
        if (!appDir.exists()) {
            appDir.mkdir();
        }
        String fileName = desc + ".jpg";
        File file = new File(appDir, fileName);
        try {
            FileOutputStream fos = new FileOutputStream(file);
            assert bitmap != null;
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush();
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        uri = Uri.fromFile(file);
        // 通知图库更新
        Intent scannerIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri);
        context.sendBroadcast(scannerIntent);

    }

    @Override
    public void onFailureImpl(DataSource dataSource) {
    }
}, CallerThreadExecutor.getInstance());

2 条评论

昵称
  1. 匿名

    支持

  2. 匿名

    赞你!原创!