安卓的图片占用内存,图片分辨率,图片适配不同屏幕的研究

首先本文主要解决以下几个问题:

1.什么是DPI,什么是dp,什么是PX,什么是desity,这些干嘛用?
2.一张图片在安卓中到底占多少内存?

3.为什么安卓app的res目录下要用多个文件夹存放图片,有什么作用?

先聊聊屏幕分辨率相关的知识。

像素:由图像的小方格组成的,这些小方格的色彩数值和位置,决定了图像呈现的样子。

1像素就代表1px。

什么是屏幕尺寸?  屏幕对角线的长度

什么是屏幕分辨率 ? 屏幕分辨率=屏幕的宽有多少个像素*屏幕高有多少个像素。指显示器能显示的像素有多少。

屏幕大概分以下几种分辨率:

1920*1080 =2073600像素,俗称1080p屏幕。

2k屏,屏幕横向像素达到2000以上。主流是2560*1440,还有2048×1536(QXGA)、2560×1600(WQXGA)、2560×1440(Quad HD),也是2k屏家族的。

4K屏,名称来源于其横向解析度约为4000像素.屏幕分2种,有4096×2160和3840*2160。

什么是DPI? 每英寸中的像素数。比如设备分辨率是320*240,屏幕的长2英寸,宽1.5英寸,dpi=320/2=240/1.5=160

什么是density?每平方英寸的像素数。

但是在安卓中定义如下:

DisplayMetrics类中属性density的值为dpi/160

density=dpi/160

什么是dp?dp是安卓的特有单位,

dp=px/density

dp=px/(dpi/160)

如果dpi=160,那么在这个设备上的1dp=1px

这里展开说一下,其实我们蓝湖上看到的1280*720,单位是dp

而实际的设备有多少PX呢。如果是2K屏幕 一般就是2560*1440 ,因为density=px/dp ,也就是屏幕实际宽度/设计图的宽度,或者屏幕实际高度/设计图高度。

所以density=2560/1280=1440/720=2

来算算4K屏 按照4096*2160算    横向 density = 4096/1280=3.2    纵向density=2160/720=3 

大致可以看作 density=3

dp:安卓特殊的一种单位,是实际屏幕分辨率宽或者高/density

安卓的几个文件夹定义:

drawable-ldpi:低分辨率(基本没人用了):

density =0.75 , 分辨率是240*320,   dp=px/0.75

drawable-mdpi:中分辨率

density=1 , 分辨率是320*480 ,dp=px/1

drawable-hdpi:高分辨率

density=1.5,分辨率是480*800,dp=px/1.5

drawable-xhdpi:较高分辨率

density=2,分辨率=720*1280,dp=px/2

drawable-xxhdpi:超级高分辨率

density=3 ,分辨率=1080*1920 ,dp=px/3

drawable-xxxhdpi:顶级分辨率

density=4,分辨率=2560*4096 ,dp=px/4

一般都是做法是一套xxhdpi的切图,这样可以向上和向下兼容,节省apk的大小

当然,现在项目需求是2K屏和4K屏,也可以在资源中放2套图,这样,低分辨率的屏幕不用因为拿着高分辨率的图渲染而浪费内存。

如果严格按照需求,只要在drawable-xhdpi(对应2k屏)和drawable-xxhdpi(对应4K屏)放入相应的图片就能达到最好的图片清晰度适配。

我们来计算一下一张图片到底占多少内存

这里要补一些基础知识

1G=1024M=1024*1024k=1024*1024*1024字节(Byte) =1024*1024*1024*8位(bit)

bit代表最基本的0或者1

安卓默认颜色是格式是ARGB_888  : 

 A代表透明度 ,取值范围是0-255 换算成二进制就是 2的8次方  刚好就是1个byte =8bit

R代表红色red,取值范围0-255,也是相当于一个byte

G代表绿色green,取值范围0-255,相当于一个byte

b代表蓝色blue,取值范围0-255.,相当于一个byte

任何颜色只要通过ARGB这4个元素的组合就能表现出来。

那一个像素需要多少内存呢?

答案是4个byte

那一张100px*100px的图片在  2k屏幕中占多少内存呢?

正常情况下不考虑安卓这边做缩放处理

内存消耗=图片长度*图片宽度*4=40000B≈39.06K

这里要考虑到设别本身的dpi,还有文件存放的目录

一张图片实际在安卓设备中消耗的内存=图片长*图片宽*4*(设备横向的dpi/图片存放文件夹对应的dpi)*(设备纵向dpi/图片存放文件夹对应的dpi)

如下举例说明:

比如 当前设备density=2,也就是dpi=2*160=320,这个图片放在xhdpi中(这个文件夹本身对应dpi=320),

内存消耗的计算公式是 100*100*4*(320/320)*(320/320)≈39.06K

那么这张图片的内存消耗是39.06K

如果当前设备density=3,也就是dpi=3*160=480,这个图片仍然放在xhdpi中(这个文件夹本身对应dpi=320)

内存消耗的计算公式是100*100*4*(480/320)*(480/320)=87.89k

安卓图片资源的寻找规则是按照优先找设备dpi相匹配的图片资源文件夹的资源,如果没有找到,就取更高分辨率文件夹的资源,如果还找不到,就取低分辨率的文件夹资源。

各位看客老爷,如果这篇文章对你有把帮助,请点赞!

猜你喜欢

转载自blog.csdn.net/xiexiaotian11/article/details/106699174
今日推荐