高频面试---drawable-xhdpi中的图片放到xxhdpi的手机上,内存是如何变化的

一、首先看几个基本概念

分辨率:分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有480×800、720×1280、1080×1920等。720×1280表示此屏幕在宽度方向有720个像素,在高度方向有1280个像素。

屏幕大小 : 屏幕大小是手机对角线的物理尺寸,以英寸(inch)为单位。比如某某手机为“5寸大屏手机”,就是指对角线的尺寸,5寸×2.54厘米/寸=12.7厘米。

屏幕密度:就是每英寸的像素点数,数值越高当然显示越细腻;就是屏幕对角线的长度 / 屏幕大小,如下图:
在这里插入图片描述

安卓手机标准的屏幕密度图,如下:

xxx-hdpi 的 密度值是 640,分辨率是 3840*2160
在这里插入图片描述

二、图片所占的内存是如何计算的?

先说结论啊。可分为以下几种情况:

现在有一张图片宽度 = 450像素高度 = 300像素

1. 如果在与手机屏幕密度相同的文件夹下存在此资源,那么内存=图片的宽度(像素)图片的高度(像素) 色彩格式所占的字节数;

比方说 你的手机分辨率 是 xxhdpi,你有一张图片放在 drawable-xxhdpi文件夹中,图片的色彩格式为 ARGB-8888,即每个像素站4个字节

图片占用的内存 = 450 * 300 *4 = 540_000 字节= 527 kb

2. 如果手机屏幕密度相同的文件夹下不存在此文件,而在大于手机屏幕密度的文件夹下存在此资源, 会进行缩小相应的倍数的平方。

xx-hdpi 的密度值是 480, xxx-hdpi 的密度值是640

比方说 你的手机还是 xxhdpi ,此时你的图片放在 drawable-xxxhdpi文件夹下;

图片占用的内存 = 450 / (640/480) * 300 / (640/480) * 4 = 303_750 字节 = 297kb

3. 若在大于手机屏幕密度的文件夹下没找到此资源,则会向小于手机屏幕密度的文件夹下查找,如果存在,则会进行放大相应的倍数的平方。

比方说 你的手机还是 xxhdpi ,此时你的图片放在 drawable-xhdpi文件夹下;

xx-hdpi 的密度值是 480, x-hdpi 的密度值是320

图片占用的内存 = 400 * (480 / 320) * 350 * (480 / 320) * 4 = 1215_000 字节 =1187 kb

三、验证结果

验证的手机为 华为P40
分辨率为 :2340 * 1080
屏幕尺寸:6.1
可以算出来,屏幕密度为 422,即 xx-hdpi。

图片大小:450*300
在这里插入图片描述

验证1:手机屏幕密度与图片所在的文件夹分辨率相同

即 图片也放在 xx-hdpi 目录下:

在这里插入图片描述
计算图片的宽度和高度:

        Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.a1);
        int width = bm.getWidth();
        int height = bm.getHeight();

        Log.e("ARouterMainActivity", "width = " + width + ", height = " + height);

在这里插入图片描述
可以验证上面的情况1啦。

验证情况2:如果手机屏幕密度相同的文件夹下不存在此文件,而在大于手机屏幕密度的文件夹下存在此资源:

在这里插入图片描述
在这里插入图片描述
即 宽度 = 图片宽度 450 / (640/480) = 337.5。
高度 = 图片宽度 300 / (640/480) = 225。
此时的内存= 337.5 * 225 * 4 = 303_750 字节

即情况2也满足情况3就不验证了,感兴趣的可以自己验证下。

四、结论

  1. 将图片放在比手机分辨率小的目录,图片所占的内存会 放大 手机密度/图片对应目录的密度的平方倍。
  2. 将图片放在比手机分辨率大的目录,图片所占的内存会 缩小 图片对应目录的密度 / 手机密度的平方倍。
  3. 相等情况下: 等于 图片的宽度 * 图片的高度 * 色彩格式对应的字节数

猜你喜欢

转载自blog.csdn.net/zhujiangtaotaise/article/details/112907477