界面布局
布局涉及到应用界面的整体。布局的层次感和逻辑,可以通过阴影来体现。
举个例子。在一张纸当中,增加一条折痕,一个区域就分成了关联性很强的两个区域,
将一张纸盖在另一张纸之上,就像是搭台阶一样,上层会在下层投下阴影,这两张纸代表了逻辑不同的两个区域,
纸张在z轴的位置,被称作Elevation
,很形象的比喻了纸片相对于别的照片被提升
了起来。
尺寸的度量
张纸片之间的距离产生阴影,那么距离用什么来衡量呢?要解答这个问题,我们首先要知道像素-px,物理尺寸-inch,像素密度-dpi和密度无关像素-dip这几个概念和它们之间的关系。
安卓系统提供了几种度量屏幕的单位:
px
:以像素为单位进行设置,屏幕上每一个点,就是一个像素,例如一部安卓手机,屏幕像素是1920 x 1080
,就是说屏幕高度有1920
个像素点,宽度有1080
个像素点,但是在安卓系统中,最好不要使用这个单位来设置尺寸,而是用dp
;sp
:用于字体大小的设置,它可以让字体大小根据用户在设置
中的设置,进行缩放;dp
:密度无关像素,这是在布局和控件中应该使用的单位;
dp的引入
如果用px为单位设定设备区域的大小,通常会有很大的问题。
假设有两个物理尺寸都为5寸大小的屏幕,它们的屏幕分辨率不同,一个是1080*1920,而另一个却是450*800.
如果指定一个按钮的大小为200px长,200px宽,那么它们的显示效果就如下图。很明显,两者的差别也太大了,界面就严重变形了。所以,想让一个区域的大小在不同屏幕的上显示的都差不多,就需要考虑像素密度。为了显示同样的长度,在密度大的屏幕上,使用到的像素就要多一些,在密度小的屏幕上,使用到的像素就要少一些。
所以为了解决这个问题,安卓引入了dip的概念-device independed pixel-简称dp。
dpi的定义
在近一步介绍dp
之前,要先讲讲dpi
。dpi
叫做屏幕像素密度,就是每英寸有多少个像素点。我们用简单的数学原理-勾股定理
就能算出刚才两个屏幕的dpi,一个是440dpi
,另一个是184dpi
。
注意,dpi
与dip(dp)
写法很像,千万不要混淆了,前者和密度有关,后者与像素有关。
dpi的划分
安卓使用dpi
为160的数值作为一个基准--baseline
,
- 如果一个设备的
dpi
刚好等于这个基准,那么它就是mdpi设备; - 如果一个设备的
dpi
是这个基准的1.5倍,那么它就是hdpi设备; - 如果一个设备的
dpi
是这个基准的2倍,那么它就是xhdpi设备; - 如果一个设备的
dpi
是这个基准的3倍,那么它就是xxhdpi设备;
这就是划分不同屏幕密度的依据。
像素密度类型 | 像素密度大小 | 与Baseline比值 |
---|---|---|
mdpi | 160 | 1 |
hdpi | 240 | 1.5 |
xhdpi | 320 | 2 |
xxhpi | 480 | 3 |
按照这样的约定划分,
- 刚才1080*1920的屏幕应该属于xxhdpi类型;
- 450*800的屏幕应该属于mdpi类型;
现在的安卓手机几乎都在往高清屏幕发展,所以xhdpi和xxhdpi是最为常见的设备类型。
dp与px的关系
安卓引入了dp(dip)
的概念之后,实际显示的像素就可以通过下面这个公式计算出来 px = dp * dpi / 160。
相同dp
的情况下,密度大的设备,实际像素就占的大,密度小点设备,实际像素就占用小了。因此使用dp这个单位后,按钮在两种不同的屏幕上的实际显示大小,几乎就是一样的了。
例如刚才两种屏幕。如果我指定按钮的大小为200dp*200dp,那么它们在各自的屏幕上占用的实际像素分别是230px*230px与550px*550px,真实设备上看上去的确差不多。
所以,我们以后在设计界面布局的时候,就可以在标准大小(mdpi类型,尺寸为360dp*640dp)
的屏幕上,使用dp
为单位进行设计就可以了。
了解了安卓系统使用的尺寸衡量标准以后,我们就可以开始研究布局的逻辑区域划分了。
布局的整体划分
安卓系统的界面大致可以分成三个部分:状态栏、内容区域、导航栏。
状态栏显示电池电量、手机信号、通知等信息。
导航栏显示返回、主界面、最近打开等三个虚拟按钮。
不过很多设备通过硬件按钮实现了这三个功能,所以就没有虚拟按键了。
内容区域就是给程序使用,显示程序自身内容的地方。它里面的内容也是像纸张一样,一层一层的堆放着的。
正如前面提到的那样,这三个区域也是像纸片一样,是层叠起来的,在z轴上存在空间关系。
内容元素
状态栏和导航栏的各个属性都是系统的,无法去进行z轴位置的控制,因此我们不必太过关注。各种不同的应用使用内容区域来显示各自的内容,这才是我们要讲的重点区域。
虽然这个区域的内容怎么显示都是由各个应用说了算,但是Material Design
给出了推荐的设计。
在内容区域当中,可以通过折痕、阴影等方式将这些区域划分成不同的逻辑块。
下面是一个典型的Material Design
布局(只是一个典型,并不是都这样,具体的布局方式还是要设计师来设计)。
AppBar
每个应用都有一个标题栏,叫做AppBar,它不仅可以显示这个应用的名称,也可以把更多的操作-Action
放在上面,比如搜索,分享,更多等动作。
它的位置处于z轴4dp处。
Float Button
悬浮按钮是Material Design
中一个很重要的特色。它是一个圆形的按钮,悬浮于内容区域的最上面。当我们按下这个按钮的时候,它就会进一步的浮动到更靠上的位置。
当它没有被按下单时候,位于界面布局的z轴上6dp处,当它被按下单时候,z轴位置被调整到12dp处
其他
除了上面的提及的几种内容元素意外,安卓系统还提供了很多别的元素,比如Dialog
Picker
Menu
Button
等等,它们在z轴上都有自己的位置,
至于每个元素在Material Design
中长什么样,我们会在后面的章节介绍。
除了前面介绍的这种典型布局,还有很多其他的布局,我们也是放到后面专门的章节来介绍。
本文是《从设计到实现-手把手教你做android应用开发》系列文档中的一篇。感谢您的阅读和反馈,对本文有任何的意见和建议请留言,我都会尽量一一回复。
如果您觉得本文对你有帮助,请推荐给更多的朋友;或者加入我们的QQ群348702074和更多的小伙伴一起讨论;也希望大家能给我出出主意,让这些文档能讲的更好,能最大化的帮助到希望学习开发的伙伴们。
除了CSDN发布的文章,本系列最新的文章将会首先发布到我的专属博客book.anddle.com。大家可以去那里先睹为快。