提交 580abcf6 编写于 作者: zyjhandsome's avatar zyjhandsome 提交者: Gitee

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

Signed-off-by: zyjhandsome's avatarzyjhandsome <zyjhandsome@126.com>
# DataShare Overview
# Cross-Application Data Sharing Overview
## Function
The **DataShare** module allows an application to share its data with other applications. Currently, data can be shared only between applications on the same device.
The application data on a device, such as the Contacts, short message service (SMS), and Gallery data, always needs to be shared with other applications. However, certain data, such as the accounts and passwords, cannot be shared. Certain data, such as SMS messages, can be accessed but not modified by other applications. The **DataShare** module provides a secure and easy-to-use mechanism for sharing data of an application with other applications on the same device.
Data needs to be shared in a wealth of scenarios. For example, the Contacts, short message service (SMS), and Gallery data always needs to be shared with other applications. However, certain data, such as accounts and passwords, cannot be shared. Some data, such as SMS messages, can be queried but not modified by other applications. **DataShare** provides a secure and convenient sharing mechanism for application data.
## Basic Concepts
The data provider can directly use **DataShare** to share data with other applications without complex encapsulation. The data consumer only needs to use a set of APIs because the DataShare access mode does not vary with the data provision mode. This greatly reduces the learning time and development difficulty.
Before developing cross-application data sharing on a device, understand the following concepts:
Data can be shared across applications in either of the following ways:
- Data provider: an application that provides data and implements related services. It is also called the data producer or server.
- Using **DataShareExtensionAbility**
An extension ability is implemented in the HAP to invoke a callback. When the data consumer calls an API, the extension ability of the data provider will be automatically started to invoke the registered callback.
- Data consumer: an application that accesses the data or services provided by the data provider. It is also called the client.
You can use **DataShareExtensionAbility** when the cross-application data access involves service operations other than mere addition, deletion, modification, and query of data in databases.
- **ValuesBucket**: a set of data to be inserted. It can be one or more data records in KV pairs. In each KV pair, the key must be of the string type, and the value can be a number, a string, a Boolean value, or an unsigned integer array.
- Using Silent Access
Database access rules are configured in the HAP. When the data consumer calls an API, the system ability automatically obtains the access rules in the HAP and returns data without starting the data provider.
- **ResultSet**: a set of query results. It provides flexible modes for obtaining various data.
You can use the silent access feature when the cross-application data access involves only the operations for adding, deleting, modifying, and querying data in databases.
- **Predicates**: an object that specifies the conditions for updating, deleting, or querying data in a database.
## Basic Concepts
## Implementation
Before developing cross-application data sharing on a device, understand the following concepts:
The data provider can directly use **DataShare** to share data with other applications without complex encapsulation. The data consumer only needs to use a set of APIs to access the data, because the **DataShare** access mode does not vary with the data provisioning mode. This greatly reduces the learning time and development difficulty.
- Data provider: an application that provides data and implements related services. It is also called the producer or server.
The cross-application data sharing can be implemented in either of the following ways:
- Data consumer: an application that accesses the data or services provided by the data provider. It is also called the client.
- **DataShareExtensionAbility**
- **ValuesBucket**: a set of data to be inserted. It can be one or more data records in KV pairs. In each KV pair, the key must be of the string type, and the value can be a number, a string, a Boolean value, or an unsigned integer array.
You can implement an ExtensionAbility with a callback in the HAP. When the data consumer calls an API, the ExtensionAbility of the data provider will be automatically started to invoke the registered callback.
- **ResultSet**: a set of query results. It provides flexible modes for users to obtain various data.
This method is recommended when the cross-application data access involves service operations other than mere addition, deletion, modification, and query of data in databases.
- **Predicates**: an object that specifies the conditions for updating, deleting, or querying data in a database.
- Silent access
You can configure database access rules in the HAP. When the data consumer calls an API, the system ability automatically obtains the access rules in the HAP and returns data without starting the data provider.
This method is recommended when the cross-application data access involves only the operations for adding, deleting, modifying, and querying data in databases.
## Constraints
- **DataShare** is subject to the limitations on the database used by the data provider. For example, the supported data models, length of the keys and values, and maximum number of databases that can be accessed at a time by each application vary with the database in use.
- **DataShare** is subject to the limitations on the database used by the data provider. The supported data models, length of the keys and values, and maximum number of databases that can be accessed at a time by each application vary with the database in use.
- The payloads of **ValuesBucket**, **Predicates**, and **ResultSet** are restricted by IPC.
- The payloads of **ValuesBucket**, **Predicates**, and **ResultSet** are restricted by inter-process communication (IPC).
- Currently, **dataShare** supports development based on the stage model only.
......@@ -36,10 +36,10 @@ Each application can subscribe to common events as required. After your applicat
## How to Use
For details, see [Common Event Development](../application-dev/notification/common-event.md).
For details, see [Common Event Development](../application-dev/application-models/common-event-overview.md).
## Repositories Involved
Common Event and Notification
[**notification_ces_standard**](https://gitee.com/openharmony/notification_ces_standard)
\ No newline at end of file
**notification_ces_standard**
\ No newline at end of file
......@@ -104,7 +104,7 @@ export class AVPlayerDemo {
case 'playing': // play成功调用后触发该状态机上报
console.info('AVPlayer state playing called.');
if (this.count !== 0) {
if (this.isSeek === true) {
if (this.isSeek) {
console.info('AVPlayer start to seek.');
this.avPlayer.seek(this.avPlayer.duration); //seek到音频末尾
} else {
......
......@@ -115,7 +115,7 @@ export class AVPlayerDemo {
case 'playing': // play成功调用后触发该状态机上报
console.info('AVPlayer state playing called.');
if (this.count !== 0) {
if (this.isSeek === true) {
if (this.isSeek) {
console.info('AVPlayer start to seek.');
this.avPlayer.seek(this.avPlayer.duration); //seek到视频末尾
} else {
......
文件模式从 100755 更改为 100644
# @ohos.cooperate (键鼠穿越)
键鼠穿越功能模块,提供两台或多台设备组网协同后键鼠共享能力,实现键鼠输入设备的跨设备协同操作。
> **说明**
>
> - 本模块首批接口从API version 10开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
>
> - 本模块接口均为系统接口。
## 导入模块
```js
import cooperate from '@ohos.cooperate'
```
## cooperate.prepare
prepare(callback: AsyncCallback&lt;void&gt;): void;
准备键鼠穿越,使用AsyncCallback异步方式返回结果。
**系统能力**: SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | --------------------------- |
| callback | AsyncCallback&lt;void&gt; | 是 |回调函数,异步返回准备键鼠穿越的结果。 |
**示例**
```js
try {
cooperate.prepare((error) => {
if (error) {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Keyboard mouse crossing prepare success.`);
});
} catch (error) {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.prepare
prepare(): Promise&lt;void&gt;
准备键鼠穿越,使用Promise异步方式返回结果。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**返回值**
| 参数 | 说明 |
| ------------------- | ------------------------------- |
| Promise&lt;void&gt; | Promise对象,异步返回准备键鼠穿越的结果。 |
**示例**
```js
try {
cooperate.prepare().then(() => {
console.log(`Keyboard mouse crossing prepare success.`);
}, (error) => {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Keyboard mouse crossing prepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.unprepare
unprepare(callback: AsyncCallback&lt;void&gt;): void;
取消键鼠穿越准备,使用AsyncCallback异步方式返回结果。
**系统能力**: SystemCapability.Msdp.DeviceStatus.Cooperate
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ------------------------------------------ |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,异步返回取消准备键鼠穿越的结果。 |
**示例**
```js
try {
cooperate.unprepare((error) => {
if (error) {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Keyboard mouse crossing unprepare success.`);
});
} catch (error) {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.unprepare
unprepare(): Promise&lt;void&gt;;
取消键鼠穿越准备,使用Promise异步方式返回结果。
**系统能力**: SystemCapability.Msdp.DeviceStatus.Cooperate
**返回值**
| 参数 | 说明 |
| ------------------- | --------------------------------------------- |
| Promise&lt;void&gt; | Promise对象,异步返回取消准备键鼠穿越的结果。 |
```js
try {
cooperate.unprepare().then(() => {
console.log(`Keyboard mouse crossing unprepare success.`);
}, (error) => {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Keyboard mouse crossing unprepare failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.activate
activate(targetNetworkId: string, inputDeviceId: number, callback: AsyncCallback&lt;void&gt;): void;
启动键鼠穿越,使用AsyncCallback异步方式返回结果。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------- | ---- | ---------------------------- |
| targetNetworkId | string | 是 | 键鼠穿越目标设备描述符。 |
| inputDeviceId | number | 是 | 待穿越输入设备标识符。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,异步返回启动键鼠穿越的结果。 |
**错误码:**
以下错误码的详细介绍请参见[ohos.devicestatus错误码](../errorcodes/errorcode-devicestatus.md)
| 错误码ID | 错误信息 |
| -------- | ---------------------------------------- |
| 20900001 | 当调用键鼠穿越接口时穿越状态异常,系统会产生此错误码。 |
**示例**
```js
let targetNetworkId = "networkId";
let inputDeviceId = 0;
try {
cooperate.activate(targetNetworkId, inputDeviceId, (error) => {
if (error) {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Start Keyboard mouse crossing success.`);
});
} catch (error) {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.activate
activate(targetNetworkId: string, inputDeviceId: number): Promise&lt;void&gt;;
启动键鼠穿越,使用Promise异步方式返回结果。
**系统能力**: SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------- | ---- | ---------------------------- |
| targetNetworkId | string | 是 | 键鼠穿越目标设备描述符。 |
| inputDeviceId | number | 是 | 待穿越输入设备标识符。 |
**返回值**
| 参数名 | 说明 |
| ---------------------- | ------------------------------- |
| Promise&lt;void&gt; | Promise对象,异步返回启动键鼠穿越结果。 |
**错误码:**
以下错误码的详细介绍请参见[ohos.devicestatus错误码](../errorcodes/errorcode-devicestatus.md)
| 错误码ID | 错误信息 |
| -------- | ---------------------------------------- |
| 20900001 | 当调用键鼠穿越接口时穿越状态异常,系统会产生此错误码。 |
**示例**
```js
let targetNetworkId = "networkId";
let inputDeviceId = 0;
try {
cooperate.activate(targetNetworkId, inputDeviceId).then(() => {
console.log(`Start Keyboard mouse crossing success.`);
}, (error) => {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Start Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.deactivate
deactivate(isUnchained: boolean, callback: AsyncCallback&lt;void&gt;): void;
停止键鼠穿越,使用AsyncCallback异步方式返回结果。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------- | ---- | ---------------------------- |
| isUnchained | boolean | 是 | 是否关闭跨设备链路。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数,异步返回停止键鼠穿越的结果。 |
**示例**
```js
try {
cooperate.deactivate(false, (error) => {
if (error) {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Stop Keyboard mouse crossing success.`);
});
} catch (error) {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.deactivate
deactivate(isUnchained: boolean): Promise&lt;void&gt;;
停止键鼠穿越,使用Promise异步方式返回结果。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| ----------- | ------- | ---- | ------------------ |
| isUnchained | boolean | 是 | 是否关闭跨设备链路 |
**返回值**
| 参数名 | 说明 |
| -------- | ---------------------------- |
| Promise&lt;void&gt; | Promise对象,异步返回停止键鼠穿越结果。 |
**示例**
```js
try {
cooperate.deactivate(false).then(() => {
console.log(`Stop Keyboard mouse crossing success.`);
}, (error) => {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Stop Keyboard mouse crossing failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.getCrossingSwitchState
getCrossingSwitchState(networkId: string, callback: AsyncCallback&lt;boolean&gt;): void;
获取目标设备键鼠穿越开关的状态,使用AsyncCallback异步方式返回结果。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------- | ---- | ---------------------------- |
| networkId | string | 是 | 键鼠穿越目标设备描述符。 |
| callback | AsyncCallback&lt;boolean&gt; | 是 | 回调函数,异步返回目标设备的键鼠穿越开关状态 |
**示例**
```js
let deviceDescriptor = "networkId";
try {
cooperate.getCrossingSwitchState(deviceDescriptor, (error, data) => {
if (error) {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
return;
}
console.log(`Get the status success, data: ${JSON.stringify(data)}`);
});
} catch (error) {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## cooperate.getCrossingSwitchState
getCrossingSwitchState(networkId: string): Promise&lt;boolean&gt;;
获取目标设备键鼠穿越开关的状态,使用Promise异步方式返回结果。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------- | ---- | ---------------------------- |
| networkId | string | 是 | 键鼠穿越目标设备描述符。 |
**返回值**
| 参数 | 说明 |
| ------------------- | ------------------------------- |
| Promise&lt;boolean&gt; | Promise对象,异步返回目标设备的键鼠穿越开关状态 |
**示例**
```js
let deviceDescriptor = "networkId";
try {
cooperate.getCrossingSwitchState(deviceDescriptor).then((data) => {
console.log(`Get the status success, data: ${JSON.stringify(data)}`);
}, (error) => {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
});
} catch (error) {
console.log(`Get the status failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## on('cooperate')
on(type: 'cooperate', callback: Callback&lt;{ networkId: string, msg: CooperateMsg }&gt;): void;
注册监听键鼠穿越状态。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------- | ---- | ---------------------------- |
| type | string | 是 | 监听类型,取值为”cooperate“ |
| callback | Callback&lt;{ networkId: string, msg: [CooperateMsg](#cooperatemsg) }&gt; | 是 | 回调函数,异步返回键鼠穿越状态消息 |
**示例**
```js
try {
cooperate.on('cooperate', (data) => {
console.log(`Keyboard mouse crossing event: ${JSON.stringify(data)}`);
});
} catch (error) {
console.log(`Register failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## off('cooperate')
off(type: 'cooperate', callback?: Callback&lt;void&gt;): void;
取消监听键鼠穿越状态。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
**参数**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------- | ---- | ---------------------------- |
| type | string | 是 | 监听类型,取值为“cooperate” |
| callback | AsyncCallback&lt;void&gt; | 否 | 需要取消注册的回调函数,若无此参数,则取消当前应用注册的所有回调函数。 |
**示例**
```js
// 取消注册单个回调函数
function callback(event) {
console.log(`Keyboard mouse crossing event: ${JSON.stringify(event)}`);
return false;
}
try {
cooperate.on('cooperate', callback);
cooperate.off("cooperate", callback);
} catch (error) {
console.log(`Execute failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
```js
// 取消注册所有回调函数
function callback(event) {
console.log(`Keyboard mouse crossing event: ${JSON.stringify(event)}`);
return false;
}
try {
cooperate.on('cooperate', callback);
cooperate.off("cooperate");
} catch (error) {
console.log(`Execute failed, error: ${JSON.stringify(error, [`code`, `message`])}`);
}
```
## CooperateMsg
键鼠穿越的消息通知。
**系统能力**:SystemCapability.Msdp.DeviceStatus.Cooperate
| 名称 | 值 | 说明 |
| -------- | ----------------- | ----------------- |
| COOPERATE_PREPARE | 0 | 表示准备键鼠穿越。 |
| COOPERATE_UNPREPARE | 1 | 表示取消键鼠穿越准备。 |
| COOPERATE_ACTIVATE | 2 | 表示启动键鼠穿越。 |
| COOPERATE_ACTIVATE_SUCCESS | 3 | 表示键鼠穿越启动成功。 |
| COOPERATE_ACTIVATE_FAIL | 4 | 表示键鼠穿越启动失败。 |
| COOPERATE_DEACTIVATE_SUCCESS | 5 | 表示键鼠穿越停止成功。 |
| COOPERATE_DEACTIVATE_FAIL | 6 | 表示键鼠穿越停止失败。 |
......@@ -18,7 +18,7 @@ getAllNetworkInterfaces(admin: Want, callback: AsyncCallback&lt;Array&lt;string&
指定设备管理员应用获取所有活动的网络接口,使用callback形式返回网络接口名称数组。
**需要权限:** ohos.permission.GET_NETWORK_INFO
**需要权限:** ohos.permission.ENTERPRISE_GET_NETWORK_INFO
**系统能力:** SystemCapability.Customization.EnterpriseDeviceManager
......@@ -109,7 +109,7 @@ getIpAddress(admin: Want, networkInterface: string, callback: AsyncCallback&lt;s
指定设备管理员应用根据networkInterface获取设备IP地址,使用callback形式返回设备IP地址。
**需要权限:** ohos.permission.GET_NETWORK_INFO
**需要权限:** ohos.permission.ENTERPRISE_GET_NETWORK_INFO
**系统能力:** SystemCapability.Customization.EnterpriseDeviceManager
......@@ -288,3 +288,191 @@ networkManager.getMac(wantTemp, "eth0").then((result) => {
console.log("error code:" + error.code + " error message:" + error.message);
});
```
## networkManager.isNetworkInterfaceDisabled
isNetworkInterfaceDisabled(admin: Want, networkInterface: string, callback: AsyncCallback&lt;boolean&gt;): void
指定设备管理员应用查询指定网络接口是否被禁用,使用callback形式返回网络接口是否被禁用。
**需要权限:** ohos.permission.ENTERPRISE_GET_NETWORK_INFO
**系统能力:** SystemCapability.Customization.EnterpriseDeviceManager
**系统API**: 此接口为系统接口。
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------------------- | ---- | ------------------------------- |
| admin | [Want](js-apis-app-ability-want.md) | 是 | 设备管理员应用。 |
| networkInterface | string | 是 | 指定网络接口。 |
| callback | AsyncCallback&lt;boolean&gt; | 是 | 回调函数。当接口调用成功,err为null,data为指定网络接口是否被禁用,true表示该网络接口被禁用,false表示该网络接口未被禁用,否则err为错误对象。 |
**错误码**
以下的错误码的详细介绍请参见[企业设备管理错误码](../errorcodes/errorcode-enterpriseDeviceManager.md)
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------------------------------------------- |
| 9200001 | the application is not an administrator of the device. |
| 9200002 | the administrator application does not have permission to manage the device. |
**示例:**
```js
let wantTemp = {
bundleName: "com.example.myapplication",
abilityName: "EntryAbility",
};
networkManager.isNetworkInterfaceDisabled(wantTemp, "eth0", (error, result) => {
if (error != null) {
console.log("error code:" + error.code + " error message:" + error.message);
return;
}
console.log(result);
});
```
## networkManager.isNetworkInterfaceDisabled
isNetworkInterfaceDisabled(admin: Want, networkInterface: string): Promise&lt;boolean&gt;
指定设备管理员应用查询指定网络接口是否被禁用,使用Promise形式返回指定网络接口是否被禁用。
**需要权限:** ohos.permission.ENTERPRISE_GET_NETWORK_INFO
**系统能力:** SystemCapability.Customization.EnterpriseDeviceManager
**系统API**: 此接口为系统接口。
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ----- | ----------------------------------- | ---- | ------- |
| admin | [Want](js-apis-app-ability-want.md) | 是 | 设备管理员应用。 |
| networkInterface | string | 是 | 指定网络接口。 |
**返回值:**
| 类型 | 说明 |
| --------------------- | ------------------------- |
| Promise&lt;boolean&gt; | Promise结果,返回指定网络接口是否被禁用,true表示该网络接口被禁用,false表示该网络接口未被禁用。 |
**错误码**
以下的错误码的详细介绍请参见[企业设备管理错误码](../errorcodes/errorcode-enterpriseDeviceManager.md)
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------------------------------------------- |
| 9200001 | the application is not an administrator of the device. |
| 9200002 | the administrator application does not have permission to manage the device. |
**示例:**
```js
let wantTemp = {
bundleName: "com.example.myapplication",
abilityName: "EntryAbility",
};
networkManager.isNetworkInterfaceDisabled(wantTemp, "eth0").then((result) => {
console.log(result);
}).catch(error => {
console.log("error code:" + error.code + " error message:" + error.message);
});
```
## networkManager.setNetworkInterfaceDisabled
setNetworkInterfaceDisabled(admin: Want, networkInterface: string, isDisabled: boolean, callback: AsyncCallback&lt;void&gt;): void
指定设备管理员应用禁用指定网络接口,使用callback形式返回。
**需要权限:** ohos.permission.ENTERPRISE_SET_NETWORK
**系统能力:** SystemCapability.Customization.EnterpriseDeviceManager
**系统API**: 此接口为系统接口。
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ---------------------------------------- | ---- | ------------------------------- |
| admin | [Want](js-apis-app-ability-want.md) | 是 | 设备管理员应用。 |
| networkInterface | string | 是 | 指定网络接口。 |
| isDisabled | boolean | 是 | true表示禁用该网络接口,false表示开启该网络接口。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。当接口调用成功,err为null,否则err为错误对象。 |
**错误码**
以下的错误码的详细介绍请参见[企业设备管理错误码](../errorcodes/errorcode-enterpriseDeviceManager.md)
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------------------------------------------- |
| 9200001 | the application is not an administrator of the device. |
| 9200002 | the administrator application does not have permission to manage the device. |
**示例:**
```js
let wantTemp = {
bundleName: "com.example.myapplication",
abilityName: "EntryAbility",
};
networkManager.setNetworkInterfaceDisabled(wantTemp, "eth0", true, (error) => {
if (error != null) {
console.log("error code:" + error.code + " error message:" + error.message);
return;
}
console.log("setNetworkInterfaceDisabled success!");
});
```
## networkManager.setNetworkInterfaceDisabled
setNetworkInterfaceDisabled(admin: Want, networkInterface: string, isDisabled: boolean): Promise&lt;void&gt;
指定设备管理员应用禁用指定网络接口,使用Promise形式返回。
**需要权限:** ohos.permission.ENTERPRISE_SET_NETWORK
**系统能力:** SystemCapability.Customization.EnterpriseDeviceManager
**系统API**: 此接口为系统接口。
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ----- | ----------------------------------- | ---- | ------- |
| admin | [Want](js-apis-app-ability-want.md) | 是 | 设备管理员应用。 |
| networkInterface | string | 是 | 指定网络接口。 |
| isDisabled | boolean | 是 | true表示禁用该网络接口,false表示开启该网络接口。 |
**返回值:**
| 类型 | 说明 |
| --------------------- | ------------------------- |
| Promise&lt;void&gt; | 无返回结果的Promise对象。当禁用网络接口失败时抛出错误对象 |
**错误码**
以下的错误码的详细介绍请参见[企业设备管理错误码](../errorcodes/errorcode-enterpriseDeviceManager.md)
| 错误码ID | 错误信息 |
| ------- | ---------------------------------------------------------------------------- |
| 9200001 | the application is not an administrator of the device. |
| 9200002 | the administrator application does not have permission to manage the device. |
**示例:**
```js
let wantTemp = {
bundleName: "com.example.myapplication",
abilityName: "EntryAbility",
};
networkManager.setNetworkInterfaceDisabled(wantTemp, "eth0", true).then(() => {
console.log("setNetworkInterfaceDisabled success!");
}).catch(error => {
console.log("error code:" + error.code + " error message:" + error.message);
});
```
\ No newline at end of file
......@@ -609,6 +609,7 @@ try {
| -------- | -------- | -------- | -------- |
| pkgName | string | 是 | 指明跳转的目标包名。 |
| abilityName | string | 是 | 指明跳转的目标ability名称。 |
| uri | string<sup>10+</sup> | 否 | 指明跳转目标的uri信息。(系统接口) |
## MaxScreenWantAgent
......
......@@ -253,7 +253,7 @@ resourceManager.getResourceManager((error, mgr) => {
| 名称 | 类型 | 可读 | 可写 | 说明 |
| ------ | ------ | ---- | ---- | ------------------ |
| fd | number | 是 | 否 | rawfile的descriptor |
| fd | number | 是 | 否 | rawfile所在hap的文件描述符 |
| offset | number | 是 | 否 | rawfile的起始偏移量 |
| length | number | 是 | 否 | rawfile的文件长度 |
......@@ -2407,7 +2407,7 @@ getNumber(resId: number): number
| 类型 | 说明 |
| ------ | ---------- |
| number | 资源ID值对应的数值。Integer对应的是原数值,float对应的是真实像素点值 |
| number | 资源ID值对应的数值。Integer对应的是原数值,float对应的是真实像素点值,具体参考示例代码 |
以下错误码的详细介绍请参见[资源管理错误码](../errorcodes/errorcode-resource-manager.md)。
......@@ -2452,7 +2452,7 @@ getNumber(resource: Resource): number
| 类型 | 说明 |
| ------ | --------------- |
| number | resource对象对应的数值。Integer对应的是原数值,float对应的是真实像素点值 |
| number | resource对象对应的数值。Integer对应的是原数值,float对应的是真实像素点值, 具体参考示例代码 |
以下错误码的详细介绍请参见[资源管理错误码](../errorcodes/errorcode-resource-manager.md)。
......
......@@ -14,7 +14,7 @@
| 名称 | 参数类型 | 默认值 | 描述 |
| -------- | -------- | -------- | -------- |
| gesture | gesture:&nbsp;[GestureType](#gesturetype),<br/>mask?:&nbsp;[GestureMask](#gesturemask枚举说明) | gesture:&nbsp;-,<br/>mask:&nbsp;GestureMask.Normal | 绑定手势。<br/>- gesture:&nbsp;绑定的手势类型,&nbsp;<br>- mask:&nbsp;事件响应设置。 |
| priorityGesture | gesture:&nbsp;[GestureType](#gesturetype),<br/>mask?:&nbsp;[GestureMask](#gesturemask枚举说明) | gesture:&nbsp;-,<br/>mask:&nbsp;GestureMask.Normal | 绑定优先识别手势。<br/>- gesture:&nbsp;绑定的手势类型,&nbsp;<br>- mask:&nbsp;事件响应设置。<br/>默认情况下,子组件优先识别通过gesture绑定的手势,当父组件配置priorityGesture时,子组件优先识别priorityGesture绑定的手势。 |
| priorityGesture | gesture:&nbsp;[GestureType](#gesturetype),<br/>mask?:&nbsp;[GestureMask](#gesturemask枚举说明) | gesture:&nbsp;-,<br/>mask:&nbsp;GestureMask.Normal | 绑定优先识别手势。<br/>- gesture: 绑定的手势类型, <br/>- mask: 事件响应设置。<br/>1、默认情况下,子组件优先识别通过gesture绑定的手势,当父组件配置priorityGesture时,父组件优先识别priorityGesture绑定的手势。<br/>2、长按手势时,设置触发长按的最短时间小的组件会优先响应,会忽略priorityGesture设置。|
| parallelGesture | gesture:&nbsp;[GestureType](#gesturetype),<br/>mask?:&nbsp;[GestureMask](#gesturemask枚举说明) | gesture:&nbsp;-,<br/>mask:&nbsp;GestureMask.Normal | 绑定可与子组件手势同时触发的手势。<br/>- gesture:&nbsp;绑定的手势类型。&nbsp;<br>- mask:&nbsp;事件响应设置。<br/>手势事件为非冒泡事件。父组件设置parallelGesture时,父子组件相同的手势事件都可以触发,实现类似冒泡效果。若父子组件中同时绑定单击手势事件和双击手势事件,则只响应单击手势事件。 |
......
......@@ -375,7 +375,7 @@ The specified ability is disabled.
指定的ability被禁用。
**处理步骤**<br/>
确认指定的ability是否被禁用,可以使用[bm工具命令](../../../readme/%E5%8C%85%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F.md%23bm%E5%B7%A5%E5%85%B7%E5%91%BD%E4%BB%A4)查询对应的应用信息。
确认指定的ability是否被禁用,可以使用[bm工具命令](../../../readme/包管理子系统.md#bm工具命令)查询对应的应用信息。
## 17700030 指定的应用不支持清除缓存文件
......@@ -389,8 +389,8 @@ The specified bundle does not support clearing of cache files.
指定的应用为系统应用且在签名证书中配置了不能清除数据(AllowAppDataNotCleared)的字段。
**处理步骤**<br/>
1.确认指定的应用是否为系统应用,可以使用[bm工具命令](../../../readme/%E5%8C%85%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F.md%23bm%E5%B7%A5%E5%85%B7%E5%91%BD%E4%BB%A4)查询对应的应用信息,查看isSystemApp是否为true。
2.确认指定的应用是否配置了能清除缓存(AllowAppDataNotCleared)的字段,可以使用[bm工具命令](../../../readme/%E5%8C%85%E7%AE%A1%E7%90%86%E5%AD%90%E7%B3%BB%E7%BB%9F.md%23bm%E5%B7%A5%E5%85%B7%E5%91%BD%E4%BB%A4)查询对应的应用信息,查看userDataClearable是否为true。
1.确认指定的应用是否为系统应用,可以使用[bm工具命令](../../../readme/包管理子系统.md#bm工具命令)查询对应的应用信息,查看isSystemApp是否为true。
2.确认指定的应用是否配置了能清除缓存(AllowAppDataNotCleared)的字段,可以使用[bm工具命令](../../../readme/包管理子系统.md#bm工具命令)查询对应的应用信息,查看userDataClearable是否为true。
## 17700031 Overlay特性校验失败导致HAP安装失败
......@@ -587,4 +587,3 @@ Failed to install the HAP because the isolationMode configured is not supported.
**处理步骤**<br/>
1. 按照设备的隔离模式正确配置HAP字段isolationMode。
<!--no_check-->
\ No newline at end of file
# 键鼠穿越管理错误码
> **说明:**
>
> 以下仅介绍本模块特有错误码,通用错误码请参考[通用错误码说明文档](errorcode-universal.md)。
## 20900001 操作输入设备失败
**错误信息**
Failed to operate the input device.
**错误描述**
当调用键鼠穿越接口时穿越状态异常,系统会产生此错误码。
**可能原因**
1. 发起键鼠穿越时,本机键鼠穿越为穿出状态。
2. 关闭键鼠穿越时,本机键鼠穿越为自由态。
3. 发起关闭键鼠穿越时,本机键鼠穿越状态正在切换中。
**处理步骤**
1. 发起键鼠穿越时,请检查本机键鼠穿越状态是否为非穿出状态。
2. 关闭键鼠穿越时,请检查本机键鼠穿越状态是否为非自由态。
3. 发起关闭键鼠穿越时,请检查本机键鼠穿越状态是否在切换中。
\ No newline at end of file
......@@ -36,7 +36,7 @@ OpenHarmony通过CES(Common Event Service,公共事件服务)为应用程
## 使用说明
* [详细说明请参考: CommonEvent开发指南](../application-dev/notification/common-event.md)
* [详细说明请参考: CommonEvent开发指南](../application-dev/application-models/common-event-overview.md)
## 相关仓
......
......@@ -10,7 +10,7 @@ fd: 访问rawfile文件的文件描述符;
offset: 访问rawfile文件的偏移量,此时为0;
length: 访问rawfile文件访的大小。
length: 访问rawfile文件的大小。
**新增不解压特性后**
......@@ -18,7 +18,7 @@ fd: 访问rawfile文件所在hap的文件描述符;
offset: 访问rawfile文件相对于hap的偏移量;
length: 访问rawfile文件访的大小。
length: 访问rawfile文件的大小。
**变更影响**
......
# 资源调度子系统ChangeLog
## cl.resourceschedule.reminderAgent.1
提醒代理支持系统应用设置自定义按钮,并且自定义按钮可跳转指定应用界面。
**变更影响**
基于OpenHarmony4.0.7.1及之后的SDK版本开发的系统应用,可设置提醒自定义按钮。
**关键接口/组件变更**
| 模块名 | 类名 | 方法/属性/枚举/常量 | 变更类型 |
| -- | -- | -- | -- |
| reminderAgentManager | ActionButtonType | ACTION_BUTTON_TYPE_CUSTOM = 2 | 新增 |
| reminderAgentManager | ActionButton | wantAgent?: WantAgent | 新增 |
| reminderAgentManager | WantAgent | uri?: string | 新增 |
| reminderAgentManager | ReminderRequest | actionButton?: [ActionButton?, ActionButton?, ActionButton?] | 变更 |
**适配指导**<br>
```ts
import reminderAgentManager from '@ohos.reminderAgentManager';
let targetReminderAgent: reminderAgentManager.ReminderRequestAlarm = {
reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM, // 提醒类型为闹钟类型
...
actionButton: [
{
title: '稍后提醒',
type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_SNOOZE
},
{
title: '关闭',
type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CLOSE
},
{
title: '自定义',
type: reminderAgentManager.ActionButtonType.ACTION_BUTTON_TYPE_CUSTOM,
wantAgent: {
pkgName: "com.example.myapplication",
abilityName: "EntryAbility",
}
},
]
}
```
## cl.resourceschedule.reminderAgent.2
提醒代理支持设置通知自动消失和自动消失时间。
**变更影响**
基于OpenHarmony4.0.7.1及之后的SDK版本开发的系统应用,可设置提醒自动消失。
**关键接口/组件变更**
| 模块名 | 类名 | 方法/属性/枚举/常量 | 变更类型 |
| -- | -- | -- | -- |
| reminderAgentManager | ReminderRequest | tapDismissed?: boolean | 新增 |
| reminderAgentManager | ReminderRequest | autoDeletedTime?: number | 新增 |
**适配指导**<br>
```ts
import reminderAgentManager from '@ohos.reminderAgentManager';
let targetReminderAgent: reminderAgentManager.ReminderRequestAlarm = {
reminderType: reminderAgentManager.ReminderType.REMINDER_TYPE_ALARM, // 提醒类型为闹钟类型
...
tapDismissed: true,
autoDeletedTime: 300,
}
```
\ No newline at end of file
......@@ -13,6 +13,8 @@
- [如何为同一组件在不同场景下绑定不同的业务逻辑](different-operations-for-one-component.md)
- [如何实现列表项滑动显示快捷菜单](listitem-slide-to-display-menu.md)
- [如何在网格组件中通过拖拽交换子组件的位置](griditem-drag-and-drop.md)
- [如何实现逐帧动画](how-to-develop-frame-animation.md)
- [如何实现抽屉式导航](navigation-drawer.md)
### 网络管理
- [如何请求并加载网络图片](how-to-load-images-from-internet.md)
......
# 如何实现逐帧动画
## 场景说明
逐帧动画是常见的一种动画呈现形式,本例就为大家介绍如何通过translate(),setInterval(),clearAllInterval()等方法实现逐帧动画。
## 效果呈现
本例最终效果如下:
- 点击“run”按钮,火柴人开始走动。
- 点击“stop”按钮,火柴人停止走动。
![frameanimation](figures/frameanimation.gif)
## 运行环境
- IDE:DevEco Studio 3.1 Beta1
- SDK:Ohos_sdk_public 3.2.11.9 (API Version 9 Release)
## 实现思路
本例的实现有两个关键点:
- 将连续走动的火柴人拆分为多帧静态图像,在固定的时间间隔内逐帧将图像移动到动画窗口,间隔时间要小于肉眼可察觉的时间。循环上述动作,就可以实现火柴人的走动动画。
火柴人静态图像如下:
![man](figures/man.png)
- 将背景图片以固定速度相对于火柴人走动方向反方向移动,从而实现火柴人向前走动的效果。
背景图如下:
![background](figures/background.png)
本例使用translate()控制火柴人的移动,用backgroundImagePosition()控制背景图的移动。另外,通过setInterval()设置火柴人移动的时间间隔,通过clearAllInterval()清除移动。
## 开发步骤
1. 搭建UI框架。
使用两个Row组件分别呈现背景图和火柴人,第二个Row组件作为第一个Row组件的子组件,父Row组件的背景设置为背景图,子Row组件中添加Image组件用来呈现火柴人单帧图像。
```ts
@Entry
@Component
export default struct frameAnimation {
build() {
Column() {
// 父Row组件
Row() {
// 子Row组件
Row() {
// 通过Image组件显示火柴人图像
Image($r("app.media.man")).height(60).width(545.16)
}.width(100)
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Top)
// 截取显示与背景同等大小的区域,控制单个火柴人显示在画面中
.clip(true)
}
// 添加背景图像
.backgroundImage($r("app.media.background"))
// 保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
.backgroundImageSize(ImageSize.Cover)
.width('100%')
.height(130)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Bottom)
Row() {
// 添加跑动按钮
Button('run')
.margin({ right: 10 })
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
// 添加停止按钮
Button('stop')
.type(ButtonType.Normal)
.borderRadius(5)
.width(75)
.backgroundColor('#ff0000')
}.margin({ top: 30, bottom: 10 })
}.width('100%').width('100%').padding({ top: 30 })
}
}
```
2. 添加火柴人和背景图片的移动逻辑。
通过状态变量设定火柴人和背景图片的位置,位置变化时可以实时刷新UI界面。
```ts
// 火柴人位置变量
@State manPostion: {
x: number,
y: number
} = { x: 0, y: 0 }
// 背景图位置变量
@State treePosition: {
x: number,
y: number
} = { x: 0, y: 0 }
```
给火柴人和背景图片添加位置属性。
```ts
Row() {
Row() {
Image($r("app.media.man"))
.height(60)
.width(545.16)
// 通过translate实现火柴人的位移。绑定manPosition,用来改变火柴人位置。
.translate(this.manPostion)
}
...
}
.backgroundImage($r("app.media.background"))
.backgroundImageSize(ImageSize.Cover)
// 通过backgroundImagePosition实现背景图片的位移。绑定treePosition,用来改变背景图片的位置。
.backgroundImagePosition(this.treePosition)
...
```
3. 为''run''按钮和"stop"按钮绑定控制逻辑。
构建火柴人和背景图片移动的方法,用来设定火柴人和背景图片每次移动的距离。这里要注意火柴人每次移动的距离等于两个火柴人之间的间隔距离(像素值)。
```ts
// 火柴人移动方法
manWalk() {
if (this.manPostion.x <= -517.902) {
this.manPostion.x = 0
} else {
// 每次移动的距离为火柴人静态图像之间的间隔距离
this.manPostion.x -= 129.69
}
}
// 背景移动方法
treesMove() {
if (this.treePosition.x <= -1215) {
this.treePosition.x = 0
} else {
this.treePosition.x -= 20
}
}
```
创建doAnimation()方法调用上述两个方法,以便在后续的定时器中使用。
```ts
doAnimation() {
this.manWalk()
this.treesMove()
}
```
通过setInterval为“run”按钮绑定走动逻辑。
```ts
Button('run')
.margin({ right: 10 })
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
.onClick(() => {
this.clearAllInterval()
// 创建定时器,调用doAnimation方法,启动动画
let timer = setInterval(this.doAnimation.bind(this), 100)
this.timerList.push(timer)
})
```
通过clearAllInterval为“stop”按钮绑定停止逻辑。
```ts
Button('stop')
.type(ButtonType.Normal)
.borderRadius(5)
.width(75)
.backgroundColor('#ff0000')
.onClick(() => {
// 清理定时器,停止动画
this.clearAllInterval()
})
```
## 完整代码
本例完整代码如下:
```ts
@Entry
@Component
export default struct frameAnimation {
// 火柴人位置变量
@State manPostion: {
x: number,
y: number
} = { x: 0, y: 0 }
// 背景图位置变量
@State treePosition: {
x: number,
y: number
} = { x: 0, y: 0 }
// 定时器列表,当列表清空时,动画停止
private timerList: number[] = []
// 火柴人移动方法
manWalk() {
if (this.manPostion.x <= -517.902) {
this.manPostion.x = 0
} else {
this.manPostion.x -= 129.69
}
}
// 背景移动方法
treesMove() {
if (this.treePosition.x <= -1215) {
this.treePosition.x = 0
} else {
this.treePosition.x -= 20
}
}
// 销毁所有定时器
clearAllInterval() {
this.timerList.forEach((timer: number) => {
clearInterval(timer)
})
this.timerList = []
}
doAnimation() {
this.manWalk()
this.treesMove()
}
build() {
Column() {
// 父Row组件
Row() {
// 子Row组件
Row() {
// 通过Image组件显示火柴人图像
Image($r("app.media.man"))
.height(60)
.width(545.16)
// 通过translate实现火柴人的位移。绑定manPosition变量,用来改变火柴人位置。
.translate(this.manPostion)
}
.width(100)
.justifyContent(FlexAlign.Start)
.alignItems(VerticalAlign.Top)
// 截取显示与背景同等大小的区域,控制单个火柴人显示在画面中
.clip(true)
}
// 添加背景图像
.backgroundImage($r("app.media.background"))
// 保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。
.backgroundImageSize(ImageSize.Cover)
// 通过backgroundImagePosition实现背景图片的位移。绑定treePosition,用来改变背景图片的位置。
.backgroundImagePosition(this.treePosition)
.width('100%')
.height(130)
.justifyContent(FlexAlign.Center)
.alignItems(VerticalAlign.Bottom)
Row() {
// 添加跑动按钮
Button('run')
.margin({ right: 10 })
.type(ButtonType.Normal)
.width(75)
.borderRadius(5)
.onClick(() => {
this.clearAllInterval()
let timer = setInterval(this.doAnimation.bind(this), 100)
this.timerList.push(timer)
})
// 添加停止按钮
Button('stop')
.type(ButtonType.Normal)
.borderRadius(5)
.width(75)
.backgroundColor('#ff0000')
.onClick(() => {
this.clearAllInterval()
})
}.margin({ top: 30, bottom: 10 })
}.width('100%').width('100%').padding({ top: 30 })
}
}
```
## 参考
- [Timer (定时器)](../application-dev/reference/apis/js-apis-timer.md)
- [图形变换](../application-dev/reference/arkui-ts/ts-universal-attributes-transformation.md)
- [背景设置](../application-dev/reference/arkui-ts/ts-universal-attributes-background.md)
# 如何实现抽屉式导航
## 场景介绍
由于用户所需功能逐渐增多,传统的标签式导航在个别场景已经无法满足用户需求。当导航栏的空间放不下过多页签时,可以采用抽屉式导航,本例将为大家介绍如何通过SideBarContainer组件实现抽屉式导航。
## 效果呈现
本例最终实现效果如下:
![navigation-drawer](figures/navigation-drawer.gif)
## 运行环境
- IDE:DevEco Studio 3.1 Beta1
- SDK:Ohos_sdk_public 3.2.11.9 (API Version 9 Release)
## 实现思路
- 通过SideBarContainer组件提供容器,通过子组件定义侧边栏和内容区,第一个子组件表示侧边栏,第二个子组件表示内容区。
- 调用showSideBar属性来设置不显示侧边栏,controlButton属性来控制完成侧栏的展示/收起。
![](figures/navigation-drawer1.PNG)![](figures/navigation-drawer2.png)
## 开发步骤
1. 创建内容区域文本组件。
首先创建内容区,具体代码块如下:
```ts
...
// 内容区
Column() {
Text("内容区域")
.width("100%")
.height("100%")
.fontSize(30)
.textAlign(TextAlign.Center)
}
.width("100%")
.height("100%")
.backgroundColor("#bbaacc")
...
```
2. 通过SideBarContainer所支持的showSideBar属性来设置不显示侧边栏,controlButton属性来控制完成侧栏的展示/收起。
具体代码块如下:
```ts
...
.showSideBar(false) //默认不展示侧边栏,展示icon,用户点击调出
.controlButton({
left: 10, // 图标距离左侧宽度
top: 20, // 图标距离顶部高度
height: 30, // 图标高度
width: 30, // 图标宽度
icons: {
shown: $r('app.media.back'), // 侧边栏展示时图标
hidden: $r('app.media.sidebar_shown'), // 侧边栏收起时图标
switching: $r('app.media.sidebar_shown') // 侧边栏切换过程图标
}
})
...
```
3. 创建侧边栏文本组件。
具体代码如下:
```ts
...
struct SideBarContainerExample {
@ State navList: Array<string> = ["我的会员", "我的收藏", "我的相册", "我的文件",]
build() {
SideBarContainer(SideBarContainerType.Embed) {
// 侧边栏内容
Column() {
ForEach(this.navList, (item) => {
Text(item)
.width("100%")
.fontSize(20)
.textAlign(TextAlign.Start)
.padding({ top: 20 })
})
}
.height("100%")
.padding({ top: 60, left: 50 })
.backgroundColor("#aabbcc")
}
...
}
}
```
## 完整代码
示例完整代码如下:
```ts
@Entry
@Component
struct SideBarContainerExample {
@State navList: Array<string> = ["我的会员", "我的收藏", "我的相册", "我的文件",]
build() {
// Embed:侧边栏占据内容空间 Overlay:侧边栏悬浮于内容之上
SideBarContainer(SideBarContainerType.Embed) {
// 侧边栏内容
Column() {
ForEach(this.navList, (item) => {
Text(item)
.width("100%")
.fontSize(20)
.textAlign(TextAlign.Start)
.padding({ top: 20 })
})
}
.height("100%")
.padding({ top: 60, left: 50 })
.backgroundColor("#aabbcc")
// 内容区
Column() {
Text("内容区域")
.width("100%")
.height("100%")
.fontSize(30)
.textAlign(TextAlign.Center)
}
.width("100%")
.height("100%")
.backgroundColor("#bbaacc")
}
// 默认不展示侧边栏,展示icon,用户点击调出
.showSideBar(false)
.controlButton({
// 图标距离左侧宽度
left: 10,
// 图标距离顶部高度
top: 20,
// 图标高度
height: 30,
// 图标宽度
width: 30,
icons: {
// 侧边栏展示时图标
shown: $r('app.media.back'),
// 侧边栏收起时图标
hidden: $r('app.media.sidebar_shown'),
// 侧边栏切换过程图标
switching: $r('app.media.sidebar_shown')
}
})
// 侧边栏宽度
.sideBarWidth(200)
.width('100%')
.height('100%')
}
}
```
**注意**:模拟机与真机的预览有区别,在SideBarContainerType.Embed情况下,真机中内容区域是压缩,模拟器中内容区域是缺失。
## 总结
[Tabs组件](../application-dev/reference/arkui-ts/ts-container-tabs.md): 适用于导航栏固定在页面上下左右侧,入口分类数目不多,可以控制在5个以内,且用户需要频繁切换每一个页签的应用,比如微信、QQ等。
[Navigation组件](../application-dev/reference/arkui-ts/ts-basic-components-navigation.md): 同样可以实现Tabs组件中导航栏位于底部的场景,根据需要显示隐藏导航栏,提供标题,菜单,返回等选项,使用户是使用时更加灵活。
[sideBarContainer组件](../application-dev/reference/arkui-ts/ts-container-sidebarcontainer.md):主要的功能和内容都在一个页面里面,只是一些低频操作内容需要显示在其他页面里,可以把这些辅助功能放在抽屉栏里。屏幕较小时导航栏不占用空间。比如QQ,开发指导文档等。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册