@gongxh/bit-ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,243 @@
1
+ ## UI模块
2
+
3
+ ### 特点
4
+
5
+ * 基于FairyGUI, 查看[FairyGUI官方文档](https://www.fairygui.com/docs/editor)
6
+
7
+ * 灵活的 UI 装饰器(配合插件 `kunpo-fgui` 使用,一键导出界面配置,省时省力省代码)
8
+
9
+ * 控制窗口之间的相互关系(eg: 打开界面时,是隐藏/关闭前一个界面,还是隐藏/关闭所有界面)
10
+
11
+ * 多窗口组管理
12
+
13
+ * 顶部显示金币钻石的资源栏(header),一次实现,多界面复用,
14
+
15
+ * 支持不同界面使用不同 header
16
+
17
+ ### 插件链接
18
+ * **kunpo-fgui**: [https://store.cocos.com/app/detail/7213](https://store.cocos.com/app/detail/7213)
19
+
20
+ ### 使用
21
+
22
+ #### *一、FairyGUI界面*
23
+ > ![image-fgui-project](../image/image-fgui-project.png#pic_left)
24
+
25
+ #### *二、UI 装饰器使用*
26
+
27
+ > 注:只有使用了装饰器的内容才能在 `kunpo-fgui` 插件中识别,`kunpo-fgui`插件操作界面如下图
28
+
29
+ > ![image-fgui-editor](../image/image-fgui-editor.png#pic_left)
30
+
31
+
32
+ 1. 窗口装饰器
33
+
34
+ ```typescript
35
+ import { Window, _uidecorator } from 'bit-ui';
36
+ const { uiclass, uiprop, uiclick } = _uidecorator;
37
+
38
+ /**
39
+ * 窗口装饰器
40
+ * @param 参数1: 窗口容器节点名字
41
+ * @param 参数2: FairyGUI中的UI包名
42
+ * @param 参数3: FairyGUI中的组件名 必须和 class 类同名 这里是 MyWindow
43
+ */
44
+ @uiclass("Window", "UI包名", "MyWindow")
45
+ export class MyWindow extends Window {
46
+ // ... 窗口实现
47
+ }
48
+ ```
49
+
50
+ 2. Header 装饰器
51
+
52
+ ```typescript
53
+ import { WindowHeader, _uidecorator } from 'bit-ui';
54
+ const { uiheader } = _uidecorator;
55
+
56
+ /**
57
+ * 窗口顶部资源栏装饰器
58
+ * @param 参数1: FairyGUI中的UI包名
59
+ * @param 参数2: FairyGUI中的组件名 必须和 class 类同名 这里是 MyWindowHeader
60
+ */
61
+ @uiheader("UI包名", "WindowHeader")
62
+ export class MyWindowHeader extends WindowHeader {
63
+ // ... Header 实现
64
+ }
65
+ ```
66
+
67
+ 3. UI组件装饰器
68
+
69
+ ```typescript
70
+ import { _uidecorator } from 'bit-ui';
71
+ const { uicom, uiprop, uiclick } = _uidecorator;
72
+
73
+ /**
74
+ * UI组件类装饰器
75
+ * @param 参数1: FairyGUI中的UI包名
76
+ * @param 参数2: FairyGUI中的组件名 必须和 class 类同名 这里是 MyComponent
77
+ */
78
+ @uicom("Home", "MyComponent")
79
+ export class MyComponent {
80
+ // ... 组件实现
81
+ }
82
+ ```
83
+
84
+ 4. UI属性装饰器
85
+
86
+ ```typescript
87
+ import { Window, _uidecorator } from 'bit-ui';
88
+ const { uiclass, uiprop, uiclick } = _uidecorator;
89
+
90
+ @uiclass("Window", "Home", "MyWindow")
91
+ export class MyWindow extends Window {
92
+ // FairyGUI 组件属性装饰器
93
+ @uiprop private btnConfirm: GButton; // 按钮组件
94
+ @uiprop private txtTitle: GTextField; // 文本组件
95
+ @uiprop private listItems: GList; // 列表组件
96
+ }
97
+ ```
98
+
99
+ 5. 点击事件装饰器
100
+
101
+ ```typescript
102
+ import { Window, _uidecorator } from 'bit-ui';
103
+ const { uiclass, uiprop, uiclick } = _uidecorator;
104
+
105
+ @uiclass("Window", "Home", "MyWindow")
106
+ export class MyWindow extends Window {
107
+ // 点击事件装饰器
108
+ @uiclick
109
+ private onTouchEvent(event: cc.Event): void {
110
+ console.log('确认按钮被点击');
111
+ }
112
+ }
113
+ ```
114
+
115
+ 6. 控制器和动画装饰器
116
+
117
+ ```typescript
118
+ import { Window, _uidecorator } from 'bit-ui';
119
+ const { uiclass, uiprop, uiclick, uicontrol, uitransition } = _uidecorator;
120
+
121
+ @uiclass("Window", "Home", "MyWindow")
122
+ export class MyWindow extends Window {
123
+ // FairyGUI 组件属性装饰器
124
+ @uicontrol private control: Controller;
125
+ @uitransition private transition: Transition;
126
+ }
127
+ ```
128
+
129
+
130
+ #### *三、创建窗口*
131
+
132
+ 1. 新建窗口类
133
+
134
+ ```typescript
135
+ /**
136
+ * 窗口名必须和FairyGUI中的组件同名
137
+ */
138
+ import { Window, _uidecorator } from 'bit-ui';
139
+ const { uiclass, uiprop, uiclick } = _uidecorator;
140
+
141
+ @uiclass("Window", "UI包名", "MyWindow")
142
+ export class MyWindow extends Window {
143
+ protected onInit(): void {
144
+ // 初始化窗口
145
+ }
146
+
147
+ protected onShow(userdata?: any): void {
148
+ // 窗口显示时的逻辑
149
+ }
150
+
151
+ protected onClose(): void {
152
+ // 窗口关闭时的逻辑
153
+ }
154
+ }
155
+ ```
156
+
157
+ 2. 窗口生命周期
158
+ - `onInit`: 窗口初始化时调用
159
+ - `onShow`: 窗口显示时调用
160
+ - `onClose`: 窗口关闭时调用
161
+ - `onHide`: 窗口隐藏时调用
162
+ - `onShowFromHide`: 窗口从隐藏状态恢复时调用
163
+ - `onCover`: 窗口被覆盖时调用
164
+ - `onRecover`: 窗口恢复时调用
165
+ - `onEmptyAreaClick`: 点击窗口空白区域时调用
166
+
167
+ #### *四、窗口资源加载配置*
168
+ ```typescript
169
+ interface IPackageConfig {
170
+ /** UI所在resources中的路径 */
171
+ uiPath: string;
172
+ /**
173
+ * 手动管理资源的包
174
+ * 1. 用于基础UI包, 提供一些最基础的组件,所有其他包都可能引用其中的内容
175
+ * 2. 资源header所在的包
176
+ * 3. 用于一些特殊场景, 比如需要和其他资源一起加载, 并且显示进度条的包
177
+ */
178
+ manualPackages: string[];
179
+ /**
180
+ * 不推荐配置 只是提供一种特殊需求的实现方式
181
+ * 窗口引用到其他包中的资源 需要的配置信息
182
+ */
183
+ linkPackages: { [windowName: string]: string[] };
184
+
185
+ /**
186
+ * 关闭界面后,需要立即释放资源的包名(建议尽量少)
187
+ * 一般不建议包进行频繁装载卸载,因为每次装载卸载必然是要消耗CPU时间(意味着耗电)和产生大量GC的。UI系统占用的内存是可以精确估算的,你可以按照包的使用频率设定哪些包是需要立即释放的。
188
+ * 不包括手动管理的包
189
+ */
190
+ imReleasePackages: string[];
191
+ }
192
+
193
+ export interface IPackageConfigRes {
194
+ /** 配置信息 */
195
+ config: IPackageConfig;
196
+ /** 显示加载等待窗 */
197
+ showWaitWindow: () => void;
198
+ /** 隐藏加载等待窗 */
199
+ hideWaitWindow: () => void;
200
+ /** 打开窗口时UI包加载失败 */
201
+ fail: (windowName: string, errmsg: string, pkgs: string[]) => void;
202
+ }
203
+ ```
204
+
205
+ #### *五、窗口管理接口*
206
+ ```typescript
207
+ export class WindowManager {
208
+ /**
209
+ * 配置UI包的一些信息 (可以不配置 完全手动管理资源)
210
+ */
211
+ public static initPackageConfig(res: IPackageConfigRes): void;
212
+
213
+ /**
214
+ * 异步打开一个窗口 (如果UI包的资源未加载, 会自动加载 配合 WindowManager.initPackageConfig一起使用)
215
+ */
216
+ public static showWindow(windowName: string, userdata?: any): Promise<void>
217
+
218
+ /**
219
+ * 打开一个窗口 (用于已加载过资源的窗口)
220
+ */
221
+ public static showWindowIm(windowName: string, userdata?: any): void;
222
+
223
+ /**
224
+ * 关闭窗口
225
+ */
226
+ public static closeWindow(windowName: string);
227
+
228
+ /*
229
+ * 获取窗口实例
230
+ */
231
+ public static getWindow<T extends Window>(windowName: string): T;
232
+
233
+ /**
234
+ * 获取当前最顶层窗口
235
+ */
236
+ public static getTopWindow(): Window;
237
+
238
+ /**
239
+ * 检查窗口是否存在
240
+ */
241
+ public static hasWindow(windowName: string): boolean;
242
+ }
243
+ ```