Picasso 2.5.2的fit、resize在android5.1无法加载图片的解决方案

本文介绍了一种使用Picasso加载图片时的内存优化方案。通过自定义Transformation接口替代fit和resize方法,根据ImageView的实际宽高调整图片尺寸,有效降低内存消耗,避免应用因内存溢出而崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Transformation代替fit、resize

一开始使用下面代码加载图片,发现图片显示不出来

Picasso.with(context)
                    .load(new File(data.content))
                    .placeholder(R.drawable.default_publishlist)
                    .fit()
                    .centerInside()
                    .into(binding.ivContent);

后来去掉fit、centerInside方法,图片可以加载出来,不过占用内存非常大,显然还是存在问题。经过探索发现Picasso有一个Transformation接口,可以自定义转换图像,于是有了的处理方式:

Picasso.with(context)
                    .load(new File(data.content))
                    .placeholder(R.drawable.default_publishlist)
                    .transform(getTransformation(binding.ivContent))
                    .into(binding.ivContent);
private static Transformation getTransformation(final ImageView view) {
        return new Transformation() {
            @Override
            public Bitmap transform(Bitmap source) {
                int targetWidth = view.getWidth();

                //返回原图
                if (source.getWidth() == 0 || source.getWidth() < targetWidth) {
                    return source;
                }

                //如果图片大小大于等于设置的宽度,则按照设置的宽度比例来缩放
                double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
                int targetHeight = (int) (targetWidth * aspectRatio);
                if (targetHeight == 0 || targetWidth == 0) {
                    return source;
                }
                Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
                if (result != source) {
                    // Same bitmap is returned if sizes are the same
                    source.recycle();
                }
                return result;
            }

            @Override
            public String key() {
                return "transformation" + " desiredWidth";
            }
        };
    }

根据ImageView宽高来计算加载图片的大小,可以大大节省占用的内存,避免发生OOM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值