You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
11 KiB
261 lines
11 KiB
|
|
/*
|
|
* @Author: BATU1579
|
|
* @CreateDate: 2022-08-07 17:39:23
|
|
* @LastEditor: BATU1579
|
|
* @LastTime: 2022-09-11 10:51:25
|
|
* @FilePath: \\src\\types\\ui.d.ts
|
|
* @Description:
|
|
*/
|
|
declare module 'ui' {
|
|
import { Color } from 'images';
|
|
|
|
global {
|
|
/**
|
|
* @description: ui 模块提供了编写用户界面的支持。
|
|
*
|
|
* 给 Android 开发者或者高阶用户的提醒:UI 系统来自于 Android,所有属性和方法都能在 Android 源码中找到。可以参考 Android 的文档。
|
|
*
|
|
* - [View]
|
|
* - [Widget]
|
|
*
|
|
* 界面是由视图( View )组成的。View 分成两种:
|
|
*
|
|
* - 控件( Widget )
|
|
* - 布局( Layout )
|
|
*
|
|
* 控件( Widget )用来具体显示文字、图片、网页等。
|
|
*
|
|
* 比如文本控件( text )用来显示文字,按钮控件( button )则可以显示一个按钮并提供点击效果,图片控件( img )则用来显示来自网络或者文件的图片,除此之外还有输入框控件( input )、进度条控件( progressbar )、单选复选框控件( checkbox )等。
|
|
*
|
|
* 布局( Layout )则是装着一个或多个控件的"容器",用于控制在他里面的控件的位置。
|
|
*
|
|
* 比如垂直布局( vertical )会把他里面的控件从上往下依次显示( 即纵向排列 ),水平布局( horizontal )则会把他里面的控件从左往右依次显示( 即横向排列 ),以及帧布局( frame ),他会把他里面的控件直接在左上角显示,如果有多个控件,后面的控件会重叠在前面的控件上。
|
|
*
|
|
* 一个界面便由一些布局和控件组成。为了便于文档阅读,我们再说明一下以下术语:
|
|
*
|
|
* - 子视图, 子控件: 布局里面的控件是这个布局的子控件/子视图。实际上布局里面不仅仅只能有控件,还可以是嵌套的布局。因此用子视图( Child View )更准确一些。在上面的例子中,按钮便是垂直布局的子控件。
|
|
* - 父视图,父布局:直接包含一个控件的布局是这个控件的父布局/父视图( Parent View )。在上面的例子中,垂直布局便是按钮的父布局。
|
|
*
|
|
* **注意!:**
|
|
*
|
|
* - 带有 ui 的脚本的的最前面必须使用 `'ui'` ,指定 ui 模式,否则脚本将不会以 ui 模式运行。
|
|
*
|
|
* [View]: https://developer.android.google.cn/reference/android/view/View?hl=cn
|
|
* [Widget]: https://developer.android.google.cn/reference/android/widget/package-summary?hl=cn
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* 'ui';
|
|
* ui.layout(
|
|
* <vertical>
|
|
* <button text='第一个按钮' />
|
|
* <button text='第二个按钮' />
|
|
* </vertical>
|
|
* );
|
|
* ```
|
|
*/
|
|
const ui: UI & {
|
|
[prop: string]: View;
|
|
};
|
|
}
|
|
|
|
interface UI {
|
|
/**
|
|
* @description: 将布局 XML 渲染为视图( View )对象, 并设置为当前视图。
|
|
* @param {string} xml 布局 XML 对象或者 XML 字符串。
|
|
*/
|
|
layout(xml: string | object): void;
|
|
|
|
/**
|
|
* @description: 此函数和 `ui.layout()` 相似,只不过允许传入一个 xml 文件路径来渲染布局。
|
|
* @param {string} xmlFile xml 文件路径。
|
|
*/
|
|
layoutFile(xmlFile: string): void;
|
|
|
|
/**
|
|
* @description: 将布局 XML 渲染为视图( View )对象。如果该 View 将作为某个 View 的子 View ,我们建议传入 `parent` 参数,这样在渲染时依赖于父视图的一些布局属性能够正确应用。
|
|
*
|
|
* 此函数用于动态创建、显示 View 。
|
|
* @param {string} xml 布局 XML 或者 XML 字符串。
|
|
* @param {View} [parent] 父视图(默认为 `null` )。
|
|
* @param {boolean} [attachToParent] 是否渲染的 View 加到父视图中,(默认为 `false` )。
|
|
* @return {View} 渲染的视图对象。
|
|
* @example
|
|
* ```typescript
|
|
* 'ui';
|
|
*
|
|
* ui.layout(<linear id='container'></linear>);
|
|
*
|
|
* // 动态创建3个文本控件,并加到 container 容器中
|
|
* // 这里仅为实例,实际上并不推荐这种做法,如果要展示列表,
|
|
* // 使用 list 组件;动态创建十几个、几十个 View 会让界面卡顿
|
|
* for (let i = 0; i < 3; i++) {
|
|
* let textView = ui.inflate(
|
|
* <text textColor='#000000' textSize='14sp' />,
|
|
* ui.container
|
|
* );
|
|
* textView.attr('text', '文本控件' + i);
|
|
* ui.container.addView(textView);
|
|
* }
|
|
* ```
|
|
*/
|
|
inflate(xml: string | object, parent?: View, attachToParent?: boolean): View;
|
|
|
|
/**
|
|
* @description: 注册一个自定义组件。
|
|
* @param {string} name 组件名称。
|
|
* @param {Function} widget 组件。
|
|
*/
|
|
registerWidget(name: string, widget: Function): void;
|
|
|
|
/**
|
|
* @description: 查看当前线程是否是 UI 线程。
|
|
* @return {boolean} 当前正在 UI 线程返回 `true` 否则返回 `false` 。
|
|
* @example
|
|
* ```typescript
|
|
* "ui";
|
|
*
|
|
* log(ui.isUiThread()); // => true
|
|
*
|
|
* threads.start(function () {
|
|
* log(ui.isUiThread()); // => false
|
|
* });
|
|
* ```
|
|
*/
|
|
isUiThread(): boolean;
|
|
|
|
/**
|
|
* @description: 在当前视图中根据 ID 查找相应的视图对象并返回。一般都是通过 `ui.xxx` 来获取 ID 为 `xxx` 的控件,如果 `xxx` 是一个 `ui` 已经有的属性,就可以通过 `ui.findView()` 来获取这个控件。
|
|
* @param {string} id 要查找的 View 的 ID 。
|
|
* @return {View | null} 返回找到的视图对象,如果当前未设置视图或找不到此 ID 的视图时返回 `null` 。
|
|
*/
|
|
findView(id: string): View | null;
|
|
|
|
/**
|
|
* @description: 结束当前活动并销毁界面。
|
|
*/
|
|
finish(): void;
|
|
|
|
/**
|
|
* @description: 将视图对象 `view` 设置为当前视图。
|
|
* @param {View} view 要设置的视图对象。
|
|
*/
|
|
setContentView(view: View): void;
|
|
|
|
/**
|
|
* @description: 将 `callback` 加到 UI 线程的消息循环中,并延迟 `delay` 毫秒后执行(不能准确保证一定在 `delay` 毫秒后执行)。
|
|
*
|
|
* 此函数可以用于 UI 线程中延时执行动作( `sleep()` 不能在 UI 线程中使用),也可以用于子线程中更新 UI。
|
|
* @param {Function} callback 回调函数。
|
|
* @param {number} [delay] 延迟,单位毫秒。
|
|
*/
|
|
post(callback: Function, delay?: number): void;
|
|
|
|
/**
|
|
* @description: 将 `callback` 在 UI 线程中执行。如果当前已经在 UI 线程中,则直接执行 `callback` ;否则将 `callback` 抛到 UI 线程中执行(加到 UI 线程的消息循环的末尾),并等待 `callback` 执行结束(阻塞当前线程)。
|
|
* @param {Function} callback 回调函数。
|
|
* @return {any} `callback` 的执行结果
|
|
*/
|
|
run(callback: Function): any;
|
|
|
|
/**
|
|
* @description: 设置当前界面的状态栏颜色。
|
|
* @param {Color} color 颜色。
|
|
*/
|
|
statusBarColor(color: Color): void;
|
|
|
|
/**
|
|
* @description
|
|
* 启用使用 Android 的布局( layout )、绘图( drawable )、动画( anim )、样式( style )等资源的特性。启用该特性后,在 `project.json` 中进行以下配置,就可以像写 Android 原生一样写界面:
|
|
* ```ts
|
|
* {
|
|
* androidResources: {
|
|
* "resDir": "res", // 资源文件夹
|
|
* "manifest": "AndroidManifest.xml" // AndroidManifest文件路径
|
|
* }
|
|
* }
|
|
* ```
|
|
* res文件夹通常为以下结构:
|
|
* ```
|
|
* - res
|
|
* - layout // 布局资源
|
|
* - drawable // 图片、形状等资源
|
|
* - menu // 菜单资源
|
|
* - values // 样式、字符串等资源
|
|
* // ...
|
|
* ```
|
|
**/
|
|
useAndroidResources(): void;
|
|
}
|
|
|
|
interface View {
|
|
/**
|
|
* @description: 设置属性的值。属性指定是 View 在 xml 中的属性。
|
|
*
|
|
* 例如可以通过语句 `attr('text', '文本');` 来设置文本控件的文本值。
|
|
*
|
|
* **注意!:**
|
|
*
|
|
* - 并不是所有属性都能在 js 代码中设置,有一些属性只能在布局创建时设置,例如 style 属性。还有一些属性虽然能在代码中设置,但是还没支持。
|
|
*
|
|
* @param {string} name 属性名称。
|
|
* @param {string} value 属性的值。
|
|
* @example
|
|
* ```typescript
|
|
* 'ui';
|
|
*
|
|
* ui.layout(
|
|
* <frame>
|
|
* <text id='example' text='Hello' />
|
|
* </frame>
|
|
* );
|
|
*
|
|
* // 5秒后执行
|
|
* ui.post(() => {
|
|
* // 修改文本
|
|
* ui.example.attr('text', 'Hello, My UI');
|
|
* // 修改背景
|
|
* ui.example.attr('bg', '#ff00ff');
|
|
* // 修改高度
|
|
* ui.example.attr('h', '500dp');
|
|
* }, 5000);
|
|
* ```
|
|
*/
|
|
attr(name: string, value: string): void;
|
|
|
|
/**
|
|
* @description: 获取属性的值。
|
|
* @param {string} name 属性名称。
|
|
* @return {string} 属性的值。
|
|
* @example
|
|
* ```typescript
|
|
* 'ui';
|
|
*
|
|
* ui.layout(
|
|
* <frame>
|
|
* <text id='example' text='1' />
|
|
* </frame>
|
|
* );
|
|
*
|
|
* plusOne();
|
|
*
|
|
* function plusOne() {
|
|
* // 获取文本
|
|
* let text = ui.example.attr('text');
|
|
* // 解析为数字
|
|
* let num = parseInt(text);
|
|
* // 数字加1
|
|
* num++;
|
|
* // 设置文本
|
|
* ui.example.attr('text', String(num));
|
|
* // 1秒后继续
|
|
* ui.post(plusOne, 1000);
|
|
* }
|
|
* ```
|
|
*/
|
|
attr(name: string): string;
|
|
|
|
[prop: string]: any;
|
|
}
|
|
}
|