一、首先看几个基本概念
● 分辨率:分辨率就是手机屏幕的像素点数,一般描述成屏幕的“宽×高”,安卓手机屏幕常见的分辨率有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就不验证了,感兴趣的可以自己验证下。
四、结论
- 将图片放在比手机分辨率小的目录,图片所占的内存会 放大 手机密度/图片对应目录的密度的平方倍。
- 将图片放在比手机分辨率大的目录,图片所占的内存会 缩小 图片对应目录的密度 / 手机密度的平方倍。
- 相等情况下: 等于 图片的宽度 * 图片的高度 * 色彩格式对应的字节数