界面布局

布局涉及到应用界面的整体。布局的层次感和逻辑,可以通过阴影来体现。

举个例子。在一张纸当中,增加一条折痕,一个区域就分成了关联性很强的两个区域,

 material_paper_seams

将一张纸盖在另一张纸之上,就像是搭台阶一样,上层会在下层投下阴影,这两张纸代表了逻辑不同的两个区域,

 material_paper_step

纸张在z轴的位置,被称作Elevation,很形象的比喻了纸片相对于别的照片被提升了起来。

尺寸的度量

张纸片之间的距离产生阴影,那么距离用什么来衡量呢?要解答这个问题,我们首先要知道像素-px,物理尺寸-inch,像素密度-dpi和密度无关像素-dip这几个概念和它们之间的关系。

安卓系统提供了几种度量屏幕的单位:

  1. px:以像素为单位进行设置,屏幕上每一个点,就是一个像素,例如一部安卓手机,屏幕像素是1920 x 1080,就是说屏幕高度有1920个像素点,宽度有1080个像素点,但是在安卓系统中,最好不要使用这个单位来设置尺寸,而是用dp
  2. sp:用于字体大小的设置,它可以让字体大小根据用户在设置中的设置,进行缩放;
  3. dp:密度无关像素,这是在布局和控件中应该使用的单位;

dp的引入

如果用px为单位设定设备区域的大小,通常会有很大的问题。

假设有两个物理尺寸都为5寸大小的屏幕,它们的屏幕分辨率不同,一个是1080*1920,而另一个却是450*800.

如果指定一个按钮的大小为200px长,200px宽,那么它们的显示效果就如下图。很明显,两者的差别也太大了,界面就严重变形了。所以,想让一个区域的大小在不同屏幕的上显示的都差不多,就需要考虑像素密度。为了显示同样的长度,在密度大的屏幕上,使用到的像素就要多一些,在密度小的屏幕上,使用到的像素就要少一些。

 dp_explain1

所以为了解决这个问题,安卓引入了dip的概念-device independed pixel-简称dp。

dpi的定义

在近一步介绍dp之前,要先讲讲dpidpi叫做屏幕像素密度,就是每英寸有多少个像素点。我们用简单的数学原理-勾股定理就能算出刚才两个屏幕的dpi,一个是440dpi,另一个是184dpi

 dp_explain2

注意,dpidip(dp)写法很像,千万不要混淆了,前者和密度有关,后者与像素有关。

dpi的划分

安卓使用dpi为160的数值作为一个基准--baseline,

  1. 如果一个设备的dpi刚好等于这个基准,那么它就是mdpi设备;
  2. 如果一个设备的dpi是这个基准的1.5倍,那么它就是hdpi设备;
  3. 如果一个设备的dpi是这个基准的2倍,那么它就是xhdpi设备;
  4. 如果一个设备的dpi是这个基准的3倍,那么它就是xxhdpi设备;

这就是划分不同屏幕密度的依据。

像素密度类型 像素密度大小 与Baseline比值
mdpi 160 1
hdpi 240 1.5
xhdpi 320 2
xxhpi 480 3

按照这样的约定划分,

  1. 刚才1080*1920的屏幕应该属于xxhdpi类型;
  2. 450*800的屏幕应该属于mdpi类型;

现在的安卓手机几乎都在往高清屏幕发展,所以xhdpi和xxhdpi是最为常见的设备类型。

dp与px的关系

安卓引入了dp(dip)的概念之后,实际显示的像素就可以通过下面这个公式计算出来 px = dp * dpi / 160。

相同dp的情况下,密度大的设备,实际像素就占的大,密度小点设备,实际像素就占用小了。因此使用dp这个单位后,按钮在两种不同的屏幕上的实际显示大小,几乎就是一样的了。

例如刚才两种屏幕。如果我指定按钮的大小为200dp*200dp,那么它们在各自的屏幕上占用的实际像素分别是230px*230px与550px*550px,真实设备上看上去的确差不多。

 dp_explain3

所以,我们以后在设计界面布局的时候,就可以在标准大小(mdpi类型,尺寸为360dp*640dp)的屏幕上,使用dp为单位进行设计就可以了。


了解了安卓系统使用的尺寸衡量标准以后,我们就可以开始研究布局的逻辑区域划分了。

布局的整体划分

安卓系统的界面大致可以分成三个部分:状态栏、内容区域、导航栏。

  • 状态栏显示电池电量、手机信号、通知等信息。

     status_bar
  • 导航栏显示返回、主界面、最近打开等三个虚拟按钮。

     nav_bar

    不过很多设备通过硬件按钮实现了这三个功能,所以就没有虚拟按键了。

  • 内容区域就是给程序使用,显示程序自身内容的地方。它里面的内容也是像纸张一样,一层一层的堆放着的。

     material_content_area

正如前面提到的那样,这三个区域也是像纸片一样,是层叠起来的,在z轴上存在空间关系。

内容元素

状态栏和导航栏的各个属性都是系统的,无法去进行z轴位置的控制,因此我们不必太过关注。各种不同的应用使用内容区域来显示各自的内容,这才是我们要讲的重点区域。

虽然这个区域的内容怎么显示都是由各个应用说了算,但是Material Design给出了推荐的设计。

在内容区域当中,可以通过折痕、阴影等方式将这些区域划分成不同的逻辑块。

下面是一个典型的Material Design布局(只是一个典型,并不是都这样,具体的布局方式还是要设计师来设计)。

 material_classic_layout

AppBar

每个应用都有一个标题栏,叫做AppBar,它不仅可以显示这个应用的名称,也可以把更多的操作-Action放在上面,比如搜索,分享,更多等动作。

 material_classic_appba

它的位置处于z轴4dp处。

Float Button

悬浮按钮是Material Design中一个很重要的特色。它是一个圆形的按钮,悬浮于内容区域的最上面。当我们按下这个按钮的时候,它就会进一步的浮动到更靠上的位置。

 material_classic_float_button

当它没有被按下单时候,位于界面布局的z轴上6dp处,当它被按下单时候,z轴位置被调整到12dp处

其他

除了上面的提及的几种内容元素意外,安卓系统还提供了很多别的元素,比如Dialog Picker Menu Button等等,它们在z轴上都有自己的位置,

 material_elevation

 material_elevation_table

至于每个元素在Material Design中长什么样,我们会在后面的章节介绍。

除了前面介绍的这种典型布局,还有很多其他的布局,我们也是放到后面专门的章节来介绍。