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

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相匹配的图片资源文件夹的资源,如果没有找到,就取更高分辨率文件夹的资源,如果还找不到,就取低分辨率的文件夹资源。

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

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

  1. 安卓图片内存优化(一)——图片占用内存大小的计算

    安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊手段获取到几百兆内存空间的情况).所以为了节省更多的空间需要对图片进 ...

  2. Android 中图片占用内存分析

    Android 在加载图片的时候一定会考虑到的一个点就是如何防止 OOM,那么一张图片在加载的时候到底会占用多少内存呢?有哪些因素会影响占用的内存呢?知道了这些,我们才能知道可以从哪些点去优化,从而避 ...

  3. Android | 如何计算图片占用内存的大小

    前言 对于一张图片,你知道应该存放在那个资源目录下面吗,或者说,放在那个资源目录下加载起来更省内存呢?在日常开发中我们可能不太注意这些东西,但是这些却是基础,是必不可少的一环,所以这几天重新温习了一下 ...

  4. android 图片占用内存大小及加载解析

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在讲解图片占用内存前,我们先问自己几个问题: 我们在对手机进行屏幕适时,常想可不可以只切一套图适配所有的手机呢? 一张图片加载到手 ...

  5. android 图片占用内存的计算

    Android高效内存1:一张图片占用多少内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占用.而在App中,大部分内存可能被我们图片占用了,所以减少图片的内存 ...

  6. per.ccz与png图片占用内存对比

    pvr相比png优势 1.压缩,2gpu能直接识别,不需要额外的内存开销,3.可以自定义色深 pvr与png的内存占用    转载▼ Zwoptex生成的spritesheet除了可以导出png格式的 ...

  7. 安卓中图片占用内存大小分析

    相关概念: 位深 色彩空间 颜色通道 int型占用字节 位深: 位是二进制的位.位深是指计算机系统中图片的一个像素点占用的二进制位数.例如位深32,就是使用2^8 = 32 位二进制来表示像素值.例如 ...

  8. cocos-js,内存管理2---计算图片占用内存

    一.1张图片内存如何计算 一张图片占用的内存由以下两个因素决定: 图片的像素点个数 单位像素占用的字节数 其中图片的像素点个数是图片的宽度与长度的积,所以一张图片占用的内存值为: 图片长度 * 图片宽 ...

  9. android图片适配(图片大小与屏幕密度)Bitmap占用内存计算

    目录 概述 dpi 计算公式 dp与px换算公式: android系统适配图片规律: 同名图片放在不同密度的文件夹下,系统选择图片规律 同一张图片,放在不同密度的Drawable文件夹下,ImageV ...

最新文章

  1. 学习笔记(5)——实验室集群LVS监控Web界面配置
  2. 转:QQ圈子:社交神器还是隐私魔鬼?
  3. GMM_example(1)
  4. Java常用数据类型
  5. Java 编程需要注意的细节
  6. 动手实现MVC: 4. AOP的设计与实现
  7. Memory for crash kernel (0x0 to 0x0) notwithin permissible range
  8. 剑指 只出现一次的数字
  9. 使用struts框架接受http请求过来的get和post数据的方法:
  10. html 字体图标大小,CSS ICONFONT 基线和大小问题
  11. 基于JavaWeb的3D网上模板商城
  12. php编写网页实例,网页实例:怎么详细介绍用PHP来编写网页记数器
  13. YOLOv3: An Incremental Improvement (YOLOv3 论文翻译)
  14. mysql中comment(注释)的一些用法
  15. 机器学习概要(MACHINE LEARNING SUMMARY)
  16. 看了下李航的《统计学习方法》
  17. CoAP协议学习笔记(一)
  18. centos 安装miniconda
  19. 2022版本的idea没有定位图标
  20. 【动态规划】走楼梯问题

热门文章

  1. 下列哪个不是python的第三方库_以下选项中,不是 Python 中用于开发用户界面的第三方库是()...
  2. C++学习(二八一)Gradle下载目录里的随机码是什么
  3. 【学习笔记】无限极分类学习
  4. 微信聊天记录没有备份可以恢复吗?吐血整理分享
  5. 解决laytpl.js模板引擎插件加载模板后无法获取模板中的元素id等内容
  6. 用友NC 漏洞汇总(转载)
  7. 第一行代码Android技巧1——知晓当前是在哪一个活动
  8. 品牌软文营销借助故事的力量打动用户
  9. django模板使用
  10. Win11-GTX3060-配置Pytorch GPU