android屏幕参数介绍,以及适配基本过程

弱弱来分享一下android多种设备屏幕适配的机制 以及其中设备屏幕属性的的理解
先来说明一下 我的设备nexus5的屏幕参数
分辨率 1080x1920  宽:6.2cm(2.4409449in)  长: 11cm(4.3307087in) ps:in单位是指英寸

上张图

nexus5_screen_args_preview

这是我通过
DisplayMetrics metrics = getResources().getDisplayMetrics();
获取到的设备的DisplayMetrics
介绍里面几个值

先来几个跟实际应屏幕对的上 
heightPixels widthPixels 这个是指应用视图使用的屏幕分辩率
widthPixels = 1080 就不用说了 就是屏幕宽的分辨率 跟屏幕实际大小对得上的。
heightPixels= 1776 这个解释一下 我的屏幕高有1920的 为什么少了144个像素呢?这是因为任何底部的那三个虚拟按键 占走了一部分空间 高度就是144个像素

xdpi ydpi分别是指屏幕单位尺寸的像素数(单位:px/in 即单位英寸的像素个数)
xdpi = 442.451 = 1080px/2.4409449in
ydpi = 443.345 = 1920px/4.3307087in

densityDpi

再来说说densityDpi=480 
这是个系统属性  跟rom相关 
详情可以看/system/build.prop

nexus5_system_args_preview

有rc.sf.lcd_density=480 这就是由来

android_scale_args_preview

density

density=3.0=480/160=XXHDPI/MDPI
所以densityDpi 跟 density的关系就是160 
再来这scaledDensity=3.0 
Resource.java里有这句
mMetrics.scaledDensity = mMetrics.density * mConfiguration.fontScale;
mConfiguration.fontScale通常值为1.0
所以mMetrics.scaledDensity = mMetrics.density = 3.0

fontScale

mConfiguration.fontScale 这个是跟系统设置 =>显示 =>字体大小相关的

android_fontsize_args_preview

fontScale 小为0.85 普通为1.0 大为1.15 超大为1.3
这也是为什么调节这个,所有的应用程序中以sp定义字体大小的文字都会跟着变化。

单位换算

开始来讲讲布局时用的一些单位  dp(dip Density-independent pixel)  sp  px之间的关系
布局时采用dp或ps为单位时  到了屏幕上有一下转换关系
px = dp* density
px =  sp *  scaledDensity 
(转换的结果是float型的小数点一位要四舍五入 取整)

所以dp  sp 换算成px通常情况下是一样。因为density 跟scaledDensity 是一样,但是调整了系统的字体大小后 scaledDensity变了 所以所有用了sp为单位的字体都跟着变化了

屏幕适配

再来说说android适配屏幕的过程
开发的时候 我们通常会有好几个资源文件 drawable  drawable-ldpi drawable-mdpi drawable-hdpi drawable-xhdpi drawable-xxhdpi drawable-xxxhdpi等
假设我们用了nexus5 作为设备调试ui ,于是我们就会整合一套以1080x1920分辨率的资源图到 drawable-xxhdip目录里(nexus5 是~480dip的) nexus5 基本完美了,到了nexus4 会怎样呢。
先介绍一下nexus4 信息 :768x1280分辨率  ~320dpi
所以nexus4 优先会用drawable-xhdpi的资源。如果drawable-xhdpi没有,则会从高dpi的开始找起,一支找到同名的资源然后根据该目录对应的density缩放。比如在drawable-xxhdip里找到了张图 分辨率为300x300 但是到了 nexus4中自适应显示的时候就是占200x200的像素值了。
ps:你也可以通过drawable带分辨率来指定 特殊屏幕的定制

以dp为单位的数值呢?
比如180dp来说,在nexus5中就是540px=180dp*3.0 。而在nexus4中则为360px=180dp*2.0  当然算的时候结果中有小数时得四舍五入
所以就有了 px = (int)(dp*density + 0.5)

阅读量: