在我们学习如何进行屏幕适配之前,我们需要先了解下为什么Android需要进行屏幕适配。
由于Android系统的开放性,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,修改成他们想要的样子。
但是这种“碎片化”到底到达什么程度呢?
在2012年,OpenSignalMaps(以下简称OSM)发布了第一份Android碎片化报告,统计数据表明:
2012年,支持Android的设备共有3997种
2013年,支持Android的设备共有11868种。
2014年,支持Android的设备共有18796种。
六种单位介绍
px : 像素(pixels),即屏幕上的像素点,1px代表占据一个像素点。
dp : 独立像素(device independent pixels),这是我们使用最多的一种单位,一般来说我们在布局文件中定义控件(View)的宽高等属性时都会使用它。它是一种能够自动适应不同屏幕密度的单位,在160dpi的屏幕上,1dp = 1px。由于Android碎片化严重,使用它作为长度单位可以适配不同的屏幕密度。
sp : 比例像素(scaled pixels),我们定义字体大小的时候,一般都会使用sp作单位。sp除了能够像dp一样可以适应屏幕密度的变化,还可以随着系统字体的大小设置改变作出变化。如果产品经理不想文字随着手机设置中字体的大小发生改变(例如标题),可以使用dp代替。
in : 英寸(inch),屏幕的物理尺寸,1 inch = 2.54cm。
pt : 点(point,也是屏幕的物理尺寸,1 pt = 1/72 inch。
mm : 毫米(millimeter),后面三种都是物理尺寸,在Android开发中不常用。
dpi(每英寸的像素个数):
dp(设备无关像素):
SP:
边距:
解决方案:
支持各种屏幕尺寸
使用wrap_content、match_parent、weight
要确保布局的灵活性并适应各种尺寸的屏幕,应使用 “wrap_content” 和 “match_parent” 控制某些视图组件的宽度和高度。各个子控件通过设置weight(权重)来获得父控件中的剩余空间。
使用 “wrap_content”,系统就会将视图的宽度或高度设置成所需的最小尺寸以适应视图中的内容,而 “match_parent”(在低于 API 级别 8 的级别中称为 “fill_parent”)则会展开组件以匹配其父视图的尺寸。
如果使用 “wrap_content” 和 “match_parent” 尺寸值而不是硬编码的尺寸,视图就会相应地仅使用自身所需的空间或展开以填满可用空间。此方法可让布局正确适应各种屏幕尺寸和屏幕方向。
使用相对布局
LinearLayout却不允许你精准的控制它子view的关系,子view在LinearLayout中只能简单一个接一个的排成行。如果你需要你的子view不只是简简单单的排成行的排列,更好的方法是使用RelativeLayout,它允许你指定你布局中控件与控件之间的关系
在开发中,我们大部分时候使用的都是线性布局、相对布局和帧布局,绝对布局由于适配性极差,所以极少使用。
由于各种布局的特点不一样,所以不能说哪个布局好用,到底应该使用什么布局只能根据实际需求来确定。我们可以使用 LinearLayout 的嵌套实例并结合 “wrap_content” 和 “match_parent”,以便构建相当复杂的布局。不过,我们无法通过 LinearLayout 精确控制子视图的特殊关系;系统会将 LinearLayout 中的视图直接并排列出。
如果我们需要将子视图排列出各种效果而不是一条直线,通常更合适的解决方法是使用 RelativeLayout,这样就可以根据各组件之间的特殊关系指定布局了。例如,我们可以将某个子视图对齐到屏幕左侧,同时将另一个视图对齐到屏幕右侧。
总结
一般来说,我们在android开发中为了适配不同像素密度的屏幕,要避免使用px作单位。在设置文字大小时使用sp,除非不想文字随着系统字体设置变化大小。在代码中设置的长度单位默认是px,需要转换为dp或者sp。