Android 加载大图的缩略图显示

本文探讨了在Android应用中如何解决图片过大导致的内存溢出问题,通过计算缩放比例并使用 BitmapFactory.Options进行智能加载,降低内存消耗。作者分享了获取缩放比例的方法和实际操作步骤,帮助开发者提升用户体验。
摘要由CSDN通过智能技术生成
  1. 问题来了

在android中,我们很多界面都会用到图片显示,我们从网络服务器上加载图片到本地,并显示出来,这个操作我想大家都很熟悉吧?

很多新手,比如我自己,之前从来没有考虑过图片大小问题,一般从服务器下载图片,就直接扔进ImageView或者其他的Ui组件中去了,最近在做一个图片列表的时候,经常在一些手机上OOM,所以就花时间研究了一下这个东西

首先我们加载张高清图,如果是一张1080*1080的图片到手机上显示,按照每一个像素4字节的大小,大约计算出图片会占用内存大小约4.5M,一个列加载10张,稍微滑动,估计就直接OOM了,其实显示在界面只有那个图片显示组件的大小,但是我们却加载了整个大图到内存,是不是觉得很浪费资源啊???

  1. 解决问题

既然有问题,那么我们就来解决问题:

一张1080的图片,我们显示到界面,估计就在200px到300左右吧,那么怎么计算缩小比例呢

/**
     * 获取位图的缩放比例
     *
     * @param options 传入一个Options对象
     * @param width 目标宽度
     * @param height 目标高度
     * @return 缩小的比例
     */
    public int SumSimple(BitmapFactory.Options options, int width, int height) {
        int w = options.outWidth;
        int h = options.outHeight;
        //假设缩放比例为1
        int inSimple = 1;
        //如果要显示的图的宽或者高,大于你传入的比例
        if (width < w || height < h) {
            //如果Options里面的图的宽度大于高度(这是为了防止图片缩放造成图片变形)
            if (w > h) {
                inSimple = Math.round(w / width);
            } else {
                inSimple = Math.round(h / height);
            }

        }
        return inSimple;
    }

步骤二: 得到了图片缩小的比例,那么我们接下来应该做的事什么呢???肯定是去缩小图片啊**

BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;  //获得图片的各项属性,不加载图片到内存
                BitmapFactory.decodeResource(getResources(), R.drawable.image1, options);  //获取图片
                options.inSampleSize = SumSimple(options,100,100);  //获得缩小比例 (传入自定义的宽高)
                options.inJustDecodeBounds = false; //inJustDecodeBounds = false的时候,图片会加载到内存中
                mImageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.image1,options)); //显示缩小的图片到界面上

好了,试试吧,看看是不是缩小了`,虽然这个不能完全解决OOM,但是肯定比完全加载到内存要好的多啊
之后我会更新内存缓存和磁盘缓存的文章,让OOM无所遁形

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值