跳转到内容

UI组件基础使用与构成

Author: Charley

UI 组件是经典 UI 系统的核心构成,封装了大量常用且实用的界面功能,便于开发者高效构建各类用户界面。

从引擎类结构来看,UIComponent 是经典 UI 系统中所有 UI 组件的基类。也就是说,所有 UI 组件本质上都是继承自 UIComponent 的派生类,具备统一的接口和行为特征。

UI 组件按照功能类型可分为基础组件容器组件。其中,Box 及其所有子类被归类为容器组件,用于承载和布局其他 UI 节点;而除 Box 系列以外的组件,则通常属于基础组件,用于直接显示文本、图片、按钮等界面元素。

基础UI组件显示对象,一共有17个,直接或间接继承于UIComponent,如图1-1的高亮部分所示。

1-1

(图1-1)

继承于Box的组件,加上Box容器本身,容器对象一共有9个。如图1-2的高亮部分所示。

1-2

(图1-2)

这些容器单单自己是没有意义的,必须要包括基础的UI组件作为子节点,才能使得组件功能完整。

例如,List必须要有基础UI组件作为列表的渲染单元,单选框组(RadioGroup)是多个单选框(Radio)组件的容器。

从引擎的类结构上看,弹窗视图组件 Dialog 并不继承自 UIComponent,因此在严格意义上不属于 UI 组件体系中的一员,其继承关系如图 1-3 所示。

1-3

(图1-3)

但在功能上,Dialog 是经典 UI 系统中使用频率极高的组件之一,所在IDE创建UI组件时,也归类在其中。常用于弹窗界面、提示窗口、对话框等应用场景。

UI组件的创建有三种方式:分别是从小部件(Widgets)面板里拖拽UI组件使用、从层级管理(Hierarchy)面板的右键菜单里创建、通过组件资源命名规则为资源命名,然后拖拽资源使用,直接被IDE识别。

小部件(Widgets)面板里包括了基础节点,也包括了UI组件,使用时直接拖拽到层级面板或场景编辑窗口内即可。效果如动图2-1所示。

(动图2-1)

层级管理(Hierarchy)面板的2D节点下,右键菜单里也可以直接创建UI组件,效果如图2-2所示。

2-2

(图2-2)

如果资源命名符合 UI 组件命名规则(具体规则可参见相关文档),则在将其拖拽到层级面板或场景视图时,IDE 会自动创建对应的 UI 组件,如图 2-3 所示。

(图2-3)

在 UI 组件中,相对布局数据源绑定灰化显示(变灰)以及禁用鼠标事件等,都是 UI 系统特有的功能属性。这些能力在 2D 基础对象(如 Sprite)中并不具备。

如图 3-1 所示,每个 UI 组件都具备一组用于相对定位的布局属性。而基础显示对象(如 Sprite)仅支持绝对布局

3-1

(图3-1)

在相对布局中,UI 组件的位置是相对于其父节点来计算的。这种布局方式提供了高度的灵活性,能在不同屏幕尺寸和方向下自动适配,确保界面元素在各类设备上的一致性与可用性。

代码中的使用示例如下:

this.xx.left = 0;
this.xx.right = 0;
this.xx.top = 0;
this.xx.bottom = 0;
this.xx.centerX = 0;
this.xx.centerY = 0;

在实际开发中,从网络获取的数据有时候与 UI 组件预期的数据结构不完全一致,尤其在处理列表组件时更为常见。此时可以通过设置组件的 dataSource,对原始数据进行结构调整,使其满足列表渲染所需的格式。

示例代码如下:

import { ItemBoxBase } from "./ItemBox.generated";
const { regClass, property } = Laya;
@regClass()
export class Script extends ItemBoxBase {
constructor() {
super();
}
get dataSource(): any {
return super.dataSource;
}
set dataSource(value: any) {
super.dataSource = value;
if (!value) return;
//把数据源里的值,给到子节点属性
if (value.avatar) {
let redHot = this.getChildByName("avatar").getChildByName("redHot") as Laya.Image;
redHot.visible = value.avatar.redHot.visible;
}
if (value.flag) {
let flagText = this.getChildByName("flag").getChildByName("flagText") as Laya.Text;
flagText.text = value.flag.flagText.text;
}
}
}

在 UI 组件中,设置 gray 属性可使组件进入灰化状态,将具有颜色的元素以灰色形式显示,如图3-2所示。用于提示“不可用”或“非当前状态”。

而设置 disabled 属性,则不仅会禁用鼠标交互(例如点击按钮无响应),还会自动将组件强制切换为灰化显示。这种视觉反馈可以让用户明显感知到该组件当前处于不可操作状态。

代码使用示例如下:

this.xx.disabled = true;