UI 用户界面
ui 模块提供了编写用户界面的支持。
带有 ui 的脚本的的最前面必须使用 "ui"; 指定 ui 模式,否则脚本将不会以 ui 模式运行。
正确示范:
"ui";
//脚本的其他代码
字符串"ui"的前面可以有注释、空行和空格 [v4.1.0 新增],但是不能有其他代码。
界面是由视图(View)组成的。View 分成两种,控件(Widget)和布局(Layout)。控件(Widget)用来具体显示文字、图片、网页等,比如文本控件(text)用来显示文字,按钮控件(button)则可以显示一个按钮并提供点击效果,图片控件(img)则用来显示来自网络或者文件的图片,除此之外还有输入框控件(input)、进度条控件(progressbar)、单选复选框控件(checkbox)等;布局(Layout)则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置,比如垂直布局(vertical)会把他里面的控件从上往下依次显示(即纵向排列),水平布局(horizontal)则会把他里面的控件从左往右依次显示(即横向排列),以及帧布局(frame),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。
我们使用 xml 来编写界面,并通过ui.layout()函数指定界面的布局 xml。举个例子:
"ui";
ui.layout(
<vertical>
<button text="第一个按钮" />
<button text="第二个按钮" />
</vertical>
);
在这个例子中,第 3~6 行的部分就是 xml,指定了界面的具体内容。代码的第 3 行的标签<vertical> ... </vertical>表示垂直布局,布局的标签通常以<...>开始,以</...>结束,两个标签之间的内容就是布局里面的内容,例如<frame> ... </frame>。在这个例子中第 4, 5 行的内容就是垂直布局(vertical)里面的内容。代码的第 4 行是一个按钮控件(button),控件的标签通常以<...开始,以/>结束,他们之间是控件的具体属性,例如<text ... />。在这个例子中text="第一个按钮"的部分就是按钮控件(button)的属性,这个属性指定了这个按钮控件的文本内容(text)为"第一个按钮"。
代码的第 5 行和第 4 行一样,也是一个按钮控件,只不过他的文本内容为"第二 个按钮"。这两个控件在垂直布局中,因此会纵向排列,效果如图:

如果我们把这个例子的垂直布局(vertical)改成水平布局(horizontal),也即:
"ui";
ui.layout(
<horizontal>
<button text="第一个按钮" />
<button text="第二个按钮" />
</horizontal>
);
则这两个按钮会横向排列,效果如图:
一个控件可以指定多个属性(甚至可以不指定任何属性),用空格隔开即可;布局同样也可以指定属性,例如:
"ui";
ui.layout(
<vertical bg="#ff0000">
<button text="第一个按钮" textSize="20sp" />
<button text="第二个按钮" />
</vertical>
);
第三行bg="#ff0000"指定了垂直布局的背景色(bg)为"#ff0000",这是一个 RGB 颜色,表示红色(有关 RGB 的相关知识参见RGB 颜色对照表)。第四行的textSize="20sp"则指定了按钮控件的字体大小(textSize)为"20sp",sp 是一个字体单位,暂时不用深入理会。上述代码的效果如图:

一个界面便由一些布局和控件组成。为了便于文档阅读,我们再说明一下以下术语:
- 子视图, 子控件: 布局里面的控件是这个布局的子控件/子视图。实际上布局里面不仅仅只能有控件,还可以是嵌套的布局。因此用子视图(Child View)更准确一些。在上面的例子中,按钮便是垂直布局的子控件。
- 父视图,父布局:直接包含一个控件的布局是这个控件的父布局/父视图(Parent View)。在上面的例子中,垂直布局便是按钮的父布局。
视图: View
控件和布局都属于视图(View)。在这个章节中将介绍所有控件和布局的共有的属性和函数。例如属性背景,宽高等(所有控件和布局都能设置背景和宽高),函数click()设置视图(View)被点击时执行的动作。
w
View 的宽度,是属性width的缩写形式。可以设置的值为*, auto和具体数值。其中*表示宽度尽量填满父布局,而auto表示宽度将根据 View 的内容自动调整(自适应宽度)。例如:
"ui";
ui.layout(
<horizontal>
<button w="auto" text="自适应宽度" />
<button w="*" text="填满父布局" />
</horizontal>
);
在这个例子中,第一个按钮为自适应宽度,第二个按钮为填满父布局,显示效果为:

