目录
- 关于单位
- 关于屏幕密度
- res包下的包命名
关于单位
概念:
- 【px】pixels,像素
- 【sp】scaled pixels,缩放像素
- 【dp/dip】device independent pixels,设备独立像素
- 【dpi】dots per inch,每英寸所打印的点数(不晓得它的专业名称,所以暂时称它为“密度”)
- 【ppi】pixels per inch,像素密度
知识点:
- 480*800、720*1280、1080*1920等屏幕分辨率的单位是像素,即px
- 手机的屏幕参数中有一项屏幕像素密度,单位是ppi,比如445ppi
- 在Android设备中,dpi等价于ppi,常用dpi来表示屏幕密度。dpi和ppi的区别可参考PPI vs. DPI: what’s the difference?
- 在布局中一般使用sp表示文字大小,比如android:textSize=”16sp”
- 在布局中一般使用dp/dip作为文字大小以外的数字单位,比如android:layout_width=”120dp”,android:layout_marginTop=”10dp”
- 手机的屏幕参数中有一项屏幕尺寸,单位是英寸,比如5英寸,是指屏幕对角线的长度
换算:
- 屏幕分辨率为1080*1920,尺寸为5英寸的手机,其宽为1080px,高为1920px,根据勾股定理对角线为2203px,像素密度为2203px/5英寸=440ppi,也就是440dpi
- px=dp*(dpi/160),px和dp之间的换算公式,这里px、dp、dpi都代表数值,不考虑单位
关于密度
目前在Android中,根据dpi,屏幕分为ldpi、mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi这么6种。
- ldpi,至少达到120dpi,分辨率一般为240*320
- mdpi,至少达到160dpi,分辨率一般为320*480
- hdpi,至少达到240dpi,分辨率一般为480*800
- xhdpi,至少达到320dpi,分辨率一般为720*1280
- xxhdpi,至少达到480dpi,分辨率一般为1080*1920
- xxxdpi,至少达到640dpi,分辨率一般为1440*2560
在密度为160dpi的屏幕中,1dp=1px,因此mdpi为基准屏幕。6种屏幕密度比例为3:4:6:8:12:16,即
- 在ldpi的屏幕中,1dp=0.75px,比如icon为36*36
- 在mdpi的屏幕中,1dp=1px,比如icon为48*48
- 在hdpi的屏幕中,1dp=1.5px,比如icon为72*72
- 在xhdpi的屏幕中,1dp=2px,比如icon为96*96
- 在xxhdpi的屏幕中,1dp=3px,比如icon为144*144
- 在xxxhdpi的屏幕中,1dp=4px,比如icon为192*192
由以上的数据可以很容易得出
- 320*480的屏幕宽度为320dp
- 480*800的屏幕宽度为320dp
- 720*1280的屏幕宽度为360dp
- 1080*1920的屏幕宽度为360dp
- 1440*2560的屏幕宽度为360dp
由此可见,只是在布局中使用dp还无法很好地自适应屏幕,需要考虑屏幕高度和宽度。但是相对于以px为单位的320*480、480*800等屏幕分辨率来说,以dp为单位能大大减少屏幕差异。
res包下的包命名
drawable,放置图片资源。
- drawable,xml配置文件和对分辨率要求较低的图片资源
- drawable-ldpi,密度为ldpi的屏幕使用的图片资源
- drawable-mdpi,密度为mdpi的屏幕使用的图片资源
- drawable-hdpi,密度为hdpi的屏幕使用的图片资源
- drawable-xhdpi,密度为xhdpi的屏幕使用的图片资源
- drawable-xxhdpi,密度为xxhdpi的屏幕使用的图片资源
- drawable-xxxhdpi,密度为xxxhdpi的屏幕使用的图片资源
- drawable-nodpi,按照实际像素大小进行显示,不会被缩放
layout,放置布局文件。layout包可以根据屏幕分辨率自定义,格式为“layout-高度x宽度”,比如分辨率为480*800的手机会优先使用layout-800x480包下的布局文件
- layout,通用
- layout-854x480,屏幕为480*854
- layout-1280x768,屏幕为768*1280
- layout-small,屏幕至少为320*426
- layout-normal,屏幕至少为320*470
- layout-large,屏幕至少为480*640
- layout-xlarge,屏幕至少为720*960
- layout-land,横屏
- layout-port,竖屏
- layout-land-854x480,屏幕为480*854,且为横屏
- layout-large-land,屏幕至少为480*640,且为横屏
注意事项:
在android3.0后,需将高度减去48像素,即底部状态栏的高度,比如分辨率为480*854对应layout-806x480。分辨率中大的数字必须写到前面。
values,放置strings.xml、dimens.xml、styles.xml、colors.xml等资源文件。
- values-v11,API 11以上
- values-v14,API 14以上
- values-v21,API 21以上
- values-sw600dp,高度和宽度都大于600dp
- values-w800dp,宽度大于800dp
- values-h820dp,高度大于820dp
- values-sw480dp-land,高度和宽度都大于480dp,且为横屏
当在对应包中找不到需要的资源文件,会自动从合适的其他包中去找,比如在drawable-xhdpi包中找不到需要的图片时,会去drawable-xxhdpi中找,如果也没有,再到drawable-xxxhdpi中找,如果还没有,再到drawable-hdpi中找,直到找到为止。
暂时找到了这些知识点,后续有新的发现再做更新。