提交 466d4a77 编写于 作者: D duangavin123 提交者: Gitee

Merge branch 'master' of gitee.com:openharmony/docs into master

Signed-off-by: Nduangavin123 <duanxichao@huawei.com>
......@@ -11,7 +11,7 @@
| 接口名 | 接口描述 |
| -------- | -------- |
| removeStickyCommonEvent(event: string, callback: AsyncCallback<void>): void | 移除粘性公共事件 |
| removeStickyCommonEvent(event: string, callback: AsyncCallback\<void>): void | 移除粘性公共事件 |
## 开发步骤
......
......@@ -39,7 +39,7 @@
| ---- | ---- | ---- |
| ohos.net.connection | function getDefaultNet(callback: AsyncCallback\<NetHandle>): void; |获取一个含有默认网络的netId的NetHandle对象,使用callback回调 |
| ohos.net.connection | function getGlobalHttpProxy<sup>10+</sup>(callback: AsyncCallback\<HttpProxy>): void;| 获取网络的全局代理设置,使用callback回调 |
| ohos.net.connection | function setGlobalHttpProxy<sup>10+</sup>(httpProxy: HttpProxy, callback: AsyncCallback<void>): void;| 设置网络全局Http代理配置信息,使用callback回调 |
| ohos.net.connection | function setGlobalHttpProxy<sup>10+</sup>(httpProxy: HttpProxy, callback: AsyncCallback\<void>): void;| 设置网络全局Http代理配置信息,使用callback回调 |
| ohos.net.connection | function getAppNet<sup>9+</sup>(callback: AsyncCallback\<NetHandle>): void;| 获取一个App绑定的包含了网络netId的NetHandle对象,使用callback回调 |
| ohos.net.connection | function setAppNet<sup>9+</sup>(netHandle: NetHandle, callback: AsyncCallback\<void>): void;| 绑定App到指定网络,绑定后的App只能通过指定网络访问外网。使用callback回调 |
| ohos.net.connection | function getDefaultNetSync<sup>9+</sup>(): NetHandle; |使用同步方法获取默认激活的数据网络。可以使用getNetCapabilities去获取网络的类型、拥有的能力等信息。|
......@@ -47,7 +47,7 @@
| ohos.net.connection | function getAllNets(callback: AsyncCallback\<Array\<NetHandle>>): void;| 获取所处于连接状态的网络的MetHandle对象列表,使用callback回调 |
| ohos.net.connection | function getConnectionProperties(netHandle: NetHandle, callback: AsyncCallback\<ConnectionProperties>): void; |查询默认网络的链路信息,使用callback回调 |
| ohos.net.connection | function getNetCapabilities(netHandle: NetHandle, callback: AsyncCallback\<NetCapabilities>): void; |查询默认网络的能力集信息,使用callback回调 |
| ohos.net.connection | function isDefaultNetMetered<sup>9+</sup>(callback: AsyncCallback<boolean>): void; |检查当前网络上的数据流量使用是否被计量,使用callback方式作为异步方法 |
| ohos.net.connection | function isDefaultNetMetered<sup>9+</sup>(callback: AsyncCallback\<boolean>): void; |检查当前网络上的数据流量使用是否被计量,使用callback方式作为异步方法 |
| ohos.net.connection | function reportNetConnected(netHandle: NetHandle, callback: AsyncCallback\<void>): void;| 向网络管理报告网络处于可用状态,调用此接口说明应用程序认为网络的可用性(ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED)与网络管理不一致。使用callback回调 |
| ohos.net.connection | function reportNetDisconnected(netHandle: NetHandle, callback: AsyncCallback\<void>): void;| 向网络管理报告网络处于不可用状态,调用此接口说明应用程序认为网络的可用性(ohos.net.connection.NetCap.NET_CAPABILITY_VAILDATED)与网络管理不一致。使用callback回调 |
| ohos.net.connection | function getAddressesByName(host: string, callback: AsyncCallback\<Array\<NetAddress>>): void; |使用对应网络解析域名,获取所有IP,使用callback回调 |
......
......@@ -5,7 +5,6 @@
- [HTTP数据请求](http-request.md):通过HTTP发起一个数据请求。
- [WebSocket连接](websocket-connection.md):使用WebSocket建立服务器与客户端的双向连接。
- [Socket连接](socket-connection.md):通过Socket进行数据传输。
- [网络策略管理](net-policy-management.md):提供一些限制网络的基础能力,包括蜂窝网络策略、休眠/省电模式策略、后台网络策略、重置网络策略等功能。
- [网络共享](net-sharing.md):分享设备已有网络给其他连接设备,支持Wi-Fi热点共享、蓝牙共享和USB共享,同时提供网络共享状态、共享流量查询功能。
- [以太网连接](net-ethernet.md):以太网连接主要提供有线网络能力,提供设置有线网络的IP地址,子网掩码,网关,DNS等信息。
- [网络连接管理](net-connection-manager.md):网络连接管理提供管理网络一些基础能力,包括WiFi/蜂窝/Ethernet等多网络连接优先级管理、网络质量评估、订阅默认/指定网络连接状态变化、查询网络连接信息、DNS解析等功能。
......
......@@ -183,8 +183,9 @@
- UI界面
- [@ohos.animator (动画)](js-apis-animator.md)
- [@ohos.arkui.componentSnapshot(组件截图)](js-apis-arkui-componentSnapshot.md)
- [@ohos.arkui.drawableDescriptor(DrawableDescriptor)](js-apis-arkui-drawableDescriptor.md)
- [@ohos.arkui.drawableDescriptor (DrawableDescriptor)](js-apis-arkui-drawableDescriptor.md)
- [@ohos.curves (插值计算)](js-apis-curve.md)
- [@ohos.font(注册自定义字体)](js-apis-font.md)
- [@ohos.matrix4 (矩阵变换)](js-apis-matrix4.md)
- [@ohos.mediaquery (媒体查询)](js-apis-mediaquery.md)
- [@ohos.pluginComponent(PluginComponentManager)](js-apis-plugincomponent.md)
......@@ -192,7 +193,7 @@
- [@ohos.router (页面路由)](js-apis-router.md)
- [@ohos.measure (文本计算)](js-apis-measure.md)
- [@ohos.uiAppearance(用户界面外观)](js-apis-uiappearance.md)
- 图形图像
- [@ohos.animation.windowAnimationManager (窗口动画管理)](js-apis-windowAnimationManager.md)
- [@ohos.application.WindowExtensionAbility (窗口扩展能力)](js-apis-application-windowExtensionAbility.md)
......
#@ohos.arkui.drawableDescriptor(DrawableDescriptor)
# @ohos.arkui.drawableDescriptor (DrawableDescriptor)
本模块提供获取pixelMap的能力,包括前景、背景、蒙版和分层图标。
......
......@@ -3,6 +3,7 @@
媒体会话管理提供媒体播控相关功能的接口,目的是让应用接入播控中心。
该模块提供以下媒体会话相关的常用功能:
- [AVSession](#avsession) : 会话,可用于设置元数据、播放状态信息等操作。
- [AVSessionController](#avsessioncontroller): 会话控制器,可用于查看会话ID,完成对会话发送命令及事件,获取会话元数据、播放状态信息等操作。
......@@ -36,14 +37,12 @@ createAVSession(context: Context, tag: string, type: AVSessionType): Promise\<AV
| tag | string | 是 | 会话的自定义名称。 |
| type | [AVSessionType](#avsessiontype) | 是 | 会话类型,当前支持音频和视频。 |
**返回值:**
| 类型 | 说明 |
| --------------------------------- | ------------------------------------------------------------ |
| Promise<[AVSession](#avsession)\> | Promise对象。回调返回会话实例对象,可用于获取会话ID,以及设置元数据、播放状态,发送按键事件等操作。|
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -424,7 +423,7 @@ castAudio(session: SessionToken | 'all', audioDevices: Array<audio.AudioDeviceDe
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当投播成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当投播成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -477,7 +476,7 @@ castAudio(session: SessionToken | 'all', audioDevices: Array<audio.AudioDeviceDe
| ------------ |--------------------------------------------| ---- | ------------------------------------------------------------ |
| session | [SessionToken](#sessiontoken) &#124; 'all' | 是 | 会话令牌。SessionToken表示单个token;字符串`'all'`指所有token。 |
| audioDevices | Array\<[audio.AudioDeviceDescriptor](js-apis-audio.md#audiodevicedescriptor)\> | 是 | 媒体设备列表。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当投播成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当投播成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -678,7 +677,7 @@ sendSystemAVKeyEvent(event: KeyEvent): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当事件发送成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当事件发送成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -720,7 +719,7 @@ sendSystemAVKeyEvent(event: KeyEvent, callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------------------------ | ---- | ------------------------------------- |
| event | [KeyEvent](js-apis-keyevent.md) | 是 | 按键事件。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当事件发送成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当事件发送成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -767,7 +766,7 @@ sendSystemControlCommand(command: AVControlCommand): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -821,7 +820,7 @@ sendSystemControlCommand(command: AVControlCommand, callback: AsyncCallback\<voi
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------------------- |
| command | [AVControlCommand](#avcontrolcommand) | 是 | AVSession的相关命令和命令相关参数。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -901,7 +900,7 @@ setAVMetadata(data: AVMetadata): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当元数据设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当元数据设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -952,7 +951,7 @@ setAVMetadata(data: AVMetadata, callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ------------------------------------- |
| data | [AVMetadata](#avmetadata) | 是 | 会话元数据。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当元数据设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当元数据设置成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1010,7 +1009,7 @@ setAVPlaybackState(state: AVPlaybackState): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当播放状态设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当播放状态设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1053,7 +1052,7 @@ setAVPlaybackState(state: AVPlaybackState, callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------------------- | ---- | ---------------------------------------------- |
| data | [AVPlaybackState](#avplaybackstate) | 是 | 会话播放状态,包括状态、倍数、循环模式等信息。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1085,7 +1084,7 @@ session.setAVPlaybackState(PlaybackState, function (err) {
### setAVQueueItems<sup>10+</sup>
setAVQueueItems(items: Array\<AVQueueItem>): Promise<void\>
setAVQueueItems(items: Array\<AVQueueItem>): Promise\<void>
设置媒体播放列表。结果通过Promise异步回调方式返回。
......@@ -1103,7 +1102,7 @@ setAVQueueItems(items: Array\<AVQueueItem>): Promise<void\>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当播放列表设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当播放列表设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1154,7 +1153,7 @@ session.setAVQueueItems(queueItemsArray).then(() => {
### setAVQueueItems<sup>10+</sup>
setAVQueueItems(items: Array\<AVQueueItem>, callback: AsyncCallback<void\>): void
setAVQueueItems(items: Array\<AVQueueItem>, callback: AsyncCallback\<void>): void
设置媒体播放列表。结果通过callback异步回调方式返回。
......@@ -1167,7 +1166,7 @@ setAVQueueItems(items: Array\<AVQueueItem>, callback: AsyncCallback<void\>): voi
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------ | ---- | ----------------------------------------------------------- |
| items | Array<[AVQueueItem](#avqueueitem10)\> | 是 | 播放列表单项的队列,用以表示播放列表。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1238,7 +1237,7 @@ setAVQueueTitle(title: string): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当播放列表设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当播放列表设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1261,7 +1260,7 @@ session.setAVQueueTitle(queueTitle).then(() => {
### setAVQueueTitle<sup>10+</sup>
setAVQueueTitle(title: string, callback: AsyncCallback\<void\>): void
setAVQueueTitle(title: string, callback: AsyncCallback\<void>): void
设置媒体播放列表名称。结果通过callback异步回调方式返回。
......@@ -1274,7 +1273,7 @@ setAVQueueTitle(title: string, callback: AsyncCallback\<void\>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------- | ---- | ----------------------------------------------------------- |
| title | string | 是 | 播放列表名称字段。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1317,7 +1316,7 @@ setLaunchAbility(ability: WantAgent): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当Ability设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当Ability设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1384,7 +1383,7 @@ setLaunchAbility(ability: WantAgent, callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------------------------------- | ---- | ------------------------------------------------------------ |
| ability | [WantAgent](js-apis-app-ability-wantAgent.md) | 是 | 应用的相关属性信息,如bundleName,abilityName,deviceId等。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当Ability设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当Ability设置成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1462,7 +1461,7 @@ dispatchSessionEvent(event: string, args: {[key: string]: Object}): Promise\<voi
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当事件设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当事件设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1486,7 +1485,7 @@ await session.dispatchSessionEvent(eventName, args).catch((err) => {
### dispatchSessionEvent<sup>10+</sup>
dispatchSessionEvent(event: string, args: {[key: string]: Object}, callback: AsyncCallback<void>): void
dispatchSessionEvent(event: string, args: {[key: string]: Object}, callback: AsyncCallback\<void>): void
媒体提供方设置一个会话内自定义事件,包括事件名和键值对形式的事件内容, 结果通过callback异步回调方式返回。
......@@ -1500,7 +1499,7 @@ dispatchSessionEvent(event: string, args: {[key: string]: Object}, callback: Asy
| ------- | --------------------------------------------- | ---- | ----------------------------------------------------------- |
| event | string | 是 | 需要设置的会话事件的名称 |
| args | {[key: string]: any} | 是 | 需要传递的会话事件键值对 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当会话事件设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当会话事件设置成功,err为undefined,否则返回错误对象。 |
> **说明:**
> 参数args支持的数据类型有:字符串、数字、布尔、对象、数组和文件描述符等,详细介绍请参见[@ohos.app.ability.Want(Want)](./js-apis-app-ability-want.md)。
......@@ -1550,7 +1549,7 @@ setExtras(extras: {[key: string]: Object}): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当自定义媒体数据包设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当自定义媒体数据包设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1573,7 +1572,7 @@ await session.setExtras(extras).catch((err) => {
### setExtras<sup>10+</sup>
setExtras(extras: {[key: string]: Object}, callback: AsyncCallback<void>): void
setExtras(extras: {[key: string]: Object}, callback: AsyncCallback\<void>): void
媒体提供方设置键值对形式的自定义媒体数据包, 结果通过callback异步回调方式返回。
......@@ -1584,7 +1583,7 @@ setExtras(extras: {[key: string]: Object}, callback: AsyncCallback<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| ------- | --------------------------------------------- | ---- | ----------------------------------------------------------- |
| extras | {[key: string]: any} | 是 | 需要传递的自定义媒体数据包键值对 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当自定义媒体数据包设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当自定义媒体数据包设置成功,err为undefined,否则返回错误对象。 |
> **说明:**
> 参数extras支持的数据类型有:字符串、数字、布尔、对象、数组和文件描述符等,详细介绍请参见[@ohos.app.ability.Want(Want)](./js-apis-app-ability-want.md)。
......@@ -1768,7 +1767,7 @@ activate(): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当会话激活成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当会话激活成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1802,7 +1801,7 @@ activate(callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------- |
| callback | AsyncCallback<void\> | 是 | 回调函数。当会话激活成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当会话激活成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1838,7 +1837,7 @@ deactivate(): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当禁用会话成功,无返回结果,否则返回错误对象。|
| Promise\<void> | Promise对象。当禁用会话成功,无返回结果,否则返回错误对象。|
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1874,7 +1873,7 @@ deactivate(callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------- |
| callback | AsyncCallback<void\> | 是 | 回调函数。当禁用会话成功,err为undefined,否则返回错误对象。|
| callback | AsyncCallback\<void> | 是 | 回调函数。当禁用会话成功,err为undefined,否则返回错误对象。|
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1910,7 +1909,7 @@ destroy(): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当会话销毁成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当会话销毁成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -1944,7 +1943,7 @@ destroy(callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------- |
| callback | AsyncCallback<void\> | 是 | 回调函数。当会话销毁成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当会话销毁成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -2824,7 +2823,7 @@ skipToQueueItem(itemId: number): Promise\<void>
| 类型 | 说明 |
| -------------- | --------------------------------------------------------------- |
| Promise<void\> | Promise对象。当播放列表单项ID设置成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当播放列表单项ID设置成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -2860,7 +2859,7 @@ skipToQueueItem(itemId: number, callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------- | ---- | ----------------------------------------------------------- |
| itemId | number | 是 | 播放列表单项的ID值,用以表示选中的播放列表单项。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当播放状态设置成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3137,7 +3136,7 @@ sendAVKeyEvent(event: KeyEvent): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当事件发送成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当事件发送成功,无返回结果,否则返回错误对象。 |
**示例:**
......@@ -3167,7 +3166,7 @@ sendAVKeyEvent(event: KeyEvent, callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------------------------------ | ---- | ---------- |
| event | [KeyEvent](js-apis-keyevent.md) | 是 | 按键事件。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当事件发送成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当事件发送成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3387,7 +3386,7 @@ destroy(): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当控制器销毁成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当控制器销毁成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3421,7 +3420,7 @@ destroy(callback: AsyncCallback\<void>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------------------- | ---- | ---------- |
| callback | AsyncCallback<void\> | 是 | 回调函数。当控制器销毁成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当控制器销毁成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3539,7 +3538,7 @@ sendControlCommand(command: AVControlCommand): Promise\<void>
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3593,7 +3592,7 @@ sendControlCommand(command: AVControlCommand, callback: AsyncCallback\<void>): v
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------------ |
| command | [AVControlCommand](#avcontrolcommand) | 是 | 会话的相关命令和命令相关参数。 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3654,7 +3653,7 @@ sendCommonCommand(command: string, args: {[key: string]: Object}): Promise\<void
| 类型 | 说明 |
| -------------- | ----------------------------- |
| Promise<void\> | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 |
| Promise\<void> | Promise对象。当命令发送成功,无返回结果,否则返回错误对象。 |
**错误码:**
以下错误码的详细介绍请参见[媒体会话管理错误码](../errorcodes/errorcode-avsession.md)
......@@ -3696,7 +3695,7 @@ sendCommonCommand(command: string, args: {[key: string]: Object}, callback: Asyn
| ------- | ------------------------------------- | ---- | ------------------------------ |
| command | string | 是 | 需要设置的自定义控制命令的名称 |
| args | {[key: string]: any} | 是 | 需要传递的控制命令键值对 |
| callback | AsyncCallback<void\> | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 |
| callback | AsyncCallback\<void> | 是 | 回调函数。当命令发送成功,err为undefined,否则返回错误对象。 |
> **说明:**
> 参数args支持的数据类型有:字符串、数字、布尔、对象、数组和文件描述符等,详细介绍请参见[@ohos.app.ability.Want(Want)](./js-apis-app-ability-want.md)。
......
......@@ -694,7 +694,7 @@ try {
```
## bluetoothManager.setDevicePinCode<sup>10+</sup><a name="setDevicePinCode"></a>
## bluetoothManager.setDevicePinCode<sup>10+</sup><a name="setDevicePinCode-1"></a>
setDevicePinCode(device: string, code: string): Promise&lt;void&gt;
......
......@@ -21,11 +21,11 @@ import cardEmulation from '@ohos.nfc.cardEmulation';
**系统能力:** SystemCapability.Communication.NFC.CardEmulation
| 名称 | 值 | 说明 |
| -------- | -------- | -------- |
| HCE | 0 | HCE 卡模拟。 |
| UICC | 1 | SIM 卡模拟。 |
| ESE | 2 | ESE卡模拟。 |
| 名称 | 值 | 说明 |
| ---- | ---- | -------- |
| HCE | 0 | HCE 卡模拟。 |
| UICC | 1 | SIM 卡模拟。 |
| ESE | 2 | ESE卡模拟。 |
## CardType<sup>9+</sup>
......@@ -33,10 +33,10 @@ import cardEmulation from '@ohos.nfc.cardEmulation';
**系统能力:** SystemCapability.Communication.NFC.CardEmulation
| 名称 | 值 | 说明 |
| -------- | -------- | -------- |
| 名称 | 值 | 说明 |
| ------- | --------- | ----------------- |
| PAYMENT | "payment" | 卡模拟应用所使用的业务是支付类型。 |
| OTHER | "other" | 卡模拟应用所使用的业务是其他类型。 |
| OTHER | "other" | 卡模拟应用所使用的业务是其他类型。 |
## isSupported
......@@ -51,15 +51,15 @@ isSupported(feature: number): boolean
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | -------- | ---- | ----------------------- |
| feature | number | 是 | 卡模拟类型值,详细请见[FeatureType](#featuretype)枚举值。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------ | ---- | ---------------------------------------- |
| feature | number | 是 | 卡模拟类型值,详细请见[FeatureType](#featuretype)枚举值。 |
**返回值:**
| **类型** | **说明** |
| -------- | -------- |
| boolean | true: 支持该类型卡模拟,&nbsp;false: 不支持该类型卡模拟。|
| **类型** | **说明** |
| ------- | -------------------------------------- |
| boolean | true: 支持该类型卡模拟,&nbsp;false: 不支持该类型卡模拟。 |
## hasHceCapability<sup>9+</sup>
......@@ -73,9 +73,9 @@ hasHceCapability(): boolean
**返回值:**
| **类型** | **说明** |
| -------- | -------- |
| boolean | true: 支持HCE,&nbsp;false: 不支持HCE。|
| **类型** | **说明** |
| ------- | -------------------------------- |
| boolean | true: 支持HCE,&nbsp;false: 不支持HCE。 |
## isDefaultService<sup>9+</sup>
......@@ -89,16 +89,16 @@ isDefaultService(elementName: ElementName, type: CardType): boolean
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | -------- | ---- | ----------------------- |
| elementName | [ElementName](js-apis-bundleManager-elementName.md#elementname) | 是 | 应用的描述,由Bundle名称和组件名称组成。 |
| type | [CardType](#cardtype9) | 是 | 卡模拟业务类型。 |
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ---------------------------------------- | ---- | ----------------------- |
| elementName | [ElementName](js-apis-bundleManager-elementName.md#elementname) | 是 | 应用的描述,由Bundle名称和组件名称组成。 |
| type | [CardType](#cardtype9) | 是 | 卡模拟业务类型。 |
**返回值:**
| **类型** | **说明** |
| -------- | -------- |
| boolean | true: 是默认支付应用,&nbsp;false: 不是默认支付应用。|
| **类型** | **说明** |
| ------- | ------------------------------------ |
| boolean | true: 是默认支付应用,&nbsp;false: 不是默认支付应用。 |
**示例:**
......@@ -108,13 +108,11 @@ import cardEmulation from '@ohos.nfc.cardEmulation';
var isHceSupported = cardEmulation.isSupported(cardEmulation.FeatureType.HCE);
if (!isHceSupported) {
console.log('this device is not supported for HCE, ignore it.');
return;
}
var hasHceCap = cardEmulation.hasHceCapability();
if (!hasHceCap) {
console.log('this device hasHceCapability false, ignore it.');
return;
}
var elementName = {
......
......@@ -186,7 +186,7 @@ CommonEvent.publishAsUser("event", userId, options, publishCB);
## CommonEvent.createSubscriber<sup>(deprecated)</sup>
createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback<CommonEventSubscriber>): void
createSubscriber(subscribeInfo: CommonEventSubscribeInfo, callback: AsyncCallback\<CommonEventSubscriber>): void
以回调形式创建订阅者。
......@@ -229,7 +229,7 @@ CommonEvent.createSubscriber(subscribeInfo, createCB);
## CommonEvent.createSubscriber<sup>(deprecated)</sup>
createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise<CommonEventSubscriber>
createSubscriber(subscribeInfo: CommonEventSubscribeInfo): Promise\<CommonEventSubscriber>
以Promise形式创建订阅者。
......@@ -270,7 +270,7 @@ CommonEvent.createSubscriber(subscribeInfo).then((commonEventSubscriber) => {
## CommonEvent.subscribe<sup>(deprecated)</sup>
subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback<CommonEventData>): void
subscribe(subscriber: CommonEventSubscriber, callback: AsyncCallback\<CommonEventData>): void
以回调形式订阅公共事件。
......
......@@ -562,7 +562,7 @@ setStaticSubscriberState(enable: boolean, callback: AsyncCallback\<void>): void;
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | -------------------------- |
| enable | boolean | 是 | 表示静态订阅事件使能状态。 true:使能 false:去使能。 |
| callback | AsyncCallback<void> | 是 | 表示设置静态订阅事件使能状态的回调方法。 |
| callback | AsyncCallback\<void> | 是 | 表示设置静态订阅事件使能状态的回调方法。 |
**错误码:**
......
# @ohos.multimodalInput.inputDeviceCooperate (键鼠穿越)
# @ohos.multimodalInput.inputDeviceCooperate (键鼠穿越)(待停用)
键鼠穿越功能模块,提供两台或多台设备组网协同后键鼠共享能力,实现键鼠输入设备的跨设备协同操作。
......
# @ohos.font(注册自定义字体)
本模块提供注册自定义字体。
> **说明**
>
> 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
## 导入模块
```ts
import font from '@ohos.font'
```
## font.registerFont
registerFont(options: FontOptions): void
在字体管理中注册自定义字体。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | --------------------------- | ---- | ---------------------- |
| options | [FontOptions](#fontoptions) | 是 | 注册的自定义字体信息。 |
## FontOptions
| 名称 | 类型 | 必填 | 说明 |
| ---------- | ------ | ---- | ------------------------ |
| familyName | string | 是 | 设置注册的字体名称。 |
| familySrc | string | 是 | 设置注册字体文件的路径。 |
## 示例
```ts
// xxx.ets
import font from '@ohos.font';
@Entry
@Component
struct FontExample {
@State message: string = '你好,世界'
aboutToAppear() {
font.registerFont({
familyName: 'medium',
familySrc: '/font/medium.ttf'
})
}
build() {
Column() {
Text(this.message)
.align(Alignment.Center)
.fontSize(20)
.fontFamily('medium') // medium:注册自定义字体的名字
.height('100%')
}.width('100%')
}
}
```
......@@ -1702,7 +1702,7 @@ let delayTimes = imageSourceApi.getDelayTime();
### getFrameCount<sup>10+</sup>
getFrameCount(callback: AsyncCallback<number>): void;
getFrameCount(callback: AsyncCallback\<number>): void;
获取图像帧数,使用callback形式返回结果。
......
......@@ -1067,7 +1067,7 @@ resize(width: number, height: number): Promise\<void>;
| 类型 | 说明 |
| ------- | ------------------------------ |
| Promise<void> | 无返回结果的Promise对象。 |
| Promise\<void> | 无返回结果的Promise对象。 |
**示例:**
......@@ -1139,7 +1139,7 @@ moveTo(x: number, y: number): Promise\<void>
| 类型 | 说明 |
| ------- | ------------------------------ |
| Promise<void> | 无返回结果的Promise对象。 |
| Promise\<void> | 无返回结果的Promise对象。 |
**示例:**
......
......@@ -98,7 +98,7 @@ onCreate(want, launchParam) {
if (isNfcATag) {
var nfcA;
try {
nfcA = tag.getNfcATag(taginfo);
nfcA = tag.getNfcATag(tagInfo);
} catch (error) {
console.log("tag.getNfcATag catched error: " + error);
}
......@@ -109,7 +109,7 @@ onCreate(want, launchParam) {
if (isIsoDepTag) {
var isoDep;
try {
isoDep = tag.getIsoDep(taginfo);
isoDep = tag.getIsoDep(tagInfo);
} catch (error) {
console.log("tag.getIsoDep catched error: " + error);
}
......@@ -139,8 +139,8 @@ getNfcATag(tagInfo: [TagInfo](#taginfo)): [NfcATag](js-apis-nfctech.md#nfcatag)
**返回值:**
| **类型** | **说明** |
| -------- | -------- |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcATag](js-apis-nfctech.md#nfcatag) | NFC A类型Tag对象。 |
## tag.getNfcA<sup>9+</sup>
......@@ -159,16 +159,16 @@ getNfcA(tagInfo: [TagInfo](#taginfo)): [NfcATag](js-apis-nfctech.md#nfcatag)
**返回值:**
| **类型** | **说明** |
| -------- | -------- |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcATag](js-apis-nfctech.md#nfcatag) | NFC A类型Tag对象。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getNfcBTag
......@@ -190,9 +190,9 @@ getNfcBTag(tagInfo: [TagInfo](#taginfo)): [NfcBTag](js-apis-nfctech.md#nfcbtag)
**返回值:**
| **类型** | **说明** |
| -------- | ---------------- |
| [NfcBTag](js-apis-nfctech.md#nfcbtag) | NFC B类型Tag对象。 |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcBTag](js-apis-nfctech.md#nfcbtag) | NFC B类型Tag对象。 |
## tag.getNfcB<sup>9+</sup>
......@@ -210,16 +210,16 @@ getNfcB(tagInfo: [TagInfo](#taginfo)): [NfcBTag](js-apis-nfctech.md#nfcbtag)
**返回值:**
| **类型** | **说明** |
| -------- | ---------------- |
| [NfcBTag](js-apis-nfctech.md#nfcbtag) | NFC B类型Tag对象。 |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcBTag](js-apis-nfctech.md#nfcbtag) | NFC B类型Tag对象。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getNfcFTag
......@@ -241,9 +241,9 @@ getNfcFTag(tagInfo: [TagInfo](#taginfo)): [NfcFTag](js-apis-nfctech.md#nfcftag)
**返回值:**
| **类型** | **说明** |
| -------- | ---------------- |
| [NfcFTag](js-apis-nfctech.md#nfcftag) | NFC F类型Tag对象。 |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcFTag](js-apis-nfctech.md#nfcftag) | NFC F类型Tag对象。 |
## tag.getNfcF<sup>9+</sup>
......@@ -261,16 +261,16 @@ getNfcF(tagInfo: [TagInfo](#taginfo)): [NfcFTag](js-apis-nfctech.md#nfcftag)
**返回值:**
| **类型** | **说明** |
| -------- | ---------------- |
| [NfcFTag](js-apis-nfctech.md#nfcftag) | NFC F类型Tag对象。 |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcFTag](js-apis-nfctech.md#nfcftag) | NFC F类型Tag对象。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getNfcVTag
......@@ -292,9 +292,9 @@ getNfcVTag(tagInfo: [TagInfo](#taginfo)): [NfcVTag](js-apis-nfctech.md#nfcvtag)
**返回值:**
| **类型** | **说明** |
| -------- | ---------------- |
| [NfcVTag](js-apis-nfctech.md#nfcvtag) | NFC V类型Tag对象。 |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcVTag](js-apis-nfctech.md#nfcvtag) | NFC V类型Tag对象。 |
## tag.getNfcV<sup>9+</sup>
......@@ -312,16 +312,16 @@ getNfcV(tagInfo: [TagInfo](#taginfo)): [NfcVTag](js-apis-nfctech.md#nfcvtag)
**返回值:**
| **类型** | **说明** |
| -------- | ---------------- |
| [NfcVTag](js-apis-nfctech.md#nfcvtag) | NFC V类型Tag对象。 |
| **类型** | **说明** |
| ------------------------------------- | ------------- |
| [NfcVTag](js-apis-nfctech.md#nfcvtag) | NFC V类型Tag对象。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getIsoDep<sup>9+</sup>
......@@ -334,22 +334,22 @@ getIsoDep(tagInfo: [TagInfo](#taginfo)): [IsoDepTag](js-apis-nfctech.md#isoDepTa
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
**返回值:**
| **类型** | **说明** |
| ---------- | ------------------|
| [IsoDepTag](js-apis-nfctech.md#isodeptag9) | IsoDep类型Tag对象,通过该对象访问IsoDep类型的相关接口。 |
| **类型** | **说明** |
| ---------------------------------------- | ----------------------------------- |
| [IsoDepTag](js-apis-nfctech.md#isodeptag9) | IsoDep类型Tag对象,通过该对象访问IsoDep类型的相关接口。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getNdef<sup>9+</sup>
......@@ -362,22 +362,22 @@ getNdef(tagInfo: [TagInfo](#taginfo)): [NdefTag](js-apis-nfctech.md#ndeftag9)
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
**返回值:**
| **类型** | **说明** |
| ---------| -------------- |
| [NdefTag](js-apis-nfctech.md#ndeftag9) | NDEF类型Tag对象,通过该对象访问NDEF类型的相关接口。|
| **类型** | **说明** |
| -------------------------------------- | ------------------------------- |
| [NdefTag](js-apis-nfctech.md#ndeftag9) | NDEF类型Tag对象,通过该对象访问NDEF类型的相关接口。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getMifareClassic<sup>9+</sup>
......@@ -390,22 +390,22 @@ getMifareClassic(tagInfo: [TagInfo](#taginfo)): [MifareClassicTag](js-apis-nfcte
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
**返回值:**
| **类型** | **说明** |
| ----------------- | ------------------------|
| [MifareClassicTag](js-apis-nfctech.md#mifareclassictag-9) | MIFARE Classic类型Tag对象,通过该对象访问MIFARE Classic类型的相关接口。 |
| **类型** | **说明** |
| ---------------------------------------- | ---------------------------------------- |
| [MifareClassicTag](js-apis-nfctech.md#mifareclassictag-9) | MIFARE Classic类型Tag对象,通过该对象访问MIFARE Classic类型的相关接口。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getMifareUltralight<sup>9+</sup>
......@@ -417,22 +417,22 @@ getMifareUltralight(tagInfo: [TagInfo](#taginfo)): [MifareUltralightTag](js-apis
**系统能力:** SystemCapability.Communication.NFC.Tag
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------- | ---- | ---------------------------------------- |
| taginfo | [TagInfo](#taginfo) | 是 | 包含Tag技术类型和相关参数,从tag.getTagInfo(want: Want)获取。 |
**返回值:**
| **类型** | **说明** |
| -------------------- | ---------------------------|
| [MifareUltralightTag](js-apis-nfctech.md#mifareultralighttag9) | MIFARE Ultralight类型Tag对象,通过该对象访问MIFARE Ultralight类型的相关接口。 |
| **类型** | **说明** |
| ---------------------------------------- | ---------------------------------------- |
| [MifareUltralightTag](js-apis-nfctech.md#mifareultralighttag9) | MIFARE Ultralight类型Tag对象,通过该对象访问MIFARE Ultralight类型的相关接口。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getNdefFormatable<sup>9+</sup>
......@@ -445,16 +445,16 @@ getNdefFormatable(tagInfo: [TagInfo](#taginfo)): [NdefFormatableTag](js-apis-nfc
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| [NdefFormatableTag](js-apis-nfctech.md#ndefformatabletag) | NDEF Formatable类型Tag对象,通过该对象访问NDEF Formatable类型的相关接口。 |
| **类型** | **说明** |
| ---------------------------------------- | ---------------------------------------- |
| [NdefFormatableTag](js-apis-nfctech.md#ndefformatabletag) | NDEF Formatable类型Tag对象,通过该对象访问NDEF Formatable类型的相关接口。 |
**错误码:**
以下错误码的详细介绍请参见[NFC错误码](../errorcodes/errorcode-nfc.md)
| 错误码ID | 错误信息|
| ------- | -------|
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------- |
| 3100201 | Tag running state is abnormal in service. |
## tag.getTagInfo<sup>9+</sup>
......@@ -467,14 +467,14 @@ getTagInfo(want: [Want](js-apis-app-ability-want.md#Want)): [TagInfo](#taginfo)
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ------------------------- | ---- | ---------------------------------------- |
| want | [Want](js-apis-app-ability-want.md#Want) | 是 | 分发Ability时,在系统onCreate入口函数的参数中获取。 |
| 参数名 | 类型 | 必填 | 说明 |
| ---- | ---------------------------------------- | ---- | --------------------------------- |
| want | [Want](js-apis-app-ability-want.md#Want) | 是 | 分发Ability时,在系统onCreate入口函数的参数中获取。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| ------------------- | --------------------------- |
| [TagInfo](#taginfo) | TagInfo对象,用于获取不同技术类型的Tag对象。 |
......@@ -488,14 +488,14 @@ makeUriRecord(uri: string): [NdefRecord](#ndefrecord9);
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------- | ---- | -------------------------------------- |
| uri | string | 是 | 写入到NDEF Record里面的数据内容。 |
| 参数名 | 类型 | 必填 | 说明 |
| ---- | ------ | ---- | ---------------------- |
| uri | string | 是 | 写入到NDEF Record里面的数据内容。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| -------------------------- | ---------------------------------------- |
| [NdefRecord](#ndefrecord9) | NDEF标签的Record,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**示例:**
......@@ -527,15 +527,15 @@ makeTextRecord(text: string, locale: string): [NdefRecord](#ndefrecord9);
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------- | ---- | -------------------------------------- |
| text | string | 是 | 写入到NDEF Record里面的文本数据内容。 |
| locale | string | 是 | 文本数据内容的编码方式。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | ------------------------ |
| text | string | 是 | 写入到NDEF Record里面的文本数据内容。 |
| locale | string | 是 | 文本数据内容的编码方式。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| -------------------------- | ---------------------------------------- |
| [NdefRecord](#ndefrecord9) | NDEF标签的Record,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**示例:**
......@@ -569,15 +569,15 @@ makeMimeRecord(mimeType: string, mimeData: number[]): [NdefRecord](#ndefrecord9)
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------- | ---- | -------------------------------------- |
| mimeType | string | 是 | 符合RFC规则的MIME类型,比如"text/plain"或"image/jpeg"。 |
| mimeData | number[] | 是 | MIME数据内容,每个number十六进制表示,范围是0x00~0xFF。 |
| 参数名 | 类型 | 必填 | 说明 |
| -------- | -------- | ---- | ---------------------------------------- |
| mimeType | string | 是 | 符合RFC规则的MIME类型,比如"text/plain"或"image/jpeg"。 |
| mimeData | number[] | 是 | MIME数据内容,每个number十六进制表示,范围是0x00~0xFF。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| -------------------------- | ---------------------------------------- |
| [NdefRecord](#ndefrecord9) | NDEF标签的Record,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**示例:**
......@@ -609,16 +609,16 @@ makeExternalRecord(domainName: string, type: string, externalData: number[]): [N
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------- | ---- | -------------------------------------- |
| domainName | string | 是 | 外部数据发布组织的域名,一般是应用程序的包名。 |
| type | string | 是 | 外部数据的指定类型。 |
| externalData | number[] | 是 | 外部数据内容,每个number十六进制表示,范围是0x00~0xFF。 |
| 参数名 | 类型 | 必填 | 说明 |
| ------------ | -------- | ---- | ----------------------------------- |
| domainName | string | 是 | 外部数据发布组织的域名,一般是应用程序的包名。 |
| type | string | 是 | 外部数据的指定类型。 |
| externalData | number[] | 是 | 外部数据内容,每个number十六进制表示,范围是0x00~0xFF。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| -------------------------- | ---------------------------------------- |
| [NdefRecord](#ndefrecord9) | NDEF标签的Record,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**示例:**
......@@ -652,14 +652,14 @@ messageToBytes(ndefMessage: [NdefMessage](js-apis-nfctech.md#ndefmessage9)): num
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------- | ---- | -------------------------------------- |
| ndefMessage | [NdefMessage](js-apis-nfctech.md#ndefmessage9) | 是 | NDEF消息数据对象。 |
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ---------------------------------------- | ---- | ----------- |
| ndefMessage | [NdefMessage](js-apis-nfctech.md#ndefmessage9) | 是 | NDEF消息数据对象。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| -------- | ---------------------------------------- |
| number[] | NDEF消息数据对象,所转换成的字节格式的数据。每个number十六进制表示,范围是0x00~0xFF。 |
**示例:**
......@@ -693,14 +693,14 @@ createNdefMessage(data: number[]): [NdefMessage](js-apis-nfctech.md#ndefmessage9
**参数:**
| **参数名** | **类型** | **必填** | **说明** |
| -------- | -------- | -------- | -------- |
| data | number[] | 是 | 原始字节,每个number十六进制表示,范围是0x00~0xFF。要求必须满足NDEF Record的格式。 |
| **参数名** | **类型** | **必填** | **说明** |
| ------- | -------- | ------ | ---------------------------------------- |
| data | number[] | 是 | 原始字节,每个number十六进制表示,范围是0x00~0xFF。要求必须满足NDEF Record的格式。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| **类型** | **说明** |
| ---------------------------------------- | ---------------------------------------- |
| [NdefMessage](js-apis-nfctech.md#ndefmessage9) | NDEF标签的Message,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**示例:**
......@@ -727,15 +727,15 @@ createNdefMessage(ndefRecords: NdefRecord[]): [NdefMessage](js-apis-nfctech.md#n
**参数:**
| **参数名** | **类型** | **必填** | **说明** |
| -------- | -------- | -------- | -------- |
| ndefRecords | [NdefRecord](js-apis-nfcTag.md#ndefrecord9)[] | 是 | NDEF标签的Record列表,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
| **参数名** | **类型** | **必填** | **说明** |
| ----------- | ---------------------------------------- | ------ | ---------------------------------------- |
| ndefRecords | [NdefRecord](js-apis-nfcTag.md#ndefrecord9)[] | 是 | NDEF标签的Record列表,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**返回值:**
| **类型** | **说明** |
| ------------------ | --------------------------|
| [NdefMessage](js-apis-nfctech.md#ndefmessage9) | NDEF标签的Message,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。|
| **类型** | **说明** |
| ---------------------------------------- | ---------------------------------------- |
| [NdefMessage](js-apis-nfctech.md#ndefmessage9) | NDEF标签的Message,详见NDEF技术规范《NFCForum-TS-NDEF_1.0》。 |
**示例:**
......@@ -762,113 +762,113 @@ NFC服务在读取到标签时给出的对象,通过改对象属性,应用
**需要权限:** ohos.permission.NFC_TAG
| **名称** | **类型** | **可读** | **可写** | **说明** |
| -------- | -------- | -------- | -------- | -------- |
| uid<sup>9+</sup> | number[] | 是 | 否 | 标签的uid,每个number值是十六进制表示,范围是0x00~0xFF。|
| technology<sup>9+</sup> | number[] | 是 | 否 | 支持的技术类型,每个number值表示所支持技术类型的常量值。 |
| supportedProfiles | number[] | 是 | 否 | 支持的技术类型,从API9开始不支持,使用[tag.TagInfo#technology](#tagtaginfo)替代。|
| extrasData<sup>9+</sup> | [PacMap](js-apis-inner-application-pacMap.md)[] | 是 | 否 | 标签所支持技术的扩展属性值。<br>**系统接口:** 此接口为系统接口。|
| tagRfDiscId<sup>9+</sup> | number | 是 | 否 | 标签发现时分配的ID值。<br>**系统接口:** 此接口为系统接口。|
| remoteTagService<sup>9+</sup> | [rpc.RemoteObject](js-apis-rpc.md#remoteobject) | 是 | 否 | NFC服务进程的远端对象,用于客户端和服务之间的接口通信。<br>**系统接口:** 此接口为系统接口。|
| **名称** | **类型** | **可读** | **可写** | **说明** |
| ----------------------------- | ---------------------------------------- | ------ | ------ | ---------------------------------------- |
| uid<sup>9+</sup> | number[] | 是 | 否 | 标签的uid,每个number值是十六进制表示,范围是0x00~0xFF。 |
| technology<sup>9+</sup> | number[] | 是 | 否 | 支持的技术类型,每个number值表示所支持技术类型的常量值。 |
| supportedProfiles | number[] | 是 | 否 | 支持的技术类型,从API9开始不支持,使用[tag.TagInfo#technology](#tagtaginfo)替代。 |
| extrasData<sup>9+</sup> | [PacMap](js-apis-inner-application-pacMap.md)[] | 是 | 否 | 标签所支持技术的扩展属性值。<br>**系统接口:** 此接口为系统接口。 |
| tagRfDiscId<sup>9+</sup> | number | 是 | 否 | 标签发现时分配的ID值。<br>**系统接口:** 此接口为系统接口。 |
| remoteTagService<sup>9+</sup> | [rpc.RemoteObject](js-apis-rpc.md#remoteobject) | 是 | 否 | NFC服务进程的远端对象,用于客户端和服务之间的接口通信。<br>**系统接口:** 此接口为系统接口。 |
## NdefRecord<sup>9+</sup>
NDEF标签Record属性的定义,参考NDEF标签技术规范《NFCForum-TS-NDEF_1.0》的定义细节。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **类型** | **可读** | **可写** | **说明** |
| -------- | -------- | -------- | -------- | -------- |
| tnf | number | 是 | 否 | NDEF Record的TNF(Type Name Field)。 |
| rtdType| number[] | 是 | 否 | NDEF Record的RTD(Record Type Definition)类型值,每个number十六进制表示,范围是0x00~0xFF。 |
| id | number[] | 是 | 否 | NDEF Record的ID,每个number十六进制表示,范围是0x00~0xFF。|
| payload | number[] | 是 | 否 | NDEF Record的PAYLOAD,每个number十六进制表示,范围是0x00~0xFF。 |
| **名称** | **类型** | **可读** | **可写** | **说明** |
| ------- | -------- | ------ | ------ | ---------------------------------------- |
| tnf | number | 是 | 否 | NDEF Record的TNF(Type Name Field)。 |
| rtdType | number[] | 是 | 否 | NDEF Record的RTD(Record Type Definition)类型值,每个number十六进制表示,范围是0x00~0xFF。 |
| id | number[] | 是 | 否 | NDEF Record的ID,每个number十六进制表示,范围是0x00~0xFF。 |
| payload | number[] | 是 | 否 | NDEF Record的PAYLOAD,每个number十六进制表示,范围是0x00~0xFF。 |
## 技术类型定义
NFC Tag有多种不同的技术类型,定义常量描述不同的技术类型。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| NFC_A | 1 | NFC-A (ISO 14443-3A)技术。|
| NFC_B | 2 | NFC-A (ISO 14443-3B)技术。|
| ISO_DEP | 3 | ISO-DEP (ISO 14443-4)技术。|
| NFC_F | 4 | NFC-F (JIS 6319-4)技术。|
| NFC_V | 5 | NFC-V (ISO 15693)技术。|
| NDEF | 6 | NDEF技术。|
| NDEF_FORMATABLE<sup>9+</sup> | 7 | 可以格式化的NDEF技术。|
| MIFARE_CLASSIC | 8 | MIFARE Classic技术。|
| MIFARE_ULTRALIGHT | 9 | MIFARE Utralight技术。|
| **名称** | **值** | **说明** |
| ---------------------------- | ----- | ------------------------ |
| NFC_A | 1 | NFC-A (ISO 14443-3A)技术。 |
| NFC_B | 2 | NFC-A (ISO 14443-3B)技术。 |
| ISO_DEP | 3 | ISO-DEP (ISO 14443-4)技术。 |
| NFC_F | 4 | NFC-F (JIS 6319-4)技术。 |
| NFC_V | 5 | NFC-V (ISO 15693)技术。 |
| NDEF | 6 | NDEF技术。 |
| NDEF_FORMATABLE<sup>9+</sup> | 7 | 可以格式化的NDEF技术。 |
| MIFARE_CLASSIC | 8 | MIFARE Classic技术。 |
| MIFARE_ULTRALIGHT | 9 | MIFARE Utralight技术。 |
## TnfType<sup>9+</sup>
NDEF Record的TNF(Type Name Field)类型值,参考NDEF标签技术规范《NFCForum-TS-NDEF_1.0》的定义细节。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| TNF_EMPTY | 0x0 | Empty。|
| TNF_WELL_KNOWN | 0x1 | NFC Forum well-known type [NFC RTD]。|
| TNF_MEDIA | 0x2 | Media-type as defined in RFC 2046 [RFC 2046]。|
| TNF_ABSOLUTE_URI | 0x3 | Absolute URI as defined in RFC 3986 [RFC 3986]。|
| TNF_EXT_APP | 0x4 | NFC Forum external type [NFC RTD]。|
| TNF_UNKNOWN | 0x5 | Unknown。|
| TNF_UNCHANGED | 0x6 | Unchanged (see section 2.3.3)。|
| **名称** | **值** | **说明** |
| ---------------- | ----- | ---------------------------------------- |
| TNF_EMPTY | 0x0 | Empty。 |
| TNF_WELL_KNOWN | 0x1 | NFC Forum well-known type [NFC RTD]。 |
| TNF_MEDIA | 0x2 | Media-type as defined in RFC 2046 [RFC 2046]。 |
| TNF_ABSOLUTE_URI | 0x3 | Absolute URI as defined in RFC 3986 [RFC 3986]。 |
| TNF_EXT_APP | 0x4 | NFC Forum external type [NFC RTD]。 |
| TNF_UNKNOWN | 0x5 | Unknown。 |
| TNF_UNCHANGED | 0x6 | Unchanged (see section 2.3.3)。 |
## NDEF Record RTD类型定义
NDEF Record的RTD(Record Type Definition)类型值,参考NDEF标签技术规范《NFCForum-TS-NDEF_1.0》的定义细节。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| RTD_TEXT<sup>9+</sup> | [0x54] | 文本类型的NDEF Record。|
| RTD_URI<sup>9+</sup> | [0x55] | URI类型的NDEF Record。|
| **名称** | **值** | **说明** |
| --------------------- | ------ | ------------------ |
| RTD_TEXT<sup>9+</sup> | [0x54] | 文本类型的NDEF Record。 |
| RTD_URI<sup>9+</sup> | [0x55] | URI类型的NDEF Record。 |
## NfcForumType<sup>9+</sup>
NFC Forum标准里面Tag类型的定义。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| NFC_FORUM_TYPE_1 | 1 | NFC论坛类型1。 |
| NFC_FORUM_TYPE_2 | 2 | NFC论坛类型2。 |
| NFC_FORUM_TYPE_3 | 3 | NFC论坛类型3。 |
| NFC_FORUM_TYPE_4 | 4 | NFC论坛类型4。 |
| MIFARE_CLASSIC | 101 | MIFARE Classic类型。 |
| **名称** | **值** | **说明** |
| ---------------- | ----- | ----------------- |
| NFC_FORUM_TYPE_1 | 1 | NFC论坛类型1。 |
| NFC_FORUM_TYPE_2 | 2 | NFC论坛类型2。 |
| NFC_FORUM_TYPE_3 | 3 | NFC论坛类型3。 |
| NFC_FORUM_TYPE_4 | 4 | NFC论坛类型4。 |
| MIFARE_CLASSIC | 101 | MIFARE Classic类型。 |
## MifareClassicType<sup>9+</sup>
MIFARE Classic标签类型的定义。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| TYPE_UNKNOWN | 0 | 未知的MIFARE类型。 |
| TYPE_CLASSIC | 1 | MIFARE Classic类型。|
| TYPE_PLUS | 2 | MIFARE Plus类型。|
| TYPE_PRO | 3 | MIFARE Pro类型。 |
| **名称** | **值** | **说明** |
| ------------ | ----- | ----------------- |
| TYPE_UNKNOWN | 0 | 未知的MIFARE类型。 |
| TYPE_CLASSIC | 1 | MIFARE Classic类型。 |
| TYPE_PLUS | 2 | MIFARE Plus类型。 |
| TYPE_PRO | 3 | MIFARE Pro类型。 |
## MifareClassicSize<sup>9+</sup>
MIFARE Classic标签存储大小的定义。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| MC_SIZE_MINI | 320 | 每个标签5个扇区,每个扇区4个块。 |
| MC_SIZE_1K | 1024 | 每个标签16个扇区,每个扇区4个块。|
| MC_SIZE_2K | 2048 | 每个标签32个扇区,每个扇区4个块。 |
| MC_SIZE_4K | 4096 | 每个标签40个扇区,每个扇区4个块。|
| **名称** | **值** | **说明** |
| ------------ | ----- | ------------------ |
| MC_SIZE_MINI | 320 | 每个标签5个扇区,每个扇区4个块。 |
| MC_SIZE_1K | 1024 | 每个标签16个扇区,每个扇区4个块。 |
| MC_SIZE_2K | 2048 | 每个标签32个扇区,每个扇区4个块。 |
| MC_SIZE_4K | 4096 | 每个标签40个扇区,每个扇区4个块。 |
## MifareUltralightType<sup>9+</sup>
MIFARE Ultralight标签类型的定义。
**系统能力:** SystemCapability.Communication.NFC.Tag
| **名称** | **值** | **说明** |
| -------- | -------- | -------- |
| TYPE_UNKNOWN | 0 | 未知的 MIFARE 类型。 |
| TYPE_ULTRALIGHT | 1 | MIFARE Ultralight类型。|
| TYPE_ULTRALIGHT_C | 2 | MIFARE UltralightC 类型。 |
| **名称** | **值** | **说明** |
| ----------------- | ----- | ---------------------- |
| TYPE_UNKNOWN | 0 | 未知的 MIFARE 类型。 |
| TYPE_ULTRALIGHT | 1 | MIFARE Ultralight类型。 |
| TYPE_ULTRALIGHT_C | 2 | MIFARE UltralightC 类型。 |
<!--no_check-->
\ No newline at end of file
......@@ -460,7 +460,7 @@ removeAll(bundle: BundleOption, callback: AsyncCallback\<void\>): void
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------- | ---- | ---------------------------- |
| bundle | [BundleOption]((js-apis-inner-notification-notificationCommonDef.md#bundleoption)) | 是 | 指定应用的包信息。 |
| bundle | [BundleOption](js-apis-inner-notification-notificationCommonDef.md#bundleoption) | 是 | 指定应用的包信息。 |
| callback | AsyncCallback\<void\> | 是 | 删除指定应用的所有通知回调函数。 |
**错误码:**
......@@ -548,7 +548,7 @@ removeAll(bundle?: BundleOption): Promise\<void\>
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------------ | ---- | ---------- |
| bundle | [BundleOption]((js-apis-inner-notification-notificationCommonDef.md#bundleoption)) | 否 | 指定应用的包信息。 |
| bundle | [BundleOption](js-apis-inner-notification-notificationCommonDef.md#bundleoption) | 否 | 指定应用的包信息。 |
**错误码:**
......
......@@ -4,7 +4,9 @@
> **说明:**
>
> 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
> - 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
>
> - Menu组件需和[bindMenu](ts-universal-attributes-menu.md)或[bindContextMenu](ts-universal-attributes-menu.md)方法配合使用,不支持作为普通组件单独使用。
## 子组件
......
......@@ -4,7 +4,9 @@
> **说明:**
>
> 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
> - 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
>
> - CustomBuilder里不支持再使用bindMenu、bindContextMenu弹出菜单。多级菜单可使用[Menu组件](ts-basic-components-menu.md)。
## 属性
......@@ -163,4 +165,4 @@ struct ContextMenuExample {
.bindContextMenu(this.MenuBuilder, ResponseType.RightClick)
}
}
```
\ No newline at end of file
```
......@@ -5,19 +5,14 @@
HUKS提供为业务安全随机生成密钥的能力。通过HUKS生成的密钥,密钥的全生命周期明文不会出安全环境,能保证任何人都无法接触获取到密钥的明文。即使生成密钥的业务自身,后续也只能通过HUKS提供的接口请求执行密钥操作,获取操作结果,但无法接触到密钥自身。
**<font size=5>开发步骤</font>**
**开发步骤**
生成密钥时使用[huks.generateKeyItem(keyAlias,options,callback)](../reference/apis/js-apis-huks.md#huksgeneratekeyitem9)方法,传入keyAlias作为密钥别名,传入options包含该密钥的属性集,传入callback用于回调异步结果。关于接口的具体信息,可在[API参考文档](../reference/apis/js-apis-huks.md)中查看。
1. 确定密钥别名;
2. 初始化密钥属性集:通过[HuksParam](../reference/apis/js-apis-huks.md#huksparam)封装密钥属性,搭配Array组成密钥属性集,并赋值给[HuksOptions](../reference/apis/js-apis-huks.md#huksoptions)(properties字段),其中必须包含[HuksKeyAlg](../reference/apis/js-apis-huks.md#hukskeyalg),[HuksKeySize](../reference/apis/js-apis-huks.md#hukskeysize),[HuksKeyPurpose](../reference/apis/js-apis-huks.md#hukskeypurpose)属性;
3. 将密钥别名与密钥参数集作为参数传入,生成密钥。
> **说明**
>
> 存储的 keyAlias 密钥别名最大为64字节
......@@ -227,9 +222,9 @@ try {
| 接口名 | 描述 |
| -------------------------------------- | ----------------------------|
|generateKeyItem(keyAlias: string, options: HuksOptions, callback: AsyncCallback\<void>) : void| 生成新密钥|
|exportKeyItem(keyAlias: string, options: HuksOptions, callback: AsyncCallback<HuksReturnResult>) : void| 导出密钥对的公钥|
|importWrappedKeyItem(keyAlias: string, wrappingKeyAlias: string, options: HuksOptions, callback: AsyncCallback<void>) : void|导入加密密钥|
|deleteKeyItem(keyAlias: string, options: HuksOptions, callback: AsyncCallback<void>) : void|删除密钥|
|exportKeyItem(keyAlias: string, options: HuksOptions, callback: AsyncCallback\<HuksReturnResult>) : void| 导出密钥对的公钥|
|importWrappedKeyItem(keyAlias: string, wrappingKeyAlias: string, options: HuksOptions, callback: AsyncCallback\<void>) : void|导入加密密钥|
|deleteKeyItem(keyAlias: string, options: HuksOptions, callback: AsyncCallback\<void>) : void|删除密钥|
需要注意的是,导出密钥接口返回的公钥明文材料是按照**X.509**格式封装,导入加密密钥接口中的密钥材料需满足**Length<sub>Data</sub>-Data** 的格式封装。具体,应用需要申请一个Uint8Array按照以下表格中的顺序依次封装。
......
......@@ -31,11 +31,11 @@
| 接口名 | 描述 |
| ------------------------------------------------------------ | ------------------------------------------------------- |
| createMessage(pdu: Array<number>, specification: string, callback: AsyncCallback<ShortMessage>): void | 基于协议数据单元(PDU)和指定的SMS协议创建SMS消息实例。 |
| createMessage(pdu: Array\<number>, specification: string, callback: AsyncCallback\<ShortMessage>): void | 基于协议数据单元(PDU)和指定的SMS协议创建SMS消息实例。 |
| sendMessage(options: SendMessageOptions): void | 发送文本或数据SMS消息。 |
| getDefaultSmsSlotId(callback: AsyncCallback<number>): void | 获取用于发送短信的默认SIM卡。 |
| setSmscAddr(slotId: number, smscAddr: string, callback: AsyncCallback<void>): void | 根据指定的插槽ID设置短信服务中心的地址。 |
| getSmscAddr(slotId: number, callback: AsyncCallback<string>): void | 根据指定的插槽ID获取短信服务中心地址。 |
| getDefaultSmsSlotId(callback: AsyncCallback\<number>): void | 获取用于发送短信的默认SIM卡。 |
| setSmscAddr(slotId: number, smscAddr: string, callback: AsyncCallback\<void>): void | 根据指定的插槽ID设置短信服务中心的地址。 |
| getSmscAddr(slotId: number, callback: AsyncCallback\<string>): void | 根据指定的插槽ID获取短信服务中心地址。 |
## 开发步骤
......
......@@ -35,11 +35,11 @@
- 组件区域(蓝区方块):组件区域表明组件的大小,width、height属性设置该区域的大小。
- 组件内容区(黄色方块):组件区域大小减去组件的Padding值,组件内容区大小会作为组件内容(或者子组件)进行大小测算时的布局测算限制。
- 组件内容区(黄色方块):组件区域大小减去组件的padding值,组件内容区大小会作为组件内容(或者子组件)进行大小测算时的布局测算限制。
- 组件内容(绿色方块):组件内容本身占用的大小,比如文本内容占用的大小。组件内容和组件内容区不一定匹配,比如设置了固定的width和height,此时组件内容区大小就是设置的width和height减去Padding值,但文本内容则是通过文本布局引擎测算后得到的大小,可能出现文本真实大小小于设置的组件内容区大小。当组件内容和组件内容区大小不一致时,align属性生效,定义组件内容在组件内容区的对齐方式,如居中对齐。
- 组件内容(绿色方块):组件内容本身占用的大小,比如文本内容占用的大小。组件内容和组件内容区不一定匹配,比如设置了固定的width和height,此时组件内容区大小就是设置的width和height减去padding值,但文本内容则是通过文本布局引擎测算后得到的大小,可能出现文本真实大小小于设置的组件内容区大小。当组件内容和组件内容区大小不一致时,align属性生效,定义组件内容在组件内容区的对齐方式,如居中对齐。
- 组件布局边界(虚线部分):组件通过Margin属性设置外边距时,组件布局边界就是组件区域加上Margin的大小。
- 组件布局边界(虚线部分):组件通过margin属性设置外边距时,组件布局边界就是组件区域加上margin的大小。
## 如何选择布局
......
......@@ -1182,6 +1182,7 @@
- [通知服务公共事件定义](reference/apis/common_event/commonEvent-ans.md)
- [资源调度子系统公共事件定义](reference/apis/common_event/commonEvent-resourceschedule.md)
- [电话服务子系统公共事件定义](reference/apis/common_event/commonEvent-telephony.md)
- [USB子系统公共事件定义](reference/apis/common_event/commonEvent-usb.md)
- 包管理
- [@ohos.bundle.appControl (appControl模块)](reference/apis/js-apis-appControl.md)
- [@ohos.bundle.bundleManager (bundleManager模块)](reference/apis/js-apis-bundleManager.md)
......@@ -1214,7 +1215,7 @@
- UI界面
- [@ohos.animator (动画)](reference/apis/js-apis-animator.md)
- [@ohos.arkui.componentSnapshot(组件截图)](reference/apis/js-apis-arkui-componentSnapshot.md)
- [@ohos.arkui.drawableDescriptor(DrawableDescriptor)](reference/apis/js-apis-arkui-drawableDescriptor.md)
- [@ohos.arkui.drawableDescriptor (DrawableDescriptor)](reference/apis/js-apis-arkui-drawableDescriptor.md)
- [@ohos.curves (插值计算)](reference/apis/js-apis-curve.md)
- [@ohos.matrix4 (矩阵变换)](reference/apis/js-apis-matrix4.md)
- [@ohos.mediaquery (媒体查询)](reference/apis/js-apis-mediaquery.md)
......@@ -1681,16 +1682,16 @@
- [OH_Huks_ParamSet](reference/native-apis/_o_h___huks___param_set.md)
- [OH_Huks_PubKeyInfo](reference/native-apis/_o_h___huks___pub_key_info.md)
- [OH_Huks_Result](reference/native-apis/_o_h___huks___result.md)
- 标准库
- [Node_API](reference/native-lib/third_party_napi/napi.md)
- [libuv](reference/native-lib/third_party_libuv/libuv.md)
- [支持的标准库介绍](reference/native-lib/third_party_libc/musl.md)
- 附录
- [Native api中没有导出的符号列表](reference/native-lib/third_party_libc/musl-peculiar-symbol.md)
- [Native api中由于权限管控可能调用失败的符号列表](reference/native-lib/third_party_libc/musl-permission-control-symbol.md)
- [Native api中导出的EGL符号列表](reference/native-lib/third_party_opengl/egl-symbol.md)
- [Native api中导出的OpenGL ES 3.0符号列表](reference/native-lib/third_party_opengl/openglesv3-symbol.md)
- [Native api中支持的OpenSL ES接口列表](reference/native-lib/third_party_opensles/opensles.md)
- 标准库
- [Node_API](reference/native-lib/third_party_napi/napi.md)
- [libuv](reference/native-lib/third_party_libuv/libuv.md)
- [支持的标准库介绍](reference/native-lib/third_party_libc/musl.md)
- 附录
- [Native api中没有导出的符号列表](reference/native-lib/third_party_libc/musl-peculiar-symbol.md)
- [Native api中由于权限管控可能调用失败的符号列表](reference/native-lib/third_party_libc/musl-permission-control-symbol.md)
- [Native api中导出的EGL符号列表](reference/native-lib/third_party_opengl/egl-symbol.md)
- [Native api中导出的OpenGL ES 3.0符号列表](reference/native-lib/third_party_opengl/openglesv3-symbol.md)
- [Native api中支持的OpenSL ES接口列表](reference/native-lib/third_party_opensles/opensles.md)
- 常见问题
- [如何编译full-SDK](faqs/full-sdk-compile-guide.md)
- [如何替换full-SDK](faqs/full-sdk-switch-guide.md)
......@@ -1701,7 +1702,7 @@
- [ArkUI布局开发常见问题(ArkTS)](faqs/faqs-arkui-layout.md)
- [ArkUI路由/导航开发常见问题(ArkTS)](faqs/faqs-arkui-route-nav.md)
- [ArkUI动画/交互事件开发常见问题(ArkTS)](faqs/faqs-arkui-animation-interactive-event.md)
-[ArkUI框架开发常见问题(JS)](faqs/faqs-arkui-js.md)
- [ArkUI框架开发常见问题(JS)](faqs/faqs-arkui-js.md)
- [Web开发常见问题](faqs/faqs-arkui-web.md)
- [包管理开发常见问题](faqs/faqs-bundle-management.md)
- [资源管理开发常见问题](faqs/faqs-globalization.md)
......
......@@ -500,7 +500,7 @@ function foo() {
参见:[@typescript-eslint/no-this-alias](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/docs/rules/no-this-alias.md)
ESLint的描述更加严苛,我们认为this不应该在任情况下赋值给一个变量。
ESLint的描述更加严苛,我们认为this不应该在任情况下赋值给一个变量。
# 类与对象
......@@ -622,7 +622,7 @@ function foo() {
**【描述】**
因为async function的返回值总是封装在Promise.resolve,return await实际上并没有做任何事情,只是在Promise resolve或reject之前增加了额外的时间。唯一有效是,如果try/catch语句中使用return await来捕获另一个基于Promise的函数的错误,则会出现异常
因为async function的返回值总是封装在Promise.resolve,return await实际上并没有做任何事情,只是在Promise resolve或reject之前增加了额外的时间。唯一有效的情况是,在try/catch语句中使用return await来捕获另一个基于Promise的函数的错误
**【反例】**
......@@ -820,7 +820,7 @@ export type { ButtonProps };
**【描述】**
如果导入类型(type),将导入类型和导其他对象分开写。
如果导入类型(type),将导入类型和导其他对象分开写。
**【反例】**
......
......@@ -3,4 +3,4 @@
布局不是静态固定的,当显示环境发生变化时,如横竖屏切换、调节字体大小、应用分屏,要及时调整内容的布局方式以适应变化。本章提供了布局基础的概念和介绍。详见[布局基础](grid-system.md)
了解布局的基础概念后,通过调用栅格系统、自适应布局和响应式布局能力就可以让内容更好地适配显示环境的变化。综合运用布局基础能力,可实现常用页面结构的多设备适配。详见[布局基础运案例](ui-layout-cases.md)
了解布局的基础概念后,通过调用栅格系统、自适应布局和响应式布局能力就可以让内容更好地适配显示环境的变化。综合运用布局基础能力,可实现常用页面结构的多设备适配。详见[布局基础运案例](ui-layout-cases.md)
......@@ -136,14 +136,11 @@
| ISSUE | 问题描述 | 影响 | 计划解决日期 |
| -------- | -------- | -------- | -------- |
| I6B4U3 | 进程com.ohos.launcher低概率(3/10)引发appfreeze | 安装应用加多,安装超过40个应用,且内存较小的设备场景下,低概率出现appfreeze,但桌面功能正常,不影响整体功能和使用 | 2023年5月30日 |
| I6SXBI | 进程ohos.samples.distributedcalc下的libdistributeddata.z.so低概率导致cppcrash | 计算器应用快速启动和退出场景,启动后1秒内退出,导致JS对象读取数据库成功前JS对象被析构,只有LOG报错但用户无感知,影响可控 | 2023年6月30日 |
| I6TRE6 | 进程com.ohos.contacts下的com.ohos.contacts线程导致libdatashare_consumer.z.so低概率出现crash。 | 联系人应用快速启动和退出场景,发现在启动后600ms内退出,联系人进程低概率出现crash,出现crash后联系人进程会被重新拉起,影响可控。 | 2023年6月30日 |
| I6SMQA | 浏览器加载微博,滑动过程中出现抖动。 | 通过浏览器加载微博web网页后,快速滑动时,内容会闪现未加载,然后很快能加载出来,影响滑动体验。 | 2023年6月30日 |
| I72P5E | 反复进入大图浏览界面后返回,导致libace.z.so出现内存泄露 | 从图库进入大图浏览界面后返回,ArkUI模块每次泄露10kb,在应用上点击返回后,泄露问题消失。影响可控。 | 2023年6月30日 |
| I72P5I | 反复进入某相册的图片宫格浏览界面,导致libace.z.so出现内存泄露 | 进入某相册的图片宫格浏览界面后返回,ArkUI每次泄露19kb,在应用上点击返回后,泄露问题消失。影响可控。 | 2023年6月30日 |
| I76N0Y | 反复在dock栏添加/移除应用,导致libace.z.so出现内存泄露 | 移动卡片到合法区域,ArkUI每次泄露99kb,非常用场景,应用重启可泄露问题消失。影响可控。 | 2023年6月30日 |
| I6XHE7 | NAPIRemoteObject模块内存泄露 | JS应用调用IPC需要建立NAPIRemoteObject对象进程通信,创建一次可以循环使用,建立一次后泄露1.2kb,应用不需要反复创建新对象,泄露量可控,应用进程退出会释放掉内存。 | 2023年6月30日 |
<!--no_check-->
\ No newline at end of file
| I6B4U3 | 进程com.ohos.launcher低概率(3/10)引发appfreeze | 安装应用加多,安装超过40个应用,且内存较小的设备场景下,低概率出现appfreeze,但桌面功能正常,不影响整体功能和使用 | 2023年6月15日 |
| I6SXBI | 进程ohos.samples.distributedcalc下的libdistributeddata.z.so低概率导致cppcrash | 计算器应用快速启动和退出场景,启动后1秒内退出,导致JS对象读取数据库成功前JS对象被析构,只有LOG报错但用户无感知,影响可控 | 2023年7月15日 |
| I6TRE6 | 进程com.ohos.contacts下的com.ohos.contacts线程导致libdatashare_consumer.z.so低概率出现crash。 | 联系人应用快速启动和退出场景,发现在启动后600ms内退出,联系人进程低概率出现crash,出现crash后联系人进程会被重新拉起,影响可控。 | 2023年7月15日 |
| I6SMQA | 浏览器加载微博,滑动过程中出现抖动。 | 通过浏览器加载微博web网页后,快速滑动时,内容会闪现未加载,然后很快能加载出来,影响滑动体验。 | 2023年6月15日 |
| I72P5E | 反复进入大图浏览界面后返回,导致libace.z.so出现内存泄露 | 从图库进入大图浏览界面后返回,ArkUI模块每次泄露10kb,在应用上点击返回后,泄露问题消失。影响可控。 | 2023年7月15日 |
| I72P5I | 反复进入某相册的图片宫格浏览界面,导致libace.z.so出现内存泄露 | 进入某相册的图片宫格浏览界面后返回,ArkUI每次泄露19kb,在应用上点击返回后,泄露问题消失。影响可控。 | 2023年7月15日 |
| I76N0Y | 反复在dock栏添加/移除应用,导致libace.z.so出现内存泄露 | 移动卡片到合法区域,ArkUI每次泄露99kb,非常用场景,应用重启可泄露问题消失。影响可控。 | 2023年7月15日 |
| I6XHE7 | NAPIRemoteObject模块内存泄露 | JS应用调用IPC需要建立NAPIRemoteObject对象进程通信,创建一次可以循环使用,建立一次后泄露1.2kb,应用不需要反复创建新对象,泄露量可控,应用进程退出会释放掉内存。 | 2023年7月15日 |
......@@ -21,6 +21,7 @@
- [时钟开发示例](time-styles-shift.md)
- [弹簧动画开发](how-to-develop-spring-animation.md)
- [水波纹动画开发](water-wave-animation.md)
- [如何使用OpenGL实现3D图形](how-to-use-opengl-to-draw-3d-graphics.md)
### 网络管理
- [如何请求并加载网络图片](how-to-load-images-from-internet.md)
......
# 如何使用OpenGL绘制3D图形
## 场景介绍
XComponent控件常用于相机预览流的显示和游戏画面的绘制,在OpenHarmony上,可以配合Native Window创建OpenGL开发环境,并最终将OpenGL绘制的图形显示到XComponent控件。本文将采用"Native C++"模板,调用OpenGL ES图形库绘制3D图形(三棱锥),并将结果渲染到页面的XComponent控件中进行展示。同时,还可以在屏幕上通过触摸滑动手势对三棱锥进行旋转,最终得到不同角度的图形并显示到页面。
## 效果展示
| 首页 | 滑动屏幕旋转变换 |
| ----------------------------------------------------- | ------------------------------------------------------- |
| ![3d-graphic-index.png](figures/3d-graphic-index.png) | ![3d-graphic-rotate.png](figures/3d-graphic-rotate.png) |
## 环境要求
- 本示例仅支持在标准系统上运行。
- IDE:DevEco Studio 3.1 Beta2
- SDK:Ohos_sdk_public 3.2.11.9 (API Version 9 Release)
## 实现思路
利用XComponent组件,并配合OpenHarmony的native侧提供的native window用来创建EGL/OpenGLES环境,进而使用标准的OpenGL ES相关API进行应用开发。其中
XComponent组件作为一种绘制组件,通常用于满足开发者较为复杂的自定义绘制需求,当XComponent设置为surface类型时通常用于EGL/OpenGLES和媒体数据写入,并将其显示在XComponent组件上。
## 开发步骤
### 1、环境搭建
我们首先要完成应用开发环境的搭建,本示例运行DAYU200开发板上。
- 搭建应用开发环境
(1)开始前,请参考完成[DevEco Studio的安装和开发环境配置](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-deveco-studio-overview-0000001263280421)
> 说明:
>
> 为确保运行效果,本案例以使用DevEco Studio 3.1 Beta2 SDK:API9 (3.2.11.9)版本为例。
![3d-graphic-creat-project.png](figures/3d-graphic-creat-project.png)
(2)开发环境配置完成后,创建工程(模板选择“Native C++”),选择eTS语言开发。
- 应用调测工程创建完成后,选择使用真机进行调测。
(1)将搭载OpenHarmony标准系统的开发板与电脑连接。
(2)点击File> Project Structure... > Project>SigningConfigs界面勾选“Automatically generate signature”,等待自动签名完成即可,最后点击“OK”。如下图所示:
![3d-graphic-creat-signature.png](figures/3d-graphic-signature.png)
(3)在编辑窗口右上角的工具栏,点击"运行"按钮运行。
![3d-graphic-run.png](figures/3d-graphic-run.png)
### 2、源码结构
- 代码结构分析,整个工程的代码结构如下:
![3d-graphic-creat-code-struct.png](figures/3d-graphic-code-struct.png)
- 文件说明如下:
```shell
.
└── main
├── cpp
│   ├── app_napi.cpp //C++与ArkTS中XComponent控件交互的napi接口实现
│   ├── CMakeLists.txt //CMake规则配置文件,NAPI C/C++代码编译需要配置该文件
│   ├── include
│   │   ├── app_napi.h
│   │   ├── tetrahedron.h //三棱锥类实现头文件
│   │   └── util
│   ├── module.cpp //NAPI模块注册
│   ├── napi_manager.cpp
│   ├── napi_util.cpp
│   ├── tetrahedron.cpp //三棱锥的绘制OpenGL实现
│   └── type
│   └── libentry
├── ets
│   ├── entryability
│   │   └── EntryAbility.ts
│   └── pages
│   └── Index.ets    //主页面
├── module.json5
└── resources    //资源文件目录
├── base
│   ├── element
│   ├── media
│   └── profile
├── en_US
│   └── element
├── rawfile
└── zh_CN
└── element
```
### 3、绘制流程
- 3D绘制函数调用流程如下:
```mermaid
graph LR
A[napi init]
B[AppNapi Export]
C[AppNapi OnSurfaceCreatedCB]
D[AppNapi OnSurfaceCreated]
E[triangles Init]
F[triangles Update]
A ----> B
B ----> C
C -- Xcomponent, window--> D
D -- Native window --> E
E ----> F
```
- 在Tetrahedron类的Update方法中使用GLES3库着色器绘制,最终通过ArkUI的XComponent组件显示,流程如下:
```mermaid
graph LR
A[glClear]
B[设置gl_Position]
C[设置gl_FragColor]
D[glDrawArrays]
A ----> B
B ----> C
C ----> D
```
### 4、C++(OpenGL)实现
C++端方法源码是工程的entry/src/main/cpp/tetrahedron.cpp文件。
- 注册模块先定义一个模块,在entry/src/main/cpp/module.cpp文件中,对应结构体类型为napi_module,模块定义好后,调用NAPI提供的模块注册函数napi_module_register(napi_module* mod)注册到系统中;
```cpp
/*
* Napi Module define
*/
static napi_module appNapiModule = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "tetrahedron_napi",
.nm_priv = ((void*)0),
.reserved = { 0 },
};
/*
* Module register function
*/
extern "C" __attribute__((constructor)) void RegisterModule(void)
{
napi_module_register(&appNapiModule);
}
```
- 调用OpenGL相关图形API绘制三棱锥
(1)初始化
```cpp
int32_t Tetrahedron::Init(void *window, int32_t width, int32_t height)
{
window_ = window;
width_ = width;
height_ = height;
LOGI("Init window = %{public}p, w = %{public}d, h = %{public}d.", window, width, height);
mEglWindow = reinterpret_cast<EGLNativeWindowType>(window);
// 1. create sharedcontext
mEGLDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (mEGLDisplay == EGL_NO_DISPLAY) {
LOGE("unable to get EGL display.");
return -1;
}
EGLint eglMajVers, eglMinVers;
if (!eglInitialize(mEGLDisplay, &eglMajVers, &eglMinVers)) {
mEGLDisplay = EGL_NO_DISPLAY;
LOGE("unable to initialize display");
return -1;
}
int version = 3;
mEGLConfig = getConfig(version, mEGLDisplay);
if (mEGLConfig == nullptr) {
LOGE("GLContextInit config ERROR");
return -1;
}
// 2. Create EGL Surface from Native Window
EGLint winAttribs[] = {EGL_GL_COLORSPACE_KHR, EGL_GL_COLORSPACE_SRGB_KHR, EGL_NONE};
if (mEglWindow) {
mEGLSurface = eglCreateWindowSurface(mEGLDisplay, mEGLConfig, mEglWindow, winAttribs);
if (mEGLSurface == nullptr) {
LOGE("eglCreateContext eglSurface is null");
return -1;
}
}
// 3. Create EGLContext from
int attrib3_list[] = {
EGL_CONTEXT_CLIENT_VERSION, 2,
EGL_NONE
};
mEGLContext = eglCreateContext(mEGLDisplay, mEGLConfig, mSharedEGLContext, attrib3_list);
if (!eglMakeCurrent(mEGLDisplay, mEGLSurface, mEGLSurface, mEGLContext)) {
LOGE("eglMakeCurrent error = %{public}d", eglGetError());
}
mProgramHandle = CreateProgram(vertexShader, fragmentShader);
if (!mProgramHandle) {
LOGE("Could not create CreateProgram");
return -1;
}
LOGI("Init success.");
return 0;
}
```
其中,顶点着色器实现如下:
```cpp
char vertexShader[] =
"attribute vec4 apos;\n"
"attribute vec4 a_color;\n"
"attribute vec4 a_normal;\n"
"uniform vec3 u_lightColor;\n"
"uniform vec3 u_lightDirection;\n"
"uniform mat4 a_mx;\n"
"uniform mat4 a_my;\n"
"varying vec4 v_color;\n"
"void main(){\n"
"float radian = radians(30.0);\n"
"float cos = cos(radian);\n"
"float sin = sin(radian);\n"
" gl_Position = a_mx * a_my * vec4(apos.x, apos.y, apos.z, 1.0);\n"
" vec3 normal = normalize((a_mx * a_my * a_normal).xyz);\n"
" float dot = max(dot(u_lightDirection, normal), 0.0);\n"
" vec3 reflectedLight = u_lightColor * a_color.rgb * dot;\n"
" v_color = vec4(reflectedLight, a_color.a);\n"
"}\n\0";
```
(2)图像渲染
​ OpenGL ES图像渲染中着色器涉及到内置变量如下,所谓内置变量就是不用声明可以直接赋值,主要是为了实现特定的功能。
| 序号 | 内置变量 | 含义 | 值数据类型 |
| --- | ------------- | ----------------- | ----- |
| 1 | gl_PointSize | 点渲染模式,方形点区域渲染像素大小 | float |
| 2 | gl_Position | 顶点位置坐标 | vec4 |
| 3 | gl_FragColor | 片元颜色值 | vec4 |
| 4 | gl_FragCoord | 片元坐标,单位像素 | vec2 |
| 5 | gl_PointCoord | 点渲染模式对应点像素坐标 | vec2 |
​ 而本次渲染涉及到两个内建变量:gl_Position和gl_FragColor;
​ 其中,gl_Position变量表示最终传入片元着色器片元化要使用的顶点位置坐标,取值范围为-1.0到1.0,点超过该范围将自动被裁剪。初始化代码如下:
```cpp
gl_Position = a_mx * a_my * vec4(apos.x, apos.y, apos.z, 1.0);
```
a_my为y轴旋转矩阵,获取到旋转角度后初始化旋转矩阵;a_mx为x轴旋转矩阵,apos为绘制多面体点矩阵;
这些值的初始化通过glUniformMatrix4fv函数实现:
```cpp
mxGL_APICALL void GL_APIENTRY glUniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat *value)
```
其中参数的含义如下:
| 序号 | 参数名 | 含义 |
| --- | --------- | ------------------------------------------------------------- |
| 1 | location | uniform对应的变量名 |
| 2 | count | 需要加载数据的数组元素的数量或者需要修改的矩阵的数量 |
| 3 | transpose | 指明矩阵是列优先(column major)矩阵(GL_FALSE)还是行优先(row major)矩阵(GL_TRUE) |
| 4 | value | 指向由count个元素的数组的指针 |
​ gl_FragColor变量用于确定图形的颜色,可通过设置不同片段着色器的颜色,实现立体效果。
        片段着色器实现如下:
```cpp
char fragmentShader[] =
"precision mediump float;\n"
"varying vec4 v_color;\n"
"void main () {\n"
" gl_FragColor = v_color;\n"
"}\n\0";
```
       三棱锥核心绘制代码如下:
```cpp
void Tetrahedron::Update(float angleX, float angleY)
{
angleY_ = angleY;
angleX_ = angleX;
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(mProgramHandle);
unsigned int aposLocation = glGetAttribLocation(mProgramHandle, "apos");
unsigned int a_color = glGetAttribLocation(mProgramHandle, "a_color");
unsigned int a_normal = glGetAttribLocation(mProgramHandle, "a_normal");
unsigned int u_lightColor = glGetUniformLocation(mProgramHandle, "u_lightColor");
unsigned int u_lightDirection = glGetUniformLocation(mProgramHandle, "u_lightDirection");
unsigned int mx = glGetUniformLocation(mProgramHandle, "a_mx");
unsigned int my = glGetUniformLocation(mProgramHandle, "a_my");
/**
y轴旋转度
**/
float radianY = angleY * PI /180.0;
float cosY = cosf(radianY);
float sinY = sinf(radianY);
float myArr[] = {
cosY,0,-sinY,0, 0,1,0,0, sinY,0,cosY,0, 0,0,0,1
};
glUniformMatrix4fv(my, 1,false, myArr);
/**
x轴旋转度
**/
float radianX = angleX * PI /180.0;
float cosX = cosf(radianX);
float sinX = sinf(radianX);
float mxArr[] = {
1,0,0,0, 0,cosX,-sinX,0, 0,sinX,cosX,0, 0,0,0,1
};
glUniformMatrix4fv(mx, 1,false, mxArr);
/**
给平行光传入颜色和方向数据,RGB(1,1,1),单位向量(x,y,z)
**/
glUniform3f(u_lightColor, 1.0, 1.0, 1.0);
// 保证向量(x,y,z)的长度为1,即单位向量
float x = 1.0/sqrt(15), y = 2.0/sqrt(15), z = 3.0/sqrt(15);
glUniform3f(u_lightDirection, x,-y,z);
/**
创建顶点位置数据数组data,原点到各顶点的距离都为1
**/
float data[] = {
-0.75, -0.50, -0.43, 0.75, -0.50, -0.43, 0.00, -0.50, 0.87,
0.75, -0.50, -0.43, 0.00, -0.50, 0.87, 0.00, 1.00, 0.00,
0.00, -0.50, 0.87, 0.00, 1.00, 0.00, -0.75, -0.50, -0.43,
0.00, 1.00, 0.00, -0.75, -0.50, -0.43, 0.75, -0.50, -0.43,
};
/**
创建顶点颜色数组colorData
**/
float colorData[] = {
1,0,0, 1,0,0, 1,0,0,//红色——面1
1,0,0, 1,0,0, 1,0,0,//红色——面2
1,0,0, 1,0,0, 1,0,0,//红色——面3
1,0,0, 1,0,0, 1,0,0 //红色——面4
};
/**
顶点法向量数组normalData
**/
float normalData[] = {
0.00, -1.00, 0.00, 0.00, -1.00, 0.00, 0.00, -1.00, 0.00,
-0.83, -0.28, -0.48, -0.83, -0.28, -0.48, -0.83, -0.28, -0.48,
-0.83, 0.28, 0.48, -0.83, 0.28, 0.48, -0.83, 0.28, 0.48,
0.00, -0.28, 0.96, 0.00, -0.28, 0.96, 0.00, -0.28, 0.96,
};
/**
创建缓冲区buffer,传入顶点位置数据data
**/
unsigned int buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
glVertexAttribPointer(aposLocation, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(aposLocation);
unsigned int normalBuffer;
glGenBuffers(1, &normalBuffer);
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(normalData), normalData, GL_STATIC_DRAW);
glVertexAttribPointer(a_normal, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(a_normal);
/**
创建缓冲区colorBuffer,传入顶点颜色数据colorData
**/
unsigned int colorBuffer;
glGenBuffers(1, &colorBuffer);
glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(colorData), colorData, GL_STATIC_DRAW);
glVertexAttribPointer(a_color, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(a_color);
/* 执行绘制命令 */
glDrawArrays(GL_TRIANGLES, 0, 12);
}
```
### 5、NAPI接口定义
接口定义为固定写法,在napi_property_descriptor desc[]中,我们需要使用DECLARE_NAPI_FUNCTION宏,以Add函数为例,将函数名字符串"Add"与具体的实现方法napi_value Add(napi_env env, napi_callback_info info)进行关联,即DECLARE_NAPI_FUNCTION("Add", Add)最终添加到desc[]。如下所示,其中UpdateAngle对应的是Native C++的接口,其应用端的接口对应为UpdateAngle,NAPI通过napi_define_properties接口将napi_property_descriptor结构体中的2个接口绑定在一起,并通过exports变量对外导出,使应用层可以调用UpdateAngle和getContext方法。
```cpp
/*
* function for module exports
*/
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports)
{
LOGE("Init");
napi_property_descriptor desc[] = {
DECLARE_NAPI_FUNCTION("getContext", NapiManager::GetContext),
DECLARE_NAPI_FUNCTION("UpdateAngle", AppNapi::UpdateAngle),
};
NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
bool ret = NapiManager::GetInstance()->Export(env, exports);
if (!ret) {
LOGE("Init failed");
}
return exports;
}
EXTERN_C_END
```
### 6、NAPI接口实现
​ Tetrahedron::UpdateAngle:传入angleX和angleY两个参数,分别为为绕X,Y轴的旋转角度;作为参数调用```Tetrahedron::UpdateAngle(float angleX, float angleY)```重新渲染,具体代码如下:
```cpp
napi_value AppNapi::UpdateAngle(napi_env env, napi_callback_info info){
LOGE("Tetrahedron UpdateAngle");
size_t requireArgc = 2;
size_t argc = 2;
int speed = 3;
napi_value args[2] = {nullptr};
napi_get_cb_info(env, info, &argc, args , nullptr, nullptr);
napi_valuetype valuetype0;
napi_typeof(env, args[0], &valuetype0);
napi_valuetype valuetype1;
napi_typeof(env, args[1], &valuetype1);
double offsetX;
napi_get_value_double(env, args[0], &offsetX);
double offsetY;
napi_get_value_double(env, args[1], &offsetY);
/* 处理offsetX偏移角度 */
float tetrahedron_angleX = tetrahedron_->GetAngleX();
float tetrahedron_angleY = tetrahedron_->GetAngleY();
/* 上下滑动绕x轴 */
if(offsetY < 0){
tetrahedron_angleX = tetrahedron_angleX + speed;
}
else{
tetrahedron_angleX = tetrahedron_angleX - speed;
}
/* 左右滑动绕y轴 */
if(offsetX < 0){
triangles_angleY = triangles_angleY + speed;
}
else{
triangles_angleY = triangles_angleY - speed;
}
tetrahedron_angleY = normalize(tetrahedron_angleY);
tetrahedron_angleX = normalize(tetrahedron_angleX);
tetrahedron_->Update(tetrahedron_angleX, tetrahedron_angleY);
/* 创建一个数组 */
napi_value ret;
napi_create_array(env, &ret);
/* 设置数组并返回 */
napi_value num;
napi_create_int32(env, tetrahedron_angleX, &num);
napi_set_element(env, ret, 0, num);
napi_create_int32(env, tetrahedron_angleY, &num);
napi_set_element(env, ret, 1, num);
return ret;
}
```
​ GetContext:得到渲染所XComponent的上下文context,以便后续绑定XComponentID渲染,具体代码如下:
```cpp
napi_value NapiManager::GetContext(napi_env env, napi_callback_info info)
{
napi_status status;
napi_value exports;
size_t argc = 1;
napi_value args[1];
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, nullptr, nullptr));
if (argc != 1) {
napi_throw_type_error(env, NULL, "Wrong number of arguments");
return nullptr;
}
napi_valuetype valuetype;
status = napi_typeof(env, args[0], &valuetype);
if (status != napi_ok) {
return nullptr;
}
if (valuetype != napi_number) {
napi_throw_type_error(env, NULL, "Wrong arguments");
return nullptr;
}
int64_t value;
NAPI_CALL(env, napi_get_value_int64(env, args[0], &value));
NAPI_CALL(env, napi_create_object(env, &exports));
switch (value) {
case int64_t(ContextType::APP_LIFECYCLE):
{
/* AppInit 对应 app.ets中的应用生命周期 onCreate, onShow, onHide, onDestroy */
LOGD("GetContext APP_LIFECYCLE");
/* Register App Lifecycle */
napi_property_descriptor desc[] = {
DECLARE_NAPI_FUNCTION("onCreate", NapiManager::NapiOnCreate),
DECLARE_NAPI_FUNCTION("onShow", NapiManager::NapiOnShow),
DECLARE_NAPI_FUNCTION("onHide", NapiManager::NapiOnHide),
DECLARE_NAPI_FUNCTION("onDestroy", NapiManager::NapiOnDestroy),
};
NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
}
break;
case int64_t(ContextType::JS_PAGE_LIFECYCLE):
{
/* JS Page */
LOGD("GetContext JS_PAGE_LIFECYCLE");
napi_property_descriptor desc[] = {
DECLARE_NAPI_FUNCTION("onPageShow", NapiManager::NapiOnPageShow),
DECLARE_NAPI_FUNCTION("onPageHide", NapiManager::NapiOnPageHide),
};
NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc));
}
break;
default:
LOGE("unknown type");
}
return exports;
}
```
​ Export:先拿到XComponentID等信息后,通过NapiManager得到context,再通过context得到处理3D绘画的appNapi类并进行相应输出处理。部分代码如下(具体请查看源码):
```cpp
bool NapiManager::Export(napi_env env, napi_value exports)
{
napi_status status;
napi_value exportInstance = nullptr;
OH_NativeXComponent *nativeXComponent = nullptr;
int32_t ret;
char idStr[OH_XCOMPONENT_ID_LEN_MAX + 1] = { };
uint64_t idSize = OH_XCOMPONENT_ID_LEN_MAX + 1;
status = napi_get_named_property(env, exports, OH_NATIVE_XCOMPONENT_OBJ, &exportInstance);
if (status != napi_ok) {
return false;
}
status = napi_unwrap(env, exportInstance, reinterpret_cast<void**>(&nativeXComponent));
if (status != napi_ok) {
return false;
}
ret = OH_NativeXComponent_GetXComponentId(nativeXComponent, idStr, &idSize);
if (ret != OH_NATIVEXCOMPONENT_RESULT_SUCCESS) {
return false;
}
std::string id(idStr);
auto context = NapiManager::GetInstance();
if (context) {
context->SetNativeXComponent(id, nativeXComponent);
auto app = context->GetApp(id);
app->SetNativeXComponent(nativeXComponent);
app->Export(env, exports);
return true;
}
return false;
}
```
### 7、ArkTS接口定义
(1)修改 index.d.ts 用于对外提供方法、说明(命名为tetrahedron_napi.d.ts)。
```ts
//传入x,y偏移量并返回x,y旋转角
export const UpdateAngle:(offsetX:number,offsetY:number)=>Array;
```
(2)在同目录下的 oh-package.json5 文件中将 tetrahedron_napi.d.ts 与cpp文件关联起来。
```json
{
"name": "libtetrahedron_napi.so",
"types": "./tetrahedron_napi.d.ts",
"version": "1.0.0",
"description": "Please describe the basic information."
}
```
(3)修改项目的oh-package.json5文件,添加动态库。
```json
{
"license": "",
"devDependencies": {
"@types/libtetrahedron_napi.so": "file:./src/main/cpp/type/libentry"
},
"author": "",
"name": "entry",
"description": "Please describe the basic information.",
"main": "",
"version": "1.0.0",
"dependencies": {}
}
```
### 8、CMake规则配置
entry/src/main/cpp/CMakeLists.txt是CMake规则文件。
`project`:用于设置项目(project)的名称。
`set(CMAKE_CXX_STANDARD 11)`:设置C++标准。
`include_directories`:用于包含头文件。
`add_library`:编译产生链接库。
`target_link_libraries`:指定链接给定目标和/或其依赖项时要使用的库或标志,在PUBLIC字段后的库会被链接到tetrahedron_napi中。
```textile
# the minimum version of CMake.
cmake_minimum_required(VERSION 3.4.1)
project(TetrahedronHap)
set(NATIVE_ROOT_PATH ${CMAKE_CURRENT_SOURCE_DIR})
include_directories(${NATIVE_ROOT_PATH}
${NATIVE_ROOT_PATH}/include
${NATIVE_ROOT_PATH}/include/util)
add_library(triangles_napi SHARED
module.cpp
app_napi.cpp
tetrahedron.cpp
napi_manager.cpp
napi_util.cpp)
target_link_libraries(tetrahedron_napi PUBLIC EGL)
target_link_libraries(tetrahedron_napi PUBLIC GLESv3)
target_link_libraries(tetrahedron_napi PUBLIC hilog_ndk.z)
target_link_libraries(tetrahedron_napi PUBLIC ace_ndk.z)
target_link_libraries(tetrahedron_napi PUBLIC ace_napi.z)
target_link_libraries(tetrahedron_napi PUBLIC libc++.a)
target_link_libraries(tetrahedron_napi PUBLIC z)
target_link_libraries(tetrahedron_napi PUBLIC uv)
target_link_libraries(tetrahedron_napi PUBLIC libace_napi.z.so)
```
### 9、ArkTS实现
界面实现部分代码如下(具体请参考源码),其中:libraryname参数对应先前设置的模块名:tetrahedron_napi
```ts
import hilog from '@ohos.hilog';
import tetrahedron_napi from 'libtetrahedron_napi.so'
@Entry
@Component
struct Index {
private xcomponentContext = null;
private xcomponentId = 'tetrahedron';
private offset_x: number = 0.000;
private offset_y: number = 0.000;
private index: number = 0;
private type_: number = 5;
private touchTypeDown: number = 0;
private touchTypeUp: number = 1;
private touchTypeMove: number = 2;
private touchTypeCancel: number = 3;
@State startVisible: Visibility = Visibility.Visible;
@State angleArray: Array<number> = new Array<number>();
private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All })
@State offsetX: number = 0
@State offsetY: number = 0
@State positionX: number = 0
@State positionY: number = 0
@State message: string = 'wu'
async aboutToAppear() {
}
build() {
Column() {
Text($r('app.string.EntryAbility_desc'))
.fontSize($r('app.float.head_font_24'))
.lineHeight($r('app.float.wh_value_33'))
.fontFamily('HarmonyHeiTi-Bold')
.fontWeight(FontWeight.Bold)
.fontColor($r('app.color.font_color_182431'))
.textOverflow({ overflow: TextOverflow.Ellipsis })
.textAlign(TextAlign.Start)
.margin({ top: $r('app.float.wh_value_13'), bottom: $r('app.float.wh_value_15') });
Text(this.angleArray[0]&this.angleArray[1]?'X轴旋转:'+this.angleArray[0].toString() +'°\nY轴旋转:'+this.angleArray[1].toString() + '°':'')
.fontSize($r('app.float.head_font_24'))
.lineHeight($r('app.float.wh_value_33'))
.fontFamily('HarmonyHeiTi-Bold')
.fontWeight(FontWeight.Bold)
.fontColor($r('app.color.font_color_182431'))
.textOverflow({ overflow: TextOverflow.Ellipsis })
.textAlign(TextAlign.Start)
.margin({ top: $r('app.float.wh_value_13'), bottom: $r('app.float.wh_value_15') });
Stack({ alignContent: Alignment.Center }) {
XComponent({ id: this.xcomponentId, type: 'surface', libraryname: 'tetrahedron_napi' })
.onLoad((context) => {
hilog.info(0x0000, 'Xcomponent', 'onLoad')
this.xcomponentContext = context;
globalThis.xcomponentContext = this.xcomponentContext;
globalThis.xcomponentId = this.xcomponentId;
globalThis.touchTypeDown = this.touchTypeDown;
globalThis.touchTypeUp = this.touchTypeUp;
globalThis.type_ = this.type_;
globalThis.index = this.index;
globalThis.touchTypeMove = this.touchTypeMove;
globalThis.touchTypeCancel = this.touchTypeCancel;
globalThis.offset_x = this.offset_x;
globalThis.offset_y = this.offset_y;
})
.width($r('app.float.wh_value_362'))
.height($r('app.float.wh_value_362'))
.key('tetrahedron')
.backgroundColor('#00000000')
.onDestroy(() => {
globalThis.flag = false;
hilog.info(0x0000, "Xcomponent", 'onDestroy')
})
}
.gesture(
PanGesture(this.panOption)
.onActionStart((event: GestureEvent) => {
console.info('onActionStart');
})
.onActionUpdate((event: GestureEvent) => {
this.angleArray = tetrahedron_napi.UpdateAngle(event.offsetX, event.offsetY);
hilog.info(0x0000, "Gesture", 'offSet:' + event.offsetX + "," + event.offsetY);
})
.onActionEnd(() => {
this.positionX = this.offsetX;
this.positionY = this.offsetY;
console.info('onActionEnd');
})
)
.width('100%')
.height('100%')
.backgroundColor('#00000000')
}
}
}
```
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册