如果不设置该属性,则不同的控件和布局有不同的默认宽度,大多数为auto。
宽度属性也可以指定一个具体数值。例如w="20",w="20px"等。不加单位的情况下默认单位为 dp,其他单位包括 px(像素), mm(毫米), in(英寸)。有关尺寸单位的更多内容,参见尺寸的单位: Dimension。
"ui";
ui.layout(
<horizontal>
<button w="200" text="宽度200dp" />
<button w="100" text="宽度100dp" />
</horizontal>
);
h
View 的高度,是属性height的缩写形式。可以设置的值为*, auto和具体数值。其中*表示宽度尽量填满父布局,而auto表示宽度将根据 View 的内容自动调整(自适应宽度)。
如果不设置该属性,则不同的控件和布局有不同的默认高度,大多数为auto。
宽度属性也可以指定一个具体数值。例如h="20",h="20px"等。不加单位的情况下默认单位为 dp,其他单位包括 px(像素), mm(毫米), in(英寸)。有关尺寸单位的更多内容,参见尺寸的单位: Dimension。
id
View 的 id,用来区分一个界面下的不同控件和布局,一个界面的 id 在同一个界面下通常是唯一的,也就是一般不存在两个 View 有相同的 id。id 属性也是连接 xml 布局和 JavaScript 代码的桥梁,在代码中可以通过一个 View 的 id 来获取到这个 View,并对他进行操作(设置点击动作、设置属性、获取属性等)。例如:
"ui";
ui.layout(
<frame>
<button id="ok" text="确定" />
</frame>
);
//通过ui.ok获取到按钮控件
toast(ui.ok.getText());
这个例子中有一个按钮控件"确定",id 属性为"ok",那么我们可以在代码中使用ui.ok来获取他,再通过getText()函数获取到这个按钮控件的文本内容。
另外这个例子中使用帧布局(frame)是因为,我们只有一个控件,因此用于最简单的布局帧布局。
gravity
View 的"重力"。用于决定 View 的内容相对于 View 的位置,可以设置的值为:
left靠左right靠右top靠顶部bottom靠底部center居中center_vertical垂直居中center_horizontal水平居中
例如对于一个按钮控件,gravity="right"会使其中的文本内容靠右显示。例如:
"ui";
ui.layout(
<frame>
<button gravity="right" w="*" h="auto" text="靠右的文字" />
</frame>
);
显示效果为:
这些属性是可以组合的,例如gravity="right|bottom"的 View 他的内容会在右下角。
layout_gravity
View 在布局中的"重力",用于决定 View 本身在他的父布局的位置,可以设置的值和 gravity 属性相同。注意把这个属性和 gravity 属性区分开来。
"ui";
ui.layout(
<frame w="*" h="*">
<button layout_gravity="center" w="auto" h="auto" text="居中的按钮" />
<button
layout_gravity="right|bottom"
w="auto"
h="auto"
text="右下角的按钮"
/>
</frame>
);
在这个例子中,我们让帧布局(frame)的大小占满整个屏幕,通过给第一个按钮设置属性layout_gravity="center"来使得按钮在帧布局中居中,通过给第二个按钮设置属性layout_gravity="right|bottom"使得他在帧布局中位于右下角。效果如图:

要注意的是,layout_gravity 的属性不一定总是生效的,具体取决于布局的类别。例如不能让水平布局中的第一个子控件靠底部显示(否则和水平布局本身相违背)。