View, View Groups, Layouts

View, View Groups, Layouts

可以说一切带有UI的程序本质,都是界面与背后代码的交互,安卓框架这就是典型的MVVM吧.

由于手机的所有操作,都是要通过用户界面来完成,编写应用很重要的一方面,就是确定界面,然后配上相应的逻辑操作代码.

安卓设备,其实包含了很多屏幕分辨率各不相同,而且又可以竖屏和横屏使用的设备,所以应用的界面要设计成适配各种分辨率以及在横屏竖屏下均可工作.所以要来看看组成用户界面的元素,以及如何排布这些元素.

View 视图

用户界面的每一个东西,都是android.view.View的一个子类,安卓SDK提供了一系列预先定义好的视图用于创建用户界面,比如按钮,复选框,文本输入等等.这些也被称为widgets或者component,如果默认的组件不能满足,也可以自己继承所需要的类或者接口来创建自定义视图.

一个视图也可以由多个其他的视图组件(composite view)组成,这些视图组件是android.view.ViewGroup的子类,当然,android.view.ViewGroup也是android.view.View的子类.典型的视图组件就是组合在一起的单选框(Radio).一般把这些视图组件称为child views子视图,包裹这些视图的视图被称为container view容器视图或root element根元素,看起来也很像WEB开发吧.

还有一种特殊的container view,被称为layout

layout 布局

除了之前提到的以widgets形态存在的视图,SDK中还有一种视图叫做layout,是一种container view,专门用来控制其子视图在屏幕上的排布顺序,所以这个东西也被称为布局.

SDK提供了如下几种布局:

ConstraintLayout

Android 7开始引入,用于大部分的布局,可以通过对子视图添加一些约束条件来快速排布复杂的页面,也深度集成于Android Studio Layout Editor,没有特殊情况一般都可以采用此布局.

LinearLayout

可以让子视图水平或者垂直排列,通过weight控制子视图之间的空隙,一般常用在列表展示等

TableLayout

以行和格子的形式组织子视图,一行由一个TableRow对象代表,其中包含一系列视图,以格子的形式放在一行中.

FrameLayout

这个布局很有意思,会从左上角,按照最后的顺序把子视图显示在最上层,可以通过调整参数center_vertical来控制子视图显示的位置,这个常用于一些特殊的动画.

RelativeLayout

可以通过控制子视图,来让其相对于其他子视图和布局来排布,比如A视图可以排布在整个布局的正中,B 视图可以排列在水平正中,但是A布局下边的30像素处.相对布局经常用来布置一些要在不同分辨率上显示界面的情况.

AbsoluteLayout

通过直接确定子视图的XY坐标来排布,一般不推荐使用,因为不能够响应分辨率和水平/垂直的变化.

GridLayout

由空白的行和列的线区分出来的单元格排布,可以让子视图跨越多个水平或者垂直的格子,可以通过控制Space属性来调整相邻元素的空白间隔.

CoordinatorLayout

Android 5引入,专门用来协调应用顶部的条状内容和其他视图之间的布局关系,会在之后详细了解.

除了这些布局之外,最重要的在于还要知道,这些布局都是可以嵌套的,以用来组成更加复杂的页面.对于我个人来说,将其理解为一些特定的已经做好的div元素就可以了.

视图层级

每一个视图,都代表着屏幕上一块矩形区域,视图要对其控制的矩形区域其中的显示和事件进行负责.一个用户界面,是有一系列视图层级组成的,根视图是在最底层的节点,然后一层层排布下去,最下边子视图,其实是显示在最上边(最靠近用户)的一层,子视图的显示,不能超出其上一级视图的范围.这个其实也很好理解,和WEB开发中的DOM树是一回事情.

了解了这几个概念,接下来就可以来创建用户界面了.创建用户界面主要有三种方法:

  1. Android Studio Layout Editor工具
  2. 直接编写XML文件
  3. 编写Java代码
LICENSED UNDER CC BY-NC-SA 4.0
Comment