1.回想
从事安卓开发几年,现在回想一下,从刚入行时会展示几个简单的控件就开心不已,到后来接触Android的四大组件,再到自定义View,最后到使用第三方开源框架做几个自认为酷炫的功能……然后好像就止步不前了,中间好几年都是凭借着这点初级的东西在“浪费生命”……
直到前两年意识到不能再这样下去,如果对于日新月异的技术只是知其然,而不知其所以然,那很快就会被淘汰,于是开始研究源码。一研究源码,发现自己好像又啥也不会了,又处于了刚入行的迷茫中……
趁着21天学习挑战的机会,逼自己一把,跟着大神狠狠学21天!
打卡第一天:像素密度、屏幕密度、分辨率。
2.背景:
为了适配不同屏幕大小,Android开发过程中,需要在资源文件中添加ldpi、mdpi、nodpi、xhdpi、xxhdpi、xxxhdpi多张图片。
【21天学习挑战赛--第一天打卡(屏幕密度)】3.几个概念
①屏幕大小
屏幕大小指的是手机对角线的物理尺寸,以英寸(inch)为单位。英寸为国外的长度单位,它换算为国内的单位为:1英寸 = 2.54厘米。
一般手机尺寸有4英寸、4.5英寸、5.0英寸、5.2英寸、5.4英寸、5.99英寸、6.0英寸、6.2英寸等。
②屏幕分辨率
分辨率是手机屏幕的像素点总数,一般用屏幕宽的像素点数乘以屏幕高的像素点数。分辨率越大屏幕越细腻,能够显示的细节就越多。
常用的分辨率有320x240、640x480、1280x720、1280x960、1080x1920、2560x1440等,单位是像素。比如1080x1920表示屏幕宽度方向上有1080个像素,屏幕高方向上有1920个像素。
获取屏幕分辨率:
int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
// 屏幕宽
int screenHeight = getWindowManager().getDefaultDisplay().getHeight();
// 屏幕高
③像素密度densityDpi
像素密度(dpi,dots per inch;或PPI,pixels per inch)指每英寸的屏幕中包含的像素数量。
比如像素密度densityDpi为160,则表示每英寸屏幕中的像素点有160个,也就是说真实手机屏幕上,每2.54厘米就包含有160个像素点在里面,当然了,量长度还可以,像素点是看不见的,因为像素点非常非常的小。dpi为480的手机,理论是要比dpi为160的手机清晰很多很多,因为同样1英寸的屏幕大小,一个手机可以使用480个像素点来显示图像,一个只能用160个像素点来显示图像,效果肯定是差很多的。
④屏幕密度density
屏幕密度其实是像素密度的另外一种表示,是以160dpi=1.0为基准的。手机出厂之后屏幕密度,包括X,Y轴方向的像素密度都是固定值。
android以像素密度160dpi为基准对屏幕进行划分,当像素密度为160dpi时屏幕密度为1.0,像素密度为120dpi时屏幕密度为0.75,像素密度为320dpi时屏幕密度为2.0。
因此屏幕密度可以理解为密度的比例,也可以理解为dp换算为像素的比例(即1个dp等于几个像素)。标准的屏幕密度为160,它的密度比例就是1,即1个dp就等于1个像素。如果手机的densityDpi为320,则它是标准屏幕密度的两倍(320 / 160 = 2),则density = 2,表示1个dp就等于2个像素。举个例子,比如手机的densityDpi为320,然后你设置了一个控件的宽为60dp,则它显示到屏幕上的实际宽度为120像素,因为density = 2,所以60 * 2px = 120px。
获取像素密度和屏幕密度:
DisplayMetrics dm = new DisplayMetrics();
dm = getResources().getDisplayMetrics();
float density = dm.density;
// 屏幕密度(像素比例:0.75/1.0/1.5/2.0)
int densityDPI = dm.densityDpi;
// 像素密度(每寸像素:120/160/240/320)
float xdpi = dm.xdpi;
//X轴方向的像素密度
float ydpi = dm.ydpi;
//Y轴方向的像素密度
screenWidth = dm.widthPixels;
// 屏幕宽
screenHeight = dm.heightPixels;
// 屏幕高
4.多个drawable如何加载
android系统适配drawable时,会首先在与设备对应的dpi目录下查找。如果没有找,则会遵循“先高再低”原则,然后按比例缩放图片。
比如当前为xhdpi设备(项目中只有xxhdpi,xhdpi,xxhdpi,nodpi,mdpi,hdpi),则drawable的寻找顺序为:首先查找xhdpi目录,如果没找到就会查找xxhdpi,如果还没有找到就查找xxxhdpi,还没有找到就查找nodpi,如果还没有找到就查找hdpi,再找不到就查找mdpi,依次查找。如果在xxhdpi中找到目标图片,则压缩2/3来使用(因为系统认为它找到了一个比合适尺寸大的图片),如果在mdpi中找到图片,则放大2倍来使用(系统认为它找到了一个比适合尺寸小的图片,需要放大才能保证正常)。
推荐阅读
- 数据分析|pandas学习(三) grouping
- Web|Web学习(十一) Vue
- 单点登录|那些利用假期学习的职场人,后来都怎么样了()
- Pytorch学习笔记|Pytorch框架学习记录4——数据集的使用(torchvision.dataset)
- SSM框架学习|SSM框架学习——SpringBoot之基础配置
- spark|spark学习笔记(七)——sparkcore核心编程-RDD序列化/依赖关系/持久化/分区器/累加器/广播变量
- 数据库|全面、详细的SQL学习指南(MySQL方向)
- java|NIO与Netty学习指南
- 学习|k8s切换引擎为containerd