# miniExtend CustomUI
对应源文件: ui.lua 。
原型为 Event ,但以面相对象方式描述界面与元件,且支持 miniExtend Object 。
TIP
大多数 CustomUI 下的函数都会包含一个 playerid 参数,它表示要响应该改变的玩家 ID。
该参数不会被检查,如果 playerid 非逻辑真,则以 objid 代替。
CustomUI 下的所有未表明返回值的函数或方法,一律返回 true ,表示调用成功。如果返回 false ,表示调用失败了。
# 子类介绍
# 子类之间的关系
CustomUI.UIViewUI 界面类。 该类管理CustomUI.Element(其子类)对象。CustomUI.ElementUI 元件类。 该类在 miniExtend 中并没有提供构造函数,因为在 UI 界面中创建的元件必定是其子类所指元件类型。 之所以定义这个类,是因为不同种元件也有许多相同的方法。 这个类包含了 UI 元件的基本操作,这些操作可应用于所有元件。CustomUI.ImageUI 图片元件类。CustomUI.Image对象管理 UI 界面下的图片元件,继承自CustomUI.Element。 该类只额外提供了一个setTexture(url [, playerid])方法。CustomUI.ButtonUI 按钮元件类。CustomUI.Button对象管理 UI 界面下的按钮元件,继承自CustomUI.Image。 该类相比父类并没有提供额外的方法,但提供了两个参数pressCallBack和clickCallBack,它们允许你处理按钮事件。CustomUI.TextUI 文本元件类。CustomUI.Text对象管理 UI 界面下的文本元件,继承自CustomUI.Element。 该类额外提供了两个方法:setFontSize(size [, playerid]和setText(text [, playerid])。CustomUI.EditBoxUI 输入框元件类。CustomUI.EditBox对象管理 UI 界面下的输入框元件,继承自CustomUI.Text。 该类额外提供了一个参数inputCallBack,它允许你处理输入框事件。
# CustomUI.UIView 类
一个 CustomUI.UIView 对象代表了一个 UI 界面。
构造函数:CustomUI:newUIView(uiid) ,构造一个 CustomUI.UIView 对象。
uiid:string类型,指定该 UI 界面的 id ,该参数不会被检查。
函数返回一个 CustomUI.UIView 对象,其 id 属性为 uiid 。
TIP
在同一作用域下, uiid 用于唯一性判断。
如果 uiid 参数相同,构造两次 CustomUI.UIView 对象,等价于构造一次。
成员属性:
id:string类型, UI 界面的 ID ,等于调用CustomUI:newUIView()时传递的uiid属性。showCallBack: 默认为nil,如果有则为function类型,指定当 UI 界面显示时回调的函数,你可以修改它来改变 UI 界面显示时回调的函数。hideCallBack: 默认为nil,如果有则为function类型,指定当 UI 界面隐藏时回调的函数,类似showCallBack。这比showCallBack属性有用,因为桌面端玩家可能会按下Esc键来意外退出 UI 界面。images:table类型,包含属于该界面的CustomUI.Image对象。buttons:table类型,包含属于该界面的CustomUI.Button对象。texts:table类型,包含属于该界面的CustomUI.Text对象。editBoxes:table类型,包含属于该界面的CustomUI.EditBox对象。
成员函数:
show([playerid]):使玩家打开该 UI 界面。hide([playerid]):使玩家隐藏该 UI 界面。setState(state [, playerid]):设置该 UI 界面创建过的所有元件对象所指元件的状态为state:string,参见CustomUI.Element.setState(state [, playerid])。newImage(elementid):创建或获取已有的 ID 为elementid:string的CustomUI.Image对象。newButton(elementid):创建或获取已有的 ID 为elementid:string的CustomUI.Button对象。newText(elementid):创建或获取已有的 ID 为elementid:string的CustomUI.Text对象。newEditBox(elementid):创建或获取已有的 ID 为elementid:string的CustomUI.EditBox对象。
# CustomUI.Element 类
一个 CustomUI.Element 对象代表一个 UI 元件。
这是一个抽象类,无法构造对象示例,应该构造其子类的实例。使用 CustomUI.UIView 对象的最后四个方法来创建元件对象。
成员属性:
uiView:table类型,元件所属CustomUI.UIView对象。id:stirng类型,元件 ID ,等于构造该元件对象时传递的elementid参数。
成员函数:
show([playerid]):显示该元件。hide([playerid]):隐藏该元件。setDisplay(display [, playerid]):设置元件的显示状态,如果display为true,显示元件,否则隐藏元件。setState(state [, playerid]):设置元件的状态为state。setPosition(x, y [, playerid]):如果x不为table类型,调用该重载函数,设置元件的位置为(x, y)。setPosition(position [, playerid]):否则调用该重载函数,设置元件的位置为 (positon["x"] or position[1], position["y"] or position[2]) 。setSize(width, height [, playerid]):如果width不为table类型,调用该重载函数,设置元件宽度为width,高度为height。setSize(size [, playerid]):否则调用该重载函数,设置元件宽度为size["width"] or size[1],高度为size["height"] or size[2]。setAngle(angle [, playerid]):旋转元件至angle:number角度,将原始元件(角度为 0 )以__元件位置__为旋转点顺时针旋转angle:number度得到旋转后的元件。setColor(color [, playerid]):设置元件 RGB 颜色为color:number,取值范围为0x000000~0xffffff,对于0xRrGgBb的color参数,则红色值为0xRr,绿色值为0xGg,蓝色值为0xBb。setAlpha(alpha [, playerid]:设置元件透明度为alpha:number, 取值范围为0~100,0 为完全透明, 100 为完全不透明。
# CustomUI.Image 类
一个 CustomUI.Image 对象代表一个 UI 图片元件。
构造函数:CustomUI.UIView:newImage(elementid) ,构造一个 CustomUI.Image 对象。
成员函数:
setTexture(url [, playerid]):url的类型为string。- 设置图片的纹理为
url。 - 可以通过 "ID库" -"图片" 来获取
url。
# CustomUI.Button 类
一个 CustomUI.Button 对象代表一个 UI 图片元件。
构造函数:CustomUI:newButton(uiid) ,构造一个 CustomUI.Button 对象。
TIP
你可以对一个按钮元件使用 CustomUI.UIView:newImage(elementid); 来获取一个 CustomUI.Image 对象并把元件当做图片操作,但是不建议这么做,对于 CustomUI.Text 和 CustomUI.EditBox 也如此。
成员变量:
pressCallBack:默认为nil,如果有则为function类型,指定当所指按钮被按下时回调的函数。clickCallBack:该属性与pressCallBack属性类似,但在按钮被点击时回调。
TIP
点击=按下+释放,不要混淆这些事件。
# CustomUI.Text 类
一个 CustomUI.Text 对象代表一个 UI 文本元件。
构造函数:CustomUI.UIIview:newText(uiid) ,构造一个 CustomUI.Text 对象。
成员函数:
setFontSize(size [, playerid]):设置文本元件的字体大小为size。size的类型为number,取值范围为正整数。- 要想知道多大的
size是合适的,你可以在 UI 编辑器中测试。
setText(text [, playerid]):设置文本元件显示的文本为text。text的类型为string,如果太长,似乎不会起作用。- 这不会导致文本被屏蔽。
# CustomUI.EditBox 类
一个 CustomUI.EditBox 对象代表一个 UI 输入框元件。
使用 CustomUI.UIView:newText(elementid); 来创建一个 CustomUI.Text 对象。
成员变量:
inputCallBack:默认为nil,如果有则为function类型,指定当所指输入框失焦(即输入完成)时回调的函数。- 和
CustomUI.Button对象的clickCallBack属性类似,也会传递参数,且额外包含element键。 content:string是事件中最有用的参数,表示输入框输入的信息。- 如果输入被屏蔽,
content也会是屏蔽后的结果。
# 示例
# 需求
一 UI 界面 u 下有一个输入框元件 e 和一个文本 t ,要求如下:
- 在玩家没有输入
e时,e总是显示"输入 16 进制数",开始输入时e的内容清空。 e完成输入时,尝试将其解释为 16 进制数,并转化为 10 进制数,并将结果反应在t上。- 如果输入不合法,无法将其转化,则设置
t的文本为"错误的输入"。
# 分析
- 要在开始输入时清空
e的内容,需要处理一个ui.onClick事件。实现方法是再创建一个按钮元件,设为b,将e设为b的子集,调整b的外观并将使其刚好覆盖e,这样当玩家点击输入框开始输入时,也会触发按钮的点击事件,这时就能修改e的内容了。 - 经测试,当按钮被点击时焦点才会进入输入框,所以不要使用按下事件。
- 使用
tonumber(e [, base])函数来转化数字。
# 代码
以下代码假设已经配置好 UI 相关环境了。
-- 需替换以下 id
local uiview_id, editBox_id, text_id, button_id = [[]], [[]], [[]], [[]]
uiview = CustomUI:newUIView(uiview_id)
editBox = uiview:newEditBox(editBox_id)
text = uiview:newText(text_id)
button = uiview:newButton(button_id)
-- 初始化
Event:connect([[Game.AnyPlayer.EnterGame]], function(paprm)
uiview:show()
text:setText("")
editBox:setText("输入 16 进制数")
end, uiid)
button.clickCallBack = function(paprm)
-- 清空输入框
editBox:setText("")
end
editBox.inputCallBack = function(paprm)
local num = tonumber(paprm["content"], 16)
if num then
text:setText(tostring(num))
else
text:setText("错误的输入")
end
editBox:setText("输入 16 进制数")
end
代码短的有点难以置信,这其中最复杂的还是在 UI 界面下创建元件并初始化状态。