提交 00a70482 编写于 作者: S sienna1128 提交者: Gitee

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

Signed-off-by: Nsienna1128 <lixiaoyan45@huawei.com>
......@@ -10,7 +10,7 @@
只有app/Context中的方法属于FA模型对应的Context。该模式下,应用级别的Context和Ability级别的Context都是该类型的实例,如果在应用级别的Context里面调用了Ability级别的方法,会产生错误。所以开发者需要注意Context实例所代表的实际含义。
- Stage模型
除了app/Context之外的Context都属于Stage模型,分别有application/Context、application/ApplicationContext、application/AbilityStageContext、application/ExtensionContext、application/AbilityContext、application/FormExtensionContext等Context。这些Context的介绍及使用方式将会在[Stage模型和Context详细介绍](#stage模型和context详细介绍)中进行说明。
除了app/Context之外的Context都属于Stage模型,分别有application/Context、application/ApplicationContext、application/AbilityStageContext、application/ExtensionContext、application/AbilityContext、application/FormExtensionContext等Context。这些Context的介绍及使用方式将会在[Stage模型的Context详细介绍](#stage模型的context详细介绍)中进行说明。
![contextIntroduction](figures/contextIntroduction.png)
......@@ -54,7 +54,7 @@ setDisplayOrientation(orientation: bundle.DisplayOrientation): Promise<void>;
示例:
```javascript
import featureAbility from '@ohos.ability.featureAbility'
import bundle from '../@ohos.bundle';
import bundle from '@ohos.bundle';
export default {
onCreate() {
......@@ -71,13 +71,13 @@ export default {
}
```
## Stage模型Context详细介绍
## Stage模型Context详细介绍
​ Stage模型有如下几类Context:
### application/Context
​ application/Context类型的Context是基类Context,里面提供了应用的一些基础信息:resourceManager、applicationInfo、cacheDir、area等,还有应用的一些基本方法:createBundleContext等。
​ application/Context是基类Context。里面提供了应用的一些基础信息:resourceManager、applicationInfo、cacheDir、area等,还有应用的一些基本方法:createModuleContext等。
**d.ts声明**
......
......@@ -12,20 +12,20 @@ continuationManager作为流转能力的入口,主要用于拉起系统中的
## 接口说明
| 接口名 | 接口描述 |
| ---------------------------------------------------------------------------------------------- | ----------- |
| register(callback: AsyncCallback\<number>): void | 注册流转管理服务,并获取对应的注册token,无过滤条件(AsyncCallback)。 |
| register(options: ContinuationExtraParams, callback: AsyncCallback\<number>): void | 注册流转管理服务,并获取对应的注册token(AsyncCallback)。 |
| register(options?: ContinuationExtraParams): Promise\<number> | 连接流转管理服务,并获取对应的注册token(Promise)。 |
| registerContinuation(callback: AsyncCallback\<number>): void | 注册流转管理服务,并获取对应的注册token,无过滤条件(AsyncCallback)。 |
| registerContinuation(options: ContinuationExtraParams, callback: AsyncCallback\<number>): void | 注册流转管理服务,并获取对应的注册token(AsyncCallback)。 |
| registerContinuation(options?: ContinuationExtraParams): Promise\<number> | 连接流转管理服务,并获取对应的注册token(Promise)。 |
| on(type: "deviceConnect", token: number, callback: Callback\<Array\<ContinuationResult>>): void | 监听设备连接状态(Callback)。 |
| on(type: "deviceDisconnect", token: number, callback: Callback\<Array\<string>>): void | 监听设备断开状态(Callback)。 |
| off(type: "deviceConnect", token: number): void | 取消监听设备连接状态。 |
| off(type: "deviceDisconnect", token: number): void | 取消监听设备断开状态。 |
| startDeviceManager(token: number, callback: AsyncCallback\<void>): void | 拉起设备选择模块,可显示组网内可选择设备列表信息,无过滤条件(AsyncCallback)。 |
| startDeviceManager(token: number, options: ContinuationExtraParams, callback: AsyncCallback\<void>): void | 拉起设备选择模块,可显示组网内可选择设备列表信息(AsyncCallback)。 |
| startDeviceManager(token: number, options?: ContinuationExtraParams): Promise\<void> | 拉起设备选择模块,可显示组网内可选择设备列表信息(Promise)。 |
| updateConnectStatus(token: number, deviceId: string, status: DeviceConnectState, callback: AsyncCallback\<void>): void | 通知设备选择模块,更新当前的流转状态(AsyncCallback)。 |
| updateConnectStatus(token: number, deviceId: string, status: DeviceConnectState): Promise\<void> | 通知设备选择模块,更新当前的流转状态(Promise)。 |
| unregister(token: number, callback: AsyncCallback\<void>): void | 取消注册流转管理服务,传入注册时获取的token进行取消注册(AsyncCallback)。 |
| unregister(token: number): Promise\<void> | 取消注册流转管理服务,传入注册时获取的token进行取消注册(Promise)。 |
| startContinuationDeviceManager(token: number, callback: AsyncCallback\<void>): void | 拉起设备选择模块,可显示组网内可选择设备列表信息,无过滤条件(AsyncCallback)。 |
| startContinuationDeviceManager(token: number, options: ContinuationExtraParams, callback: AsyncCallback\<void>): void | 拉起设备选择模块,可显示组网内可选择设备列表信息(AsyncCallback)。 |
| startContinuationDeviceManager(token: number, options?: ContinuationExtraParams): Promise\<void> | 拉起设备选择模块,可显示组网内可选择设备列表信息(Promise)。 |
| updateContinuationState(token: number, deviceId: string, status: DeviceConnectState, callback: AsyncCallback\<void>): void | 通知设备选择模块,更新当前的流转状态(AsyncCallback)。 |
| updateContinuationState(token: number, deviceId: string, status: DeviceConnectState): Promise\<void> | 通知设备选择模块,更新当前的流转状态(Promise)。 |
| unregisterContinuation(token: number, callback: AsyncCallback\<void>): void | 取消注册流转管理服务,传入注册时获取的token进行取消注册(AsyncCallback)。 |
| unregisterContinuation(token: number): Promise\<void> | 取消注册流转管理服务,传入注册时获取的token进行取消注册(Promise)。 |
## 开发步骤
1. 导入continuationManager模块。
......@@ -138,13 +138,16 @@ continuationManager作为流转能力的入口,主要用于拉起系统中的
```ts
let token: number = -1; // 用于保存注册成功并返回的token,后续使用其完成监听设备连接/断开状态、拉起设备选择模块以及更新流转状态的动作
continuationManager.register().then((data) => {
console.info('register finished, ' + JSON.stringify(data));
token = data; // 获取到对应的注册token,并赋值给token变量
}).catch((err) => {
console.error('register failed, cause: ' + JSON.stringify(err));
});
try {
continuationManager.registerContinuation().then((data) => {
console.info('registerContinuation finished, ' + JSON.stringify(data));
token = data; // 获取到对应的注册token,并赋值给token变量
}).catch((err) => {
console.error('registerContinuation failed, cause: ' + JSON.stringify(err));
});
} catch (err) {
console.error('registerContinuation failed, cause: ' + JSON.stringify(err));
}
```
4. 监听设备状态。
......@@ -154,28 +157,32 @@ continuationManager作为流转能力的入口,主要用于拉起系统中的
```ts
let remoteDeviceId: string = ""; // 用于保存用户选择的远端设备信息,后续使用其完成跨端迁移或多端协同操作
// 参数token为注册token
continuationManager.on("deviceConnect", token, (continuationResults) => {
console.info('registerDeviceConnectCallback len: ' + continuationResults.length);
if (continuationResults.length <= 0) {
console.info('no selected device');
return;
}
remoteDeviceId = continuationResults[0].id; // 将选择的第一个远端设备deviceId赋值给remoteDeviceId变量
// 将remoteDeviceId参数传给want
let want = {
deviceId: remoteDeviceId,
bundleName: 'ohos.samples.continuationmanager',
abilityName: 'MainAbility'
};
// 发起多端协同操作,需申请ohos.permission.DISTRIBUTED_DATASYNC权限
globalThis.abilityContext.startAbility(want).then((data) => {
console.info('StartRemoteAbility finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('StartRemoteAbility failed, cause: ' + JSON.stringify(err));
try {
// 参数token为注册token
continuationManager.on("deviceConnect", token, (continuationResults) => {
console.info('registerDeviceConnectCallback len: ' + continuationResults.length);
if (continuationResults.length <= 0) {
console.info('no selected device');
return;
}
remoteDeviceId = continuationResults[0].id; // 将选择的第一个远端设备deviceId赋值给remoteDeviceId变量
// 将remoteDeviceId参数传给want
let want = {
deviceId: remoteDeviceId,
bundleName: 'ohos.samples.continuationmanager',
abilityName: 'MainAbility'
};
// 发起多端协同操作,需申请ohos.permission.DISTRIBUTED_DATASYNC权限
globalThis.abilityContext.startAbility(want).then((data) => {
console.info('StartRemoteAbility finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('StartRemoteAbility failed, cause: ' + JSON.stringify(err));
});
});
});
} catch (err) {
console.error('on failed, cause: ' + JSON.stringify(err));
}
```
上述多端协同操作为Stage平台的跨设备拉起,FA平台详情见[PageAbility开发指导](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/fa-pageability.md)
......@@ -187,35 +194,43 @@ continuationManager作为流转能力的入口,主要用于拉起系统中的
let deviceConnectStatus: continuationManager.DeviceConnectState = continuationManager.DeviceConnectState.CONNECTED;
// 参数token为注册token,参数remoteDeviceId为获取到的remoteDeviceId
continuationManager.updateConnectStatus(token, remoteDeviceId, deviceConnectStatus).then((data) => {
console.info('updateConnectStatus finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('updateConnectStatus failed, cause: ' + JSON.stringify(err));
});
try {
continuationManager.updateContinuationState(token, remoteDeviceId, deviceConnectStatus).then((data) => {
console.info('updateContinuationState finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('updateContinuationState failed, cause: ' + JSON.stringify(err));
});
} catch (err) {
console.error('updateContinuationState failed, cause: ' + JSON.stringify(err));
}
```
监听设备断开状态,方便用户终止跨端迁移或多端协同操作,代码示例如下:
```ts
// 参数token为注册token
continuationManager.on("deviceDisconnect", token, (deviceIds) => {
console.info('onDeviceDisconnect len: ' + deviceIds.length);
if (deviceIds.length <= 0) {
console.info('no unselected device');
return;
}
try {
// 参数token为注册token
continuationManager.on("deviceDisconnect", token, (deviceIds) => {
console.info('onDeviceDisconnect len: ' + deviceIds.length);
if (deviceIds.length <= 0) {
console.info('no unselected device');
return;
}
// 更新设备流转状态
let unselectedDeviceId: string = deviceIds[0]; // 将取消选择的第一个远端设备deviceId赋值给unselectedDeviceId变量
let deviceConnectStatus: continuationManager.DeviceConnectState = continuationManager.DeviceConnectState.DISCONNECTING; // 设备断开状态
// 更新设备流转状态
let unselectedDeviceId: string = deviceIds[0]; // 将取消选择的第一个远端设备deviceId赋值给unselectedDeviceId变量
let deviceConnectStatus: continuationManager.DeviceConnectState = continuationManager.DeviceConnectState.DISCONNECTING; // 设备断开状态
// 参数token为注册token,参数unselectedDeviceId为获取到的unselectedDeviceId
continuationManager.updateConnectStatus(token, unselectedDeviceId, deviceConnectStatus).then((data) => {
console.info('updateConnectStatus finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('updateConnectStatus failed, cause: ' + JSON.stringify(err));
// 参数token为注册token,参数unselectedDeviceId为获取到的unselectedDeviceId
continuationManager.updateContinuationState(token, unselectedDeviceId, deviceConnectStatus).then((data) => {
console.info('updateContinuationState finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('updateContinuationState failed, cause: ' + JSON.stringify(err));
});
});
});
} catch (err) {
console.error('updateContinuationState failed, cause: ' + JSON.stringify(err));
}
```
5. 拉起设备选择模块,可显示组网内可选择设备列表信息,供用户选择。
......@@ -229,12 +244,16 @@ continuationManager作为流转能力的入口,主要用于拉起系统中的
continuationMode: continuationManager.ContinuationMode.COLLABORATION_SINGLE // 设备选择模块单选模式
};
// 参数token为注册token
continuationManager.startDeviceManager(token, continuationExtraParams).then((data) => {
console.info('startDeviceManager finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('startDeviceManager failed, cause: ' + JSON.stringify(err));
});
try {
// 参数token为注册token
continuationManager.startContinuationDeviceManager(token, continuationExtraParams).then((data) => {
console.info('startContinuationDeviceManager finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('startContinuationDeviceManager failed, cause: ' + JSON.stringify(err));
});
} catch (err) {
console.error('startContinuationDeviceManager failed, cause: ' + JSON.stringify(err));
}
```
6. 当用户不打算再进行跨端迁移或多端协同操作时,可以传入注册时获取的token进行取消注册。
......@@ -242,10 +261,14 @@ continuationManager作为流转能力的入口,主要用于拉起系统中的
取消注册流转管理服务的代码示例如下:
```ts
// 参数token为注册token
continuationManager.unregister(token).then((data) => {
console.info('unregister finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('unregister failed, cause: ' + JSON.stringify(err));
});
try {
// 参数token为注册token
continuationManager.unregisterContinuation(token).then((data) => {
console.info('unregisterContinuation finished, ' + JSON.stringify(data));
}).catch((err) => {
console.error('unregisterContinuation failed, cause: ' + JSON.stringify(err));
});
} catch (err) {
console.error('unregisterContinuation failed, cause: ' + JSON.stringify(err));
}
```
\ No newline at end of file
......@@ -12,9 +12,9 @@ Ability支持单实例、多实例和指定实例3种启动模式,在module.js
| 启动模式 | 描述 |说明 |
| ----------- | ------- |---------------- |
| standard | 多实例 | 每次startAbility都会启动一个新的实例 |
| singleton | 单实例 | 系统中只存在唯一一个实例,startAbility时,如果已存在,则复用系统中的唯一一个实例 |
| specified | 指定实例 | 运行时由Ability内部业务决定是否创建多实例 |
| standard | 标准模式 | 每次startAbility都会启动一个新的实例。 |
| singleton | 单实例模式 | 系统中只存在唯一一个实例,startAbility时,如果已存在,则复用系统中的唯一一个实例。 |
| specified | 指定实例 | 运行时由Ability内部业务决定是否创建多实例 |
缺省情况下是singleton模式,module.json5示例如下:
```json
......
......@@ -60,7 +60,7 @@
+ **Standard**:每次startAbility调用,都会在应用进程中创建一个该类型的实例,如下图Ability2的两个实例;
+ **Specified**:允许开发者在系统创建AbilityRecord之前,为该实例创建一个key,后续每次创建该类型的Ability实例都会询问应用使用哪个key对应的Ability实例,来响应startAbility请求,如下图Ability3。
+ **Specified**:允许开发者在系统创建Ability实例之前,为该实例创建一个key,后续每次创建该类型的Ability实例都会询问应用使用哪个key对应的Ability实例,来响应startAbility请求,如下图Ability3。
​ 每个Ability实例都对应了一个Launcher Recent中看到的Mission(任务)。
......
......@@ -16,17 +16,17 @@ import ElementName from '@ohos.bundle';
import image from '@ohos.multimedia.image';
import missionManager from '@ohos.application.missionManager';
missionManager.getMissionInfos("", 10, (error, missions) => {
console.log("getMissionInfos is called, error.code = " + error.code);
console.log("size = " + missions.length);
console.log("missions = " + JSON.stringify(missions));
var id = missions[0].missionId;
missionManager.getMissionSnapShot("", id, (error, snapshot) => {
console.log("getMissionSnapShot is called, error.code = " + error.code);
console.log("bundleName = " + snapshot.ability.bundleName);
})
missionManager.getMissionInfos("", 10, (error, missions) => {
console.log("getMissionInfos is called, error.code = " + error.code);
console.log("size = " + missions.length);
console.log("missions = " + JSON.stringify(missions));
var id = missions[0].missionId;
missionManager.getMissionSnapShot("", id, (error, snapshot) => {
console.log("getMissionSnapShot is called, error.code = " + error.code);
console.log("bundleName = " + snapshot.ability.bundleName);
})
})
```
## MissionSnapshot
......
......@@ -52,7 +52,7 @@ onAcceptWant(want: Want): string;
| 类型 | 说明 |
| -------- | -------- |
| string | 用户返回一个ability标识,如果之前启动过标识的ability,不创建新的实例并拉回栈顶,否则创建新的实例并启动。 |
| string | 用户返回一个ability标识,如果之前启动过标识的ability,不创建新的实例并拉回栈顶,否则创建新的实例并启动。 |
**示例:**
......
# 分布式任务管理
分布式任务管理模块提供跨设备系统任务管理能力,包括注册系统任务状态监听、取消系统任务状态监听、开始同步远端任务列表、停止同步远端任务列表操作。
分布式任务管理模块提供跨设备系统任务管理能力,包括注册系统任务状态监听、取消系统任务状态监听、开始同步远端任务列表、停止同步远端任务列表、迁移任务操作。
> **说明:**
>
......@@ -48,16 +48,23 @@ registerMissionListener(parameter: MissionDeviceInfo, options: MissionCallback,
console.log('NotifyNetDisconnect state ' + JSON.stringify(state));
}
var parameter = {
deviceId: remoteDeviceId
deviceId: remoteDeviceId
};
var options = {
notifyMissionsChanged: NotifyMissionsChanged,
notifySnapshot: NotifySnapshot,
notifyNetDisconnect: NotifyNetDisconnect
}
distributedMissionManager.registerMissionListener(parameter, options, (error) => {
console.log("error.code = " + error.code)
})
try {
distributedMissionManager.registerMissionListener(parameter, options, (error) => {
if (error.code != 0) {
console.error('registerMissionListener failed, cause: ' + JSON.stringify(error))
}
console.info('registerMissionListener finished')
})
} catch (error) {
console.error('registerMissionListener failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.registerMissionListener
......@@ -97,19 +104,23 @@ registerMissionListener(parameter: MissionDeviceInfo, options: MissionCallback):
console.log('NotifyNetDisconnect state ' + JSON.stringify(state));
}
var parameter = {
deviceId: remoteDeviceId
deviceId: remoteDeviceId
};
var options = {
notifyMissionsChanged: NotifyMissionsChanged,
notifySnapshot: NotifySnapshot,
notifyNetDisconnect: NotifyNetDisconnect
}
distributedMissionManager.registerMissionListener(parameter, options)
.then(data => {
console.info('success data is ' + data);
}).catch(error => {
console.info('error error is ' + error);
})
try {
distributedMissionManager.registerMissionListener(parameter, options)
.then(data => {
console.info('registerMissionListener finished, ' + JSON.stringify(data));
}).catch(error => {
console.error('registerMissionListener failed, cause: ' + JSON.stringify(error));
})
} catch (error) {
console.error('registerMissionListener failed, cause: ' + JSON.stringify(error))
}
```
......@@ -134,11 +145,18 @@ unRegisterMissionListener(parameter: MissionDeviceInfo, callback: AsyncCallback&
```ts
var parameter = {
deviceId: remoteDeviceId
deviceId: remoteDeviceId
};
distributedMissionManager.unRegisterMissionListener(parameter, (error) => {
console.log("error.code = " + error.code)
})
try {
distributedMissionManager.unRegisterMissionListener(parameter, (error) => {
if (error.code != 0) {
console.error('unRegisterMissionListener failed, cause: ' + JSON.stringify(error))
}
console.info('unRegisterMissionListener finished')
})
} catch (error) {
console.error('unRegisterMissionListener failed, cause: ' + JSON.stringify(error))
}
```
......@@ -168,14 +186,18 @@ unRegisterMissionListener(parameter: MissionDeviceInfo): Promise&lt;void&gt;
```ts
var parameter = {
deviceId: remoteDeviceId
deviceId: remoteDeviceId
};
distributedMissionManager.unRegisterMissionListener(parameter)
.then(data => {
console.info('success data is ' + data);
}).catch(error => {
console.info('error error is ' + error);
})
try {
distributedMissionManager.unRegisterMissionListener(parameter)
.then(data => {
console.info('unRegisterMissionListener finished, ' + JSON.stringify(data));
}).catch(error => {
console.error('unRegisterMissionListener failed, cause: ' + JSON.stringify(error));
})
} catch (error) {
console.error('unRegisterMissionListener failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.startSyncRemoteMissions
......@@ -199,13 +221,20 @@ startSyncRemoteMissions(parameter: MissionParameter, callback: AsyncCallback&lt;
```ts
var parameter = {
deviceId: remoteDeviceId,
deviceId: remoteDeviceId,
fixConflict: false,
tag: 0
};
distributedMissionManager.startSyncRemoteMissions(parameter, (error) => {
console.log("error.code = " + error.code)
})
try {
distributedMissionManager.startSyncRemoteMissions(parameter, (error) => {
if (error.code != 0) {
console.error('startSyncRemoteMissions failed, cause: ' + JSON.stringify(error))
}
console.info('startSyncRemoteMissions finished')
})
} catch (error) {
console.error('startSyncRemoteMissions failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.startSyncRemoteMissions
......@@ -234,16 +263,20 @@ startSyncRemoteMissions(parameter: MissionParameter): Promise&lt;void&gt;
```ts
var parameter = {
deviceId: remoteDeviceId,
deviceId: remoteDeviceId,
fixConflict: false,
tag: 0
};
distributedMissionManager.startSyncRemoteMissions(parameter)
.then(data => {
console.info('success data is ' + data);
}).catch(error => {
console.info('error error is ' + error);
})
try {
distributedMissionManager.startSyncRemoteMissions(parameter)
.then(data => {
console.info('startSyncRemoteMissions finished, ' + JSON.stringify(data));
}).catch(error => {
console.error('startSyncRemoteMissions failed, cause: ' + JSON.stringify(error));
})
} catch (error) {
console.error('startSyncRemoteMissions failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.stopSyncRemoteMissions
......@@ -267,11 +300,18 @@ stopSyncRemoteMissions(parameter: MissionDeviceInfo, callback: AsyncCallback&lt;
```ts
var parameter = {
deviceId: remoteDeviceId
deviceId: remoteDeviceId
};
distributedMissionManager.stopSyncRemoteMissions(parameter, (error) => {
console.log("error.code = " + error.code)
})
try {
distributedMissionManager.stopSyncRemoteMissions(parameter, (error) => {
if (error.code != 0) {
console.error('stopSyncRemoteMissions failed, cause: ' + JSON.stringify(error))
}
console.info('stopSyncRemoteMissions finished')
})
} catch (error) {
console.error('stopSyncRemoteMissions failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.stopSyncRemoteMissions
......@@ -300,14 +340,113 @@ stopSyncRemoteMissions(parameter: MissionDeviceInfo): Promise&lt;void&gt;
```ts
var parameter = {
deviceId: remoteDeviceId
deviceId: remoteDeviceId
};
try {
distributedMissionManager.stopSyncRemoteMissions(parameter)
.then(data => {
console.info('stopSyncRemoteMissions finished, ' + JSON.stringify(data));
}).catch(error => {
console.error('stopSyncRemoteMissions failed, cause: ' + JSON.stringify(error));
})
} catch (error) {
console.error('stopSyncRemoteMissions failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.continueMission
continueMission(parameter: ContinueDeviceInfo, options: ContinueCallback, callback: AsyncCallback&lt;void&gt;): void;
迁移任务,以回调函数的方式返回。
**需要权限**:ohos.permission.MANAGE_MISSIONS, ohos.permission.DISTRIBUTED_DATASYNC
**系统能力**:SystemCapability.Ability.AbilityRuntime.Mission
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | --------------------------------------- | ---- | ----- |
| parameter | [ContinueDeviceInfo](#continuedeviceinfo) | 是 | 迁移信息。 |
| options | [ContinueCallback](#continuecallback) | 是 | 迁移任务完成回调函数。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 执行结果回调函数。 |
**示例:**
```ts
var parameter = {
srcDeviceId: localDeviceId
dstDeviceId: remoteDeviceId
missionId: remoteMissionId
wantParams: {"key": "value"}
};
function OnContinueDone(resultCode) {
console.log('OnContinueDone resultCode: ' + JSON.stringify(resultCode));
};
var options = {
OnContinueDone: OnContinueDone
};
try {
distributedMissionManager.continueMission(parameter, options, (error) => {
if (error.code != 0) {
console.error('continueMission failed, cause: ' + JSON.stringify(error))
}
console.info('continueMission finished')
})
} catch (error) {
console.error('continueMission failed, cause: ' + JSON.stringify(error))
}
```
## distributedMissionManager.continueMission
continueMission(parameter: ContinueDeviceInfo, options: ContinueCallback): Promise&lt;void&gt;
迁移任务,以promise方式返回执行结果。
**需要权限**:ohos.permission.MANAGE_MISSIONS, ohos.permission.DISTRIBUTED_DATASYNC
**系统能力**:SystemCapability.Ability.AbilityRuntime.Mission
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | --------------------------------------- | ---- | ----- |
| parameter | [ContinueDeviceInfo](#continuedeviceinfo) | 是 | 迁移信息。 |
| options | [ContinueCallback](#continuecallback) | 是 | 迁移任务完成回调函数。 |
**返回值:**
| 类型 | 说明 |
| ------------------- | ---------------- |
| Promise&lt;void&gt; | promise方式返回执行结果。 |
**示例:**
```ts
var parameter = {
srcDeviceId: localDeviceId
dstDeviceId: remoteDeviceId
missionId: remoteMissionId
wantParams: {"key": "value"}
};
function OnContinueDone(resultCode) {
console.log('OnContinueDone resultCode: ' + JSON.stringify(resultCode));
};
var options = {
OnContinueDone: OnContinueDone
};
distributedMissionManager.stopSyncRemoteMissions(parameter)
.then(data => {
console.info('success data is ' + data);
}).catch(error => {
console.info('error error is ' + error);
})
try {
distributedMissionManager.continueMission(parameter, options)
.then(data => {
console.info('continueMission finished, ' + JSON.stringify(data));
}).catch(error => {
console.error('continueMission failed, cause: ' + JSON.stringify(error));
})
} catch (error) {
console.error('continueMission failed, cause: ' + JSON.stringify(error))
}
```
## MissionCallback
......@@ -348,4 +487,31 @@ stopSyncRemoteMissions(parameter: MissionDeviceInfo): Promise&lt;void&gt;
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | ------ | ---- | ---- | ------- |
| deviceId | string | 是 | 是 | 表示设备ID。 |
\ No newline at end of file
| deviceId | string | 是 | 是 | 表示设备ID。 |
## ContinueDeviceInfo
表示发起任务迁移时所需参数的枚举。
**需要权限**:ohos.permission.MANAGE_MISSIONS
**系统能力**:SystemCapability.Ability.AbilityRuntime.Mission
| 名称 | 参数类型 | 可读 | 可写 | 说明 |
| -------- | ------ | ---- | ---- | ------- |
| srcDeviceId | string | 是 | 是 | 表示任务迁移源设备ID。 |
| dstDeviceId | string | 是 | 是 | 表示任务迁移目标设备ID。 |
| missionId | string | 是 | 是 | 表示任务ID。 |
| wantParams | {[key: string]: any} | 是 | 是 | 表示扩展参数。 |
## ContinueCallback
表示迁移完成后,返回迁移结果回调函数。
**需要权限**:ohos.permission.MANAGE_MISSIONS
**系统能力**:SystemCapability.Ability.AbilityRuntime.Mission
| 名称 | 类型 | 可读 | 可写 | 说明 |
| --------------------- | -------- | ---- | ---- | ------------------ |
| onContinueDone | function | 是 | 否 | 通知迁移完成,返回迁移结果。 |
\ No newline at end of file
......@@ -51,18 +51,17 @@ show(options?: ShowNotificationOptions): void
**示例:**
```javascript
export default {
show() {
notification.show({
contentTitle: 'title info',
contentText: 'text',
clickAction: {
bundleName: 'com.example.testapp',
abilityName: 'notificationDemo',
uri: '/path/to/notification',
},
});
},
export default {
show() {
notification.show({
contentTitle: 'title info',
contentText: 'text',
clickAction: {
bundleName: 'com.example.testapp',
abilityName: 'notificationDemo',
uri: '/path/to/notification',
},
});
},
}
;
```
\ No newline at end of file
......@@ -13,11 +13,11 @@ vibrator模块提供控制马达振动的能力,如通过接口控制马达启
import vibrator from '@ohos.vibrator';
```
## vibrator.vibrate
## vibrator.startVibration<sup>9+</sup>
vibrate(duration: number): Promise&lt;void&gt;
startVibration(effect: VibrateEffect, attribute: VibrateAttribute, callback: AsyncCallback&lt;void&gt;): void
按照指定持续时间触发马达振动。
按照指定振动效果和振动属性触发马达振动。
**需要权限**:ohos.permission.VIBRATE
......@@ -25,29 +25,37 @@ vibrate(duration: number): Promise&lt;void&gt;
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------ | ---- | ---------------------- |
| duration | number | 是 | 马达振动时长, 单位ms。 |
**返回值:**
| 类型 | 说明 |
| ------------------- | -------------------------------------- |
| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
| 参数名 | 类型 | 必填 | 说明 |
| --------- | -------------------------------------- | ---- | :--------------------------------------------------------- |
| effect | [VibrateEffect](#vibrateeffect9) | 是 | 马达振动效果。 |
| attribute | [VibrateAttribute](#vibrateattribute9) | 是 | 马达振动属性。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。当马达振动成功,err为undefined,否则为错误对象。 |
**示例:**
示例:
```js
vibrator.vibrate(1000).then(()=>{
console.log("Promise returned to indicate a successful vibration.");
}, (error)=>{
console.log("error.code"+error.code+"error.message"+error.message);
});
```
```js
try {
vibrator.startVibration({
type:'time',
duration:1000,
},{
id:0,
usage: 'alarm'
}, (error)=>{
if(error){
console.log('vibrate fail, error.code: ' + error.code + 'error.message: ', + error.message);
}else{
console.log('Callback returned to indicate a successful vibration.');
}
});
} catch(err) {
console.info('errCode: ' + err.code + ' ,msg: ' + err.message);
}
```
## vibrator.vibrate<sup>9+</sup>
## vibrator.startVibration<sup>9+</sup>
vibrate(effect: VibrateEffect, attribute: VibrateAttribute): Promise&lt;void&gt;
startVibration(effect: VibrateEffect, attribute: VibrateAttribute): Promise&lt;void&gt;
按照指定振动效果和振动属性触发马达振动。
......@@ -55,10 +63,10 @@ vibrate(effect: VibrateEffect, attribute: VibrateAttribute): Promise&lt;void&gt;
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | -------------------------------------- | ---- | :------------- |
| --------- | -------------------------------------- | ---- | -------------- |
| effect | [VibrateEffect](#vibrateeffect9) | 是 | 马达振动效果。 |
| attribute | [VibrateAttribute](#vibrateattribute9) | 是 | 马达振动属性。 |
......@@ -70,146 +78,60 @@ vibrate(effect: VibrateEffect, attribute: VibrateAttribute): Promise&lt;void&gt;
**示例:**
```js
vibrator.vibrate({
```js
try {
vibrator.startVibration({
type: 'time',
duration: 1000
}, {
id: 0,
usage: 'alarm'
}).then(()=>{
console.log("Promise returned to indicate a successful vibration");
}).catch((error)=>{
console.log("error.code" + error.code + "error.message" + error.message);
})
```
## vibrator.vibrate
vibrate(duration: number, callback?: AsyncCallback&lt;void&gt;): void
按照指定持续时间触发马达振动。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ---------------------------------------------------------- |
| duration | number | 是 | 马达振动时长, 单位ms。 |
| callback | AsyncCallback&lt;void&gt; | 否 | 回调函数。当马达振动成功,err为undefined,否则为错误对象。 |
**示例:**
```js
vibrator.vibrate(1000,function(error){
if(error){
console.log("error.code" + error.code + "error.message" + error.message);
}else{
console.log("Callback returned to indicate a successful vibration.");
}
})
}, {
id: 0,
usage: 'alarm'
}).then(()=>{
console.log('Promise returned to indicate a successful vibration');
}).catch((error)=>{
console.log('error.code' + error.code + 'error.message' + error.message);
})
} catch(err) {
console.info('errCode: ' + err.code + ' ,msg: ' + err.message);
}
```
## vibrator.stopVibration<sup>9+</sup>
## vibrator.vibrate
vibrate(effectId: EffectId): Promise&lt;void&gt;
stopVibration(stopMode: VibratorStopMode, callback: AsyncCallback&lt;void&gt;): void
按照预置振动效果触发马达振动
按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------- | ---- | ------------------ |
| effectId | [EffectId](#effectid) | 是 | 预置的振动效果ID。 |
**返回值:**
| 类型 | 说明 |
| ------------------- | -------------------------------------- |
| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
**示例:**
```js
vibrator.vibrate(vibrator.EffectId.EFFECT_CLOCK_TIMER).then(()=>{
console.log("Promise returned to indicate a successful vibration.");
}, (error)=>{
console.log("error.code" + error.code + "error.message" + error.message);
});
```
## vibrator.vibrate
vibrate(effectId: EffectId, callback?: AsyncCallback&lt;void&gt;): void
按照指定振动效果触发马达振动。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ---------------------------------------------------------- |
| effectId | [EffectId](#effectid) | 是 | 预置的振动效果ID。 |
| callback | AsyncCallback&lt;void&gt; | 否 | 回调函数。当马达振动成功,err为undefined,否则为错误对象。 |
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 马达停止指定的振动模式。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。当马达停止振动成功,err为undefined,否则为错误对象。 |
**示例:**
```js
vibrator.vibrate(vibrator.EffectId.EFFECT_CLOCK_TIMER, function(error){
if(error){
console.log("error.code" + error.code + "error.message" + error.message);
}else{
console.log("Callback returned to indicate a successful vibration.");
}
})
try {
vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET, function(error){
if(error){
console.log('error.code' + error.code + 'error.message' + error.message);
}else{
console.log('Callback returned to indicate successful.');
}
})
} catch(err) {
console.info('errCode: ' + err.code + ' ,msg: ' + err.message);
}
```
## vibrator.vibrate<sup>9+</sup>
vibrate(effect: VibrateEffect, attribute: VibrateAttribute, callback: AsyncCallback&lt;void&gt;): void
按照指定振动效果和振动属性触发马达振动。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | -------------------------------------- | ---- | :--------------------------------------------------------- |
| effect | [VibrateEffect](#vibrateeffect9) | 是 | 马达振动效果。 |
| attribute | [VibrateAttribute](#vibrateattribute9) | 是 | 马达振动属性。 |
| callback | AsyncCallback&lt;void&gt; | 是 | 回调函数。当马达振动成功,err为undefined,否则为错误对象。 |
示例:
## vibrator.stopVibration<sup>9+</sup>
```js
vibrator.vibrate({
type:'time',
duration:1000,
},{
id:0,
usage: 'alarm'
}, (error)=>{
if(error){
console.log("vibrate fail, error.code:" + error.code + ",error.message:" + error.message);
}else{
console.log("Callback returned to indicate a successful vibration.");
}
});
```
## vibrator.stop
stop(stopMode: VibratorStopMode): Promise&lt;void&gt;
stopVibration(stopMode: VibratorStopMode): Promise&lt;void&gt;
按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败。
......@@ -218,6 +140,7 @@ stop(stopMode: VibratorStopMode): Promise&lt;void&gt;
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------ |
| stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 马达停止指定的振动模式。 |
......@@ -231,43 +154,17 @@ stop(stopMode: VibratorStopMode): Promise&lt;void&gt;
**示例:**
```js
vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET).then(()=>{
console.log("Promise returned to indicate a successful vibration.");
}, (error)=>{
console.log("error.code" + error.code + "error.message" + error.message);
});
try {
vibrator.stopVibration(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET).then(()=>{
console.log('Promise returned to indicate a successful vibration.');
}, (error)=>{
console.log('error.code' + error.code + 'error.message' + error.message);
});
} catch(err) {
console.info('errCode: ' + err.code + ' ,msg: ' + err.message);
}
```
## vibrator.stop
stop(stopMode: VibratorStopMode, callback?: AsyncCallback&lt;void&gt;): void;
按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 马达停止指定的振动模式。 |
| callback | AsyncCallback&lt;void&gt; | 否 | 回调函数。当马达停止振动成功,err为undefined,否则为错误对象。 |
**示例:**
```js
vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET, function(error){
if(error){
console.log("error.code" + error.code + "error.message" + error.message);
}else{
console.log("Callback returned to indicate successful.");
}
})
```
## EffectId
马达振动效果的字符串。
......@@ -353,3 +250,200 @@ stop(stopMode: VibratorStopMode, callback?: AsyncCallback&lt;void&gt;): void;
| physicalFeedback | string | 用于物理反馈振动的场景。 |
| simulateReality | string | 用于模拟现实振动的场景。 |
## vibrator.vibrate<sup>(deprecated)</sup>
vibrate(duration: number): Promise&lt;void&gt;
按照指定持续时间触发马达振动。
从API version 9 开始不再维护,建议使用 [vibrator.startVibration](#vibratorstartvibration9-1) 代替。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------ | ---- | ---------------------- |
| duration | number | 是 | 马达振动时长, 单位ms。 |
**返回值:**
| 类型 | 说明 |
| ------------------- | -------------------------------------- |
| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
**示例:**
```js
vibrator.vibrate(1000).then(()=>{
console.log('Promise returned to indicate a successful vibration.');
}, (error)=>{
console.log('error.code' + error.code + 'error.message' + error.message);
});
```
## vibrator.vibrate<sup>(deprecated)</sup>
vibrate(duration: number, callback?: AsyncCallback&lt;void&gt;): void
按照指定持续时间触发马达振动。
从API version 9 开始不再维护,建议使用 [vibrator.startVibration](#vibratorstartvibration9) 代替。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ---------------------------------------------------------- |
| duration | number | 是 | 马达振动时长, 单位ms。 |
| callback | AsyncCallback&lt;void&gt; | 否 | 回调函数。当马达振动成功,err为undefined,否则为错误对象。 |
**示例:**
```js
vibrator.vibrate(1000,function(error){
if(error){
console.log('error.code' + error.code + 'error.message' + error.message);
}else{
console.log('Callback returned to indicate a successful vibration.');
}
})
```
## vibrator.vibrate<sup>(deprecated)</sup>
vibrate(effectId: EffectId): Promise&lt;void&gt;
按照预置振动效果触发马达振动。
从API version 9 开始不再维护,建议使用 [vibrator.startVibration](#vibratorstartvibration9-1) 代替。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | --------------------- | ---- | ------------------ |
| effectId | [EffectId](#effectid) | 是 | 预置的振动效果ID。 |
**返回值:**
| 类型 | 说明 |
| ------------------- | -------------------------------------- |
| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
**示例:**
```js
vibrator.vibrate(vibrator.EffectId.EFFECT_CLOCK_TIMER).then(()=>{
console.log('Promise returned to indicate a successful vibration.');
}, (error)=>{
console.log('error.code' + error.code + 'error.message' + error.message);
});
```
## vibrator.vibrate<sup>(deprecated)</sup>
vibrate(effectId: EffectId, callback?: AsyncCallback&lt;void&gt;): void
按照指定振动效果触发马达振动。
从API version 9 开始不再维护,建议使用 [vibrator.startVibration](#vibratorstartvibration9) 代替。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------- | ---- | ---------------------------------------------------------- |
| effectId | [EffectId](#effectid) | 是 | 预置的振动效果ID。 |
| callback | AsyncCallback&lt;void&gt; | 否 | 回调函数。当马达振动成功,err为undefined,否则为错误对象。 |
**示例:**
```js
vibrator.vibrate(vibrator.EffectId.EFFECT_CLOCK_TIMER, function(error){
if(error){
console.log('error.code' + error.code + 'error.message' + error.message);
}else{
console.log('Callback returned to indicate a successful vibration.');
}
})
```
## vibrator.stop<sup>(deprecated)</sup>
stop(stopMode: VibratorStopMode): Promise&lt;void&gt;
按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败。
从API version 9 开始不再维护,建议使用 [vibrator.stopVibration](#vibratorstopvibration9-1) 代替。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------ |
| stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 马达停止指定的振动模式。 |
**返回值:**
| 类型 | 说明 |
| ------------------- | -------------------------------------- |
| Promise&lt;void&gt; | Promise对象。无返回结果的Promise对象。 |
**示例:**
```js
vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET).then(()=>{
console.log('Promise returned to indicate a successful vibration.');
}, (error)=>{
console.log('error.code' + error.code + 'error.message' + error.message);
});
```
## vibrator.stop<sup>(deprecated)</sup>
stop(stopMode: VibratorStopMode, callback?: AsyncCallback&lt;void&gt;): void
按照要停止指定的振动模式来停止马达的振动。如果要停止的振动模式与触发马达振动时的模式不相同,则调用本接口会失败。
从API version 9 开始不再维护,建议使用 [vibrator.stopVibration](#vibratorstopvibration9) 代替。
**需要权限**:ohos.permission.VIBRATE
**系统能力**:SystemCapability.Sensors.MiscDevice
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ------------------------------------- | ---- | ------------------------------------------------------------ |
| stopMode | [VibratorStopMode](#vibratorstopmode) | 是 | 马达停止指定的振动模式。 |
| callback | AsyncCallback&lt;void&gt; | 否 | 回调函数。当马达停止振动成功,err为undefined,否则为错误对象。 |
**示例:**
```js
vibrator.stop(vibrator.VibratorStopMode.VIBRATOR_STOP_MODE_PRESET, function(error){
if(error){
console.log('error.code' + error.code + 'error.message' + error.message);
}else{
console.log('Callback returned to indicate successful.');
}
})
```
......@@ -52,6 +52,7 @@ Image(src: string | PixelMap | Resource)
> **说明:**
>
> 使用快捷组合键对Image组件复制的前提是,该组件必须处于获焦状态。将Image组件的属性focusable设置为true,即可使用TAB键将焦点切换到Image组件上,再将Image组件的focusOnTouch属性设置为true,即可实现点击获焦。
> 图片设置svg图源时,支持的标签范围有限,目前支持的svg标签包括svg、rect、circle、ellipse、path、line、polyline、polygon、animate、animateMotion、animateTransform。
### ImageInterpolation
......
......@@ -21,6 +21,21 @@ TextClock(options?: { timeZoneOffset?: number, controller?: TextClockController
| timeZoneOffset | number | 否 | 设置时区偏移量。<br>取值范围为[-14, 12],表示东十二区到西十二区,其中负值表示东时区,正值表示西时区,比如东八区为-8。<br>对横跨国际日界线的国家或地区,用-13(UTC+13)和-14(UTC+14)来保证整个国家或者区域处在相同的时间,当设置的值不在取值范围内时,将使用当前系统的时区偏移量。<br/>默认值:当前系统的时区偏移量 |
| controller | [TextClockController](#textclockcontroller) | 否 | 绑定一个控制器,用来控制文本时钟的状态。|
## 属性
除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性:
| 名称 | 参数类型 | 描述 |
| ------ | --------------- | ------------------------------------------------------------ |
| format | string | 设置显示时间格式。<br/>日期间隔符固定为"/",时间间隔符为":"。<br/>如yyyyMMdd,yyyy-MM-dd显示为yyyy/MM/dd,<br/>hhmmss显示为hh:mm:ss。 <br/>时间格式只用写一位即可,如"hhmmss"等同于"hms"。<br/>支持的时间格式化字符串:<br/>- YYYY/yyyy:完整年份。<br/>- YY/yy:年份后两位。<br/>- M:月份(若想使用01月则使用MM)。<br/>- d:日期(若想使用01日则使用dd)。<br/>- D:年中日(一年中的第几天)。<br/>- H:24小时制。<br/>- h:12小时制。<br/>- m:分钟。<br/>- s:秒。<br/>- SSS:毫秒。<br/>若格式未匹配,则使用默认值。<br/>默认值: 'hms'|
## 事件
除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件:
| 名称 | 功能描述 |
| -------------------------------------------- | ------------------------------------------------------------ |
| onDateChange(event: (value: number) => void) | 提供时间变化回调,该事件最小回调间隔为秒。<br/>- value: Unix Time Stamp,即自1970年1月1日(UTC)起经过的毫秒数。 |
## TextClockController
......@@ -44,24 +59,6 @@ stop()
停止文本时钟。
## 属性
除支持[通用属性](ts-universal-attributes-size.md)外,还支持以下属性:
| 名称 | 参数类型 | 描述 |
| ------ | --------------- | ------------------------------------------------------------ |
| format | string | 设置显示时间格式。<br/>日期间隔符固定为"/",时间间隔符为":"。<br/>如yyyyMMdd,yyyy-MM-dd显示为yyyy/MM/dd,<br/>hhmmss显示为hh:mm:ss。 <br/>时间格式只用写一位即可,如"hhmmss"等同于"hms"。<br/>支持的时间格式化字符串:<br/>- YYYY/yyyy:完整年份。<br/>- YY/yy:年份后两位。<br/>- M:月份(若想使用01月则使用MM)。<br/>- d:日期(若想使用01日则使用dd)。<br/>- D:年中日(一年中的第几天)。<br/>- H:24小时制。<br/>- h:12小时制。<br/>- m:分钟。<br/>- s:秒。<br/>- SSS:毫秒。<br/>默认值: 'hms'|
## 事件
除支持[通用事件](ts-universal-events-click.md)外,还支持以下事件:
| 名称 | 功能描述 |
| -------------------------------------------- | ------------------------------------------------------------ |
| onDateChange(event: (value: number) => void) | 提供时间变化回调,该事件最小回调间隔为秒。<br /> value: Unix Time Stamp,即自1970年1月1日(UTC)起经过的毫秒数。 |
## 示例
```ts
......@@ -101,4 +98,3 @@ struct Second {
}
```
![text_clock](figures/text_clock.gif)
......@@ -6,40 +6,33 @@
>
> 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
## 子组件
## 接口
TextTimer(options?: { isCountDown?: boolean, count?: number, controller?: TextTimerController })
**参数:**
**参数**
| 参数名 | 参数类型 | 必填 | 参数描述 |
| ----------- | -------- | -------- | -------- | -------- |
| ----------- | -------- | -------- | -------- |
| isCountDown | boolean | 否 | 是否倒计时。<br/>默认值:false |
| count | number | 否 | 倒计时时间(isCountDown为true时生效),单位为毫秒。<br/>-&nbsp;count&lt;=0时,使用默认值为倒计时初始值。<br/>-&nbsp;count&gt;0时,count值为倒计时初始值。<br/>默认值:60000 |
| count | number | 否 | 倒计时时间(isCountDown为true时生效),单位为毫秒。最长不超过86400000毫秒(24小时)。&nbsp;0&lt;count&lt;86400000时,count值为倒计时初始值。否则,使用默认值为倒计时初始值。<br/>默认值:60000 |
| controller | [TextTimerController](#texttimercontroller) | 否 | TextTimer控制器。 |
## 属性
| 名称 | 参数类型 | 描述 |
| -------- | ---------------------- | ---------------------- |
| format | string | 自定义格式,需至少包含一个hh、mm、ss、ms中的关键字。<br/>默认值:'hh:mm:ss.ms' |
| format | string | 自定义格式,需至少包含一个HH、mm、ss、SS中的关键字。如使用yy、MM、dd等日期格式,则使用默认值。<br/>默认值:'HH:mm:ss.SS' |
## 事件
| 名称 | 功能描述 |
| -------- | -------- |
| onTimer(event:&nbsp;(utc:&nbsp;number,&nbsp;elapsedTime:&nbsp;number)&nbsp;=&gt;&nbsp;void) | 时间文本发生变化时触发。<br/>utc:当前显示的时间,单位为毫秒。<br/>elapsedTime:计时器经过的时间,单位为毫秒。 |
| 名称 | 功能描述 |
| ---------------------------------------- | ---------------------------------------- |
| onTimer(event:&nbsp;(utc:&nbsp;number,&nbsp;elapsedTime:&nbsp;number)&nbsp;=&gt;&nbsp;void) | 时间文本发生变化时触发。<br/>utc:Linux时间戳,即自1970年1月1日起经过的毫秒数。<br/>elapsedTime:计时器经过的时间,单位为毫秒。 |
## TextTimerController
......@@ -70,7 +63,6 @@ reset()
重置计时器。
## 示例
```ts
......@@ -79,7 +71,7 @@ reset()
@Component
struct TextTimerExample {
textTimerController: TextTimerController = new TextTimerController()
@State format: string = 'hh:mm:ss.ms'
@State format: string = 'HH:mm:ss.SS'
build() {
Column() {
......
......@@ -10,7 +10,7 @@
| 名称 | 参数类型 | 描述 |
| -------- | -------- | -------- |
| backgroundColor | [ResourceColor](ts-types.md) | 设置组件的背景色。 |
| backgroundColor | [ResourceColor](ts-types.md#resourcecolor) | 设置组件的背景色。 |
| backgroundImage | src:&nbsp;[ResourceStr](ts-types.md#resourcestr),<br/>repeat?:&nbsp;[ImageRepeat](ts-appendix-enums.md#imagerepeat) | src:图片地址,支持网络图片资源和本地图片资源地址(不支持svg类型的图片)。<br/>repeat:设置背景图片的重复样式,默认不重复。 |
| backgroundImageSize | {<br/>width?:&nbsp;[Length](ts-types.md#length),<br/>height?:&nbsp;[Length](ts-types.md#length)<br/>}&nbsp;\|&nbsp;[ImageSize](ts-appendix-enums.md#imagesize) | 设置背景图像的高度和宽度。当输入为{width:&nbsp;Length,&nbsp;height:&nbsp;Length}对象时,如果只设置一个属性,则第二个属性保持图片原始宽高比进行调整。默认保持原图的比例不变。<br/>默认值:ImageSize.Auto |
| backgroundImagePosition | [Position](ts-types.md#position8)&nbsp;\|&nbsp;[Alignment](ts-appendix-enums.md#alignment) | 设置背景图在组件中显示位置。<br/>默认值:<br/>{<br/>x:&nbsp;0,<br/>y:&nbsp;0<br/>} |
......
......@@ -10,17 +10,17 @@
| 名称 | 参数类型 | 描述 |
| ---------- | ---------------------------------------- | --------------------------------------- |
| borderImage | BorderImageOption | 图片边框或者渐变色边框设置接口。 |
| borderImage | [BorderImageOption](#borderimageoption对象说明) | 图片边框或者渐变色边框设置接口。 |
## BorderImageOption对象说明
| 名称 | 类型 | 描述 |
| ---------- | ---------------------------------------- | --------------------------------------- |
| source | string \| [Resource](ts-types.md#resource) \| [linearGradient](ts-universal-attributes-gradient-color.md) | 边框图源或者渐变色设置。 |
| slice | [Length](ts-types.md#length)\| [EdgeWidths](ts-types.md#edgewidths9) | 设置图片边框切割宽度。<br/>默认值:0 |
| width | [Length](ts-types.md#length)\| [EdgeWidths](ts-types.md#edgewidths9) | 设置图片边框宽度。<br/>默认值:0 |
| outset | [Length](ts-types.md#length)\| [EdgeWidths](ts-types.md#edgewidths9) | 设置边框图片向外延伸距离。<br/>默认值:0 |
| RepeatMode | RepeatMode | 设置边框图片的重复方式。<br/>默认值:RepeatMode.Stretch |
| slice | [Length](ts-types.md#length) \| [EdgeWidths](ts-types.md#edgewidths9) | 设置图片边框切割宽度。<br/>默认值:0 |
| width | [Length](ts-types.md#length) \| [EdgeWidths](ts-types.md#edgewidths9) | 设置图片边框宽度。<br/>默认值:0 |
| outset | [Length](ts-types.md#length) \| [EdgeWidths](ts-types.md#edgewidths9) | 设置边框图片向外延伸距离。<br/>默认值:0 |
| repeat | [RepeatMode](#repeatmode枚举说明) | 设置边框图片的重复方式。<br/>默认值:RepeatMode.Stretch |
| fill | boolean | 设置边框图片中心填充。<br/>默认值:false |
......@@ -45,7 +45,7 @@ struct Index {
build() {
Row() {
Column() {
Text('This is\nborderImage.').textAlign(TextAlign.Center)
Text('This is borderImage.').textAlign(TextAlign.Center)
.borderImage({
source: "borderOrigin.png",
slice: {top:"31%", bottom:"31%", left:"31%", right:"31%"},
......@@ -53,7 +53,7 @@ struct Index {
outset: {top:"5px", bottom:"5px", left:"5px", right:"5px"},
repeat: RepeatMode.Repeat,
fill: false
});
})
}
.width('100%')
}
......@@ -70,20 +70,21 @@ struct Index {
@Entry
@Component
struct Index {
build() {
Row() {
Column() {
Text('This is\ngradient color.').textAlign(TextAlign.Center)
Text('This is gradient color.').textAlign(TextAlign.Center)
.borderImage({
source: {angle:90,
source: {
angle: 90,
direction: GradientDirection.Left,
colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]},
slice: {top:10, bottom:10, left:10, right:10},
width: {top:"10px", bottom:"10px", left: "10px", right:"10px"},
colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]
},
slice: { top: 10, bottom: 10, left: 10, right: 10 },
width: { top: "10px", bottom: "10px", left: "10px", right: "10px" },
repeat: RepeatMode.Stretch,
fill: false
});
})
}
.width('100%')
}
......
......@@ -13,11 +13,11 @@
| 名称 | 参数类型 | 描述 |
| ------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| border | {<br/>width?:&nbsp;[Length](ts-types.md#length)&nbsp;\|&nbsp;EdgeWidths<sup>9+</sup>,<br/>color?: &nbsp;[ResourceColor](ts-types.md#resourcecolor)&nbsp;\|&nbsp;EdgeColors<sup>9+</sup>,<br/>radius?: &nbsp;[Length](ts-types.md#length)&nbsp;\|&nbsp;BorderRadiuses<sup>9+</sup>,<br/>style?:&nbsp;[BorderStyle](ts-appendix-enums.md#borderstyle)&nbsp;\|&nbsp;EdgeStyles<sup>9+</sup><br/>} | 统一边框样式设置接口。<br/>-&nbsp;width:设置边框宽度。<br/>-&nbsp;color:设置边框颜色。<br/>-&nbsp;radius:设置边框圆角半径。<br/>-&nbsp;style:设置边框样式。 |
| borderStyle | [BorderStyle](ts-appendix-enums.md#borderstyle) \| EdgeStyles<sup>9+</sup> | 设置元素的边框样式。<br/>默认值:BorderStyle.Solid |
| borderWidth | [Length](ts-types.md#length) \| EdgeWidths<sup>9+</sup> | 设置元素的边框宽度,不支持百分比。 |
| borderColor | [ResourceColor](ts-types.md#resourcecolor) \| EdgeColors<sup>9+</sup> | 设置元素的边框颜色。 |
| borderRadius | [Length](ts-types.md#length) \| BorderRadiuses<sup>9+</sup> | 设置元素的边框圆角半径,不支持百分比。 |
| border | {<br/>width?:&nbsp;[Length](ts-types.md#length)&nbsp;\|&nbsp;[EdgeWidths](#edgewidths9对象说明)<sup>9+</sup>,<br/>color?: &nbsp;[ResourceColor](ts-types.md#resourcecolor)&nbsp;\|&nbsp;[EdgeColors](#edgecolors9对象说明)<sup>9+</sup>,<br/>radius?: &nbsp;[Length](ts-types.md#length)&nbsp;\|&nbsp;[BorderRadiuses](#borderradiuses9对象说明)<sup>9+</sup>,<br/>style?:&nbsp;[BorderStyle](ts-appendix-enums.md#borderstyle)&nbsp;\|&nbsp;[EdgeStyles](#edgestyles9对象说明)<sup>9+</sup><br/>} | 统一边框样式设置接口。<br/>-&nbsp;width:设置边框宽度。<br/>-&nbsp;color:设置边框颜色。<br/>-&nbsp;radius:设置边框圆角半径。<br/>-&nbsp;style:设置边框样式。 |
| borderStyle | [BorderStyle](ts-appendix-enums.md#borderstyle) \| [EdgeStyles](#edgestyles9对象说明)<sup>9+</sup> | 设置元素的边框样式。<br/>默认值:BorderStyle.Solid |
| borderWidth | [Length](ts-types.md#length) \| [EdgeWidths](#edgewidths9对象说明)<sup>9+</sup> | 设置元素的边框宽度,不支持百分比。 |
| borderColor | [ResourceColor](ts-types.md#resourcecolor) \| [EdgeColors](#edgecolors9对象说明)<sup>9+</sup> | 设置元素的边框颜色。 |
| borderRadius | [Length](ts-types.md#length) \| [BorderRadiuses](#borderradiuses9对象说明)<sup>9+</sup> | 设置元素的边框圆角半径,不支持百分比。 |
## EdgeWidths<sup>9+</sup>对象说明
......@@ -70,19 +70,19 @@
@Entry
@Component
struct BorderExample {
build() {
Column() {
Flex({ justifyContent: FlexAlign.SpaceAround, alignItems: ItemAlign.Center }) {
// 线段
Text('dashed')
.borderStyle(BorderStyle.Dashed).borderWidth(5).borderColor(0xAFEEEE).borderRadius(10)
.borderStyle(BorderStyle.Dashed).borderWidth(5).borderColor(0xAFEEEE).borderRadius(10)
.width(120).height(120).textAlign(TextAlign.Center).fontSize(16)
// 点线
Text('dotted')
.border({ width: 5, color: 0x317AF7, radius: 10, style: BorderStyle.Dotted })
.width(120).height(120).textAlign(TextAlign.Center).fontSize(16)
}.width('100%').height(150)
Text('.border')
.fontSize(50)
.width(300)
......@@ -92,12 +92,12 @@ struct BorderExample {
color: { left: '#e3bbbb', right: Color.Blue, top: Color.Red, bottom: Color.Green },
radius: { topLeft: 10, topRight: 20, bottomLeft: 40, bottomRight: 80 },
style: {
left: BorderStyle.Dotted,
right: BorderStyle.Dotted,
top: BorderStyle.Solid,
bottom: BorderStyle.Dashed
left: BorderStyle.Dotted,
right: BorderStyle.Dotted,
top: BorderStyle.Solid,
bottom: BorderStyle.Dashed
}
}).textAlign(TextAlign.Center)
}).textAlign(TextAlign.Center)
}
}
}
......
......@@ -77,7 +77,7 @@ sendTouchEvent(event: TouchObject): boolean
| 参数 | 类型 | 必填 | 描述 |
| ----- | ----------- | ---- | ------------------------------------------------------------ |
| event | TouchObject | 是 | 触发触摸事件的位置,event参数见[TouchEvent](ts-universal-events-touch.md#touchevent对象说明)中TouchObject的介绍。 |
| event | [TouchObject](ts-universal-events-touch.md#touchobject对象说明) | 是 | 触发触摸事件的位置,event参数见[TouchEvent](ts-universal-events-touch.md#touchevent对象说明)中TouchObject的介绍。 |
**返回值:**
......@@ -95,7 +95,7 @@ sendKeyEvent(event: KeyEvent): boolean
| 参数 | 类型 | 必填 | 描述 |
| ----- | -------- | ---- | ------------------------------------------------------------ |
| event | KeyEvent | 是 | 按键事件,event参数见[KeyEvent](ts-universal-events-key.md#keyevent对象说明)介绍。 |
| event | [KeyEvent](ts-universal-events-key.md#keyevent对象说明) | 是 | 按键事件,event参数见[KeyEvent](ts-universal-events-key.md#keyevent对象说明)介绍。 |
**返回值:**
......@@ -113,7 +113,7 @@ sendMouseEvent(event: MouseEvent): boolean
| 参数 | 类型 | 必填 | 描述 |
| ----- | ---------- | ---- | --------------------------------------- |
| event | MouseEvent | 是 | 鼠标事件,event参数见[MouseEvent](ts-universal-mouse-key.md#mouseevent对象说明)介绍。 |
| event | [MouseEvent](ts-universal-mouse-key.md#mouseevent对象说明) | 是 | 鼠标事件,event参数见[MouseEvent](ts-universal-mouse-key.md#mouseevent对象说明)介绍。 |
**返回值:**
......@@ -132,6 +132,7 @@ class Utils {
static rect_bottom;
static rect_value;
//获取组件所占矩形区域坐标
static getComponentRect(key) {
let strJson = getInspectorByKey(key);
let obj = JSON.parse(strJson);
......@@ -171,7 +172,7 @@ struct IdExample {
console.info(getInspectorTree())
this.text = "Button 'click to start' is clicked"
setTimeout(() => {
sendEventByKey("longClick", 11, "")
sendEventByKey("longClick", 11, "") // 向id为"longClick"的组件发送长按事件
}, 2000)
}).id('click')
......@@ -183,18 +184,18 @@ struct IdExample {
console.info('long clicked')
this.text = "Button 'longClick' is longclicked"
setTimeout(() => {
let rect = Utils.getComponentRect('onTouch')
let rect = Utils.getComponentRect('onTouch') // 获取id为"onTouch"组件的矩形区域坐标
let touchPoint: TouchObject = {
id: 1,
x: rect.left + (rect.right - rect.left) / 2,
y: rect.top + (rect.bottom - rect.top) / 2,
x: rect.left + (rect.right - rect.left) / 2, // 组件中心点x坐标
y: rect.top + (rect.bottom - rect.top) / 2, // 组件中心点y坐标
type: TouchType.Down,
screenX: rect.left + (rect.right - rect.left) / 2,
screenY: rect.left + (rect.right - rect.left) / 2,
screenX: rect.left + (rect.right - rect.left) / 2, // 组件中心点x坐标
screenY: rect.left + (rect.right - rect.left) / 2, // 组件中心点y坐标
}
sendTouchEvent(touchPoint)
sendTouchEvent(touchPoint) // 发送触摸事件
touchPoint.type = TouchType.Up
sendTouchEvent(touchPoint)
sendTouchEvent(touchPoint) // 发送触摸事件
}, 2000)
})).id('longClick')
......@@ -205,14 +206,14 @@ struct IdExample {
console.info('onTouch is clicked')
this.text = "Button 'onTouch' is clicked"
setTimeout(() => {
let rect = Utils.getComponentRect('onMouse')
let rect = Utils.getComponentRect('onMouse') // 获取id为"onMouse"组件的矩形区域坐标
let mouseEvent: MouseEvent = {
button: MouseButton.Left,
action: MouseAction.Press,
x: rect.left + (rect.right - rect.left) / 2,
y: rect.top + (rect.bottom - rect.top) / 2,
screenX: rect.left + (rect.right - rect.left) / 2,
screenY: rect.top + (rect.bottom - rect.top) / 2,
x: rect.left + (rect.right - rect.left) / 2, // 组件中心点x坐标
y: rect.top + (rect.bottom - rect.top) / 2, // 组件中心点y坐标
screenX: rect.left + (rect.right - rect.left) / 2, // 组件中心点x坐标
screenY: rect.top + (rect.bottom - rect.top) / 2, // 组件中心点y坐标
timestamp: 1,
target: {
area: {
......@@ -230,7 +231,7 @@ struct IdExample {
},
source: SourceType.Mouse
}
sendMouseEvent(mouseEvent)
sendMouseEvent(mouseEvent) // 发送鼠标事件
}, 2000)
}).id('onTouch')
......@@ -250,7 +251,7 @@ struct IdExample {
metaKey: 0,
timestamp: 0
}
sendKeyEvent(keyEvent)
sendKeyEvent(keyEvent) // 发送按键事件
}, 2000)
}).id('onMouse')
......
......@@ -12,7 +12,7 @@
| **名称** | **参数类型** | **描述** |
| -------------------- | -------- | ---------------------------------------- |
| focusable | boolean | 设置当前组件是否可以获焦。<br/>**说明:**<br/>存在默认交互逻辑的组件例如Button、TextInput等,默认即为可获焦,Text、Image等组件则默认状态为不可获焦。 |
| tabIndex<sup>9+<sup> | number | 自定义组件tab键走焦能力,走焦顺序为:tabIndex大于0的组件依次递增走焦, tabIndex等于0的组件按组件树先后顺序走焦。<br />- tabIndex >= 0:表示元素是可聚焦的,并且可以通过tab键走焦来访问到该元素,按照tabIndex的数值递增而先后获焦。如果多个元素拥有相同的tabIndex,按照元素在当前组件树中的先后顺序获焦<br />- tabIndex < 0(通常是tabIndex = -1):表示元素是可聚焦的,但是不能通过tab键走焦来访问到该元素。<br/>默认值:0 |
| tabIndex<sup>9+<sup> | number | 自定义组件tab键走焦能力,走焦顺序为:tabIndex大于0的组件依次递增走焦, tabIndex等于0的组件按组件树先后顺序走焦。<br />- tabIndex >= 0:表示元素是可聚焦的,并且可以通过tab键走焦来访问到该元素,tabIndex值越小,则优先获焦;反之,则后获焦。如果多个元素拥有相同的tabIndex,按照元素在当前组件树中的先后顺序获焦<br />- tabIndex < 0(通常是tabIndex = -1):表示元素是可聚焦的,但是不能通过tab键走焦来访问到该元素。<br/>默认值:0 |
| defaultFocus<sup>9+<sup> | boolean | 设置当前组件是否为当前页面上的默认焦点,仅在初次创建的页面第一次进入时生效。<br/>默认值:false |
| groupDefaultFocus<sup>9+<sup> | boolean | 设置当前组件是否为当前组件所在容器获焦时的默认焦点,仅在初次创建容器节点第一次获焦时生效。<br/>默认值:false<br/>**说明:** 必须与tabIndex联合使用,当某个容器设置了tabIndex,且容器内某子组件设置了groupDefaultFocus,当该容器首次获焦时,会自动将焦点转移至该组件上。<br/> |
| focusOnTouch<sup>9+<sup> | boolean | 设置当前组件是否支持点击获焦能力。<br/>默认值:false<br/>**说明:** 仅在组件可点击时才能正常获取焦点。 |
......
......@@ -12,9 +12,9 @@
| 名称 | 参数类型 | 描述 |
| -------------- | -------------------------------------------- | ----------------------------------- |
| linearGradient | {<br/>angle?:&nbsp;number \| string,<br/>direction?:&nbsp;[GradientDirection](ts-appendix-enums.md#gradientdirection),<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | 线性渐变。<br/>- angle:&nbsp;线性渐变的角度。<br/>- direction:&nbsp;线性渐变的方向,设置angle后不生效。<br/>- colors:&nbsp;为渐变的颜色描述。<br/>- repeating:&nbsp;为渐变的颜色重复着色。 |
| sweepGradient | {<br/>center:&nbsp;Point,<br/>start?:&nbsp;number \| string,<br/>end?:&nbsp;number \| string,<br/>rotation?:&nbsp;number\|string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | 角度渐变。<br/>- center:为角度渐变的中心点<br/>- start:角度渐变的起点。<br/>- end:角度渐变的终点。<br/>- rotation:&nbsp;角度渐变的旋转角度。<br/>- colors:&nbsp;为渐变的颜色描述。<br/>- repeating:&nbsp;为渐变的颜色重复着色。 |
| radialGradient | {<br/>center:&nbsp;Point,<br/>radius:&nbsp;number \| string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | 径向渐变。<br/>- center:径向渐变的中心点。<br/>- radius:径向渐变的半径。<br/>- colors:&nbsp;为渐变的颜色描述。<br/>- repeating:&nbsp;为渐变的颜色重复着色。 |
| linearGradient | {<br/>angle?:&nbsp;number \| string,<br/>direction?:&nbsp;[GradientDirection](ts-appendix-enums.md#gradientdirection),<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | 线性渐变。<br/>- angle:&nbsp;线性渐变的起始角度。0点方向顺时针旋转为正向角度。<br/> 默认值:180<br/>- direction:&nbsp;线性渐变的方向,设置angle后不生效。<br/> 默认值:GradientDirection.Bottom <br/>- colors:&nbsp;为渐变的颜色描述。<br/>- repeating:&nbsp;为渐变的颜色重复着色。 <br/> 默认值:false |
| sweepGradient | {<br/>center:&nbsp;Point,<br/>start?:&nbsp;number \| string,<br/>end?:&nbsp;number \| string,<br/>rotation?:&nbsp;number\|string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | 角度渐变。<br/>- center:为角度渐变的中心点,即相对于当前组件左上角的坐标。<br/>- start:角度渐变的起点。<br/> 默认值:0<br/>- end:角度渐变的终点。<br/> 默认值:0<br/>- rotation:&nbsp;角度渐变的旋转角度。<br/> 默认值:0<br/>- colors:&nbsp;为渐变的颜色描述。<br/>- repeating:&nbsp;为渐变的颜色重复着色。<br/> 默认值:false |
| radialGradient | {<br/>center:&nbsp;Point,<br/> radius:&nbsp;number \| string,<br/>colors:&nbsp;Array&lt;[ColorStop](ts-basic-components-gauge.md#colorstop)&gt;,<br/>repeating?:&nbsp;boolean<br/>} | 径向渐变。<br/>- center:径向渐变的中心点,即相对于当前组件左上角的坐标。<br/>- radius:径向渐变的半径。<br/>- colors:&nbsp;为渐变的颜色描述。<br/>- repeating:&nbsp;为渐变的颜色重复着色。<br/> 默认值:false |
## 示例
......@@ -24,7 +24,6 @@
@Entry
@Component
struct ColorGradientExample {
build() {
Column({ space: 5 }) {
Text('linearGradient').fontSize(12).width('90%').fontColor(0xCCCCCC)
......@@ -33,8 +32,32 @@ struct ColorGradientExample {
.height(50)
.linearGradient({
angle: 90,
colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]
colors: [[0xff0000, 0.0], [0x0000ff, 0.3], [0xffff00, 1.0]]
})
Text('linearGradient Repeat').fontSize(12).width('90%').fontColor(0xCCCCCC)
Row()
.width('90%')
.height(50)
.linearGradient({
direction: GradientDirection.Left, // 渐变方向
repeating: true, // 渐变颜色是否重复
colors: [[0xff0000, 0.0], [0x0000ff, 0.3], [0xffff00, 0.5]] // 数组末尾元素占比小于1时满足重复着色效果
})
}
.width('100%')
.padding({ top: 5 })
}
}
```
![zh-cn_image_0000001219864149](figures/gradientColor1.png)
```ts
@Entry
@Component
struct ColorGradientExample {
build() {
Column({ space: 5 }) {
Text('sweepGradient').fontSize(12).width('90%').fontColor(0xCCCCCC)
Row()
.width(100)
......@@ -43,8 +66,37 @@ struct ColorGradientExample {
center: [50, 50],
start: 0,
end: 359,
colors: [[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]
colors: [[0xff0000, 0.0], [0x0000ff, 0.3], [0xffff00, 1.0]]
})
Text('sweepGradient Reapeat').fontSize(12).width('90%').fontColor(0xCCCCCC)
Row()
.width(100)
.height(100)
.sweepGradient({
center: [50, 50],
start: 0,
end: 359,
rotation: 45, // 旋转角度
repeating: true, // 渐变颜色是否重复
colors: [[0xff0000, 0.0], [0x0000ff, 0.3], [0xffff00, 0.5]] // 数组末尾元素占比小于1时满足重复着色效果
})
}
.width('100%')
.padding({ top: 5 })
}
}
```
![zh-cn_image_0000001219864149](figures/gradientColor2.png)
```ts
// xxx.ets
@Entry
@Component
struct ColorGradientExample {
build() {
Column({ space: 5 }) {
Text('radialGradient').fontSize(12).width('90%').fontColor(0xCCCCCC)
Row()
.width(100)
......@@ -52,7 +104,17 @@ struct ColorGradientExample {
.radialGradient({
center: [50, 50],
radius: 60,
colors:[[0xAEE1E1, 0.0], [0xD3E0DC, 0.3], [0xFCD1D1, 1.0]]
colors: [[0xff0000, 0.0], [0x0000ff, 0.3], [0xffff00, 1.0]]
})
Text('radialGradient Repeat').fontSize(12).width('90%').fontColor(0xCCCCCC)
Row()
.width(100)
.height(100)
.radialGradient({
center: [50, 50],
radius: 60,
repeating: true,
colors: [[0xff0000, 0.0], [0x0000ff, 0.3], [0xffff00, 0.5]] // 数组末尾元素占比小于1时满足重复着色效果
})
}
.width('100%')
......@@ -61,4 +123,4 @@ struct ColorGradientExample {
}
```
![zh-cn_image_0000001219864149](figures/zh-cn_image_0000001219864149.png)
![zh-cn_image_0000001219864149](figures/gradientColor3.png)
# 触摸测试控制
设置组件的触摸测试类型。ArkUI开发框架在处理触屏事件时,会在触屏事件触发前,进行按压点和组件区域的触摸测试来收集需要响应触屏事件的组件,然后基于触摸测试结果分发相应的触屏事件。hitTestBehavior属性可以设置不同的触摸测试响应模式,影响组件的触摸测试收集结果,最终影响后续的触屏事件分发,具体影响参考HitTestMode枚举说明。
设置组件的触摸测试类型。ArkUI开发框架在处理触屏事件时,会在触屏事件触发前,进行按压点和组件区域的触摸测试来收集需要响应触屏事件的组件,然后基于触摸测试结果分发相应的触屏事件。hitTestBehavior属性可以设置不同的触摸测试响应模式,影响组件的触摸测试收集结果,最终影响后续的触屏事件分发,具体影响参考[HitTestMode](#hittestmode枚举说明)枚举说明。
> **说明:**
> - 从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
......@@ -11,9 +11,9 @@
| **名称** | **参数类型** | **描述** |
| -------------------- | -------- | ---------------------------------------- |
| hitTestBehavior | HitTestMode | 设置当前组件的触摸测试类型。<br>默认值: HitTestMode.Default |
| hitTestBehavior | [HitTestMode](#hittestmode枚举说明) | 设置当前组件的触摸测试类型。<br>默认值: HitTestMode.Default |
## HitTestMode 枚举说明
## HitTestMode枚举说明
| 名称 | 描述 |
| ------------| ----------------------------------------- |
......
......@@ -21,6 +21,7 @@
| message | string | 是 | 弹窗信息内容。 |
| placementOnTop | boolean | 否 | 是否在组件上方显示,默认值为false。 |
| arrowOffset<sup>9+</sup> | [Length](ts-types.md#length) | 否 | popup箭头在弹窗处的偏移。箭头在气泡上下方时,默认居左;箭头在气泡左右侧时,默认居上。 |
| showInSubWindow<sup>9+</sup> | boolean | 否 | 是否在子窗口显示气泡,默认值为false。 |
| primaryButton | {<br/>value:&nbsp;string,<br/>action:&nbsp;()&nbsp;=&gt;&nbsp;void<br/>} | 否 | 第一个按钮。<br/>value:&nbsp;弹窗里主按钮的文本。<br/>action:&nbsp;点击主按钮的回调函数。 |
| secondaryButton | {<br/>value:&nbsp;string,<br/>action:&nbsp;()&nbsp;=&gt;&nbsp;void<br/>} | 否 | 第二个按钮。<br/>value:&nbsp;弹窗里辅助按钮的文本。<br/>action:&nbsp;点击辅助按钮的回调函数。 |
| onStateChange | (event:&nbsp;{&nbsp;isVisible:&nbsp;boolean&nbsp;})&nbsp;=&gt;&nbsp;void | 否 | 弹窗状态变化事件回调,参数isVisible为弹窗当前的显示状态。 |
......@@ -32,6 +33,7 @@
| builder | [CustomBuilder](ts-types.md#custombuilder8) | 是 | 提示气泡内容的构造器。 |
| placement | [Placement](ts-appendix-enums.md#placement8) | 否 | 气泡组件优先显示的位置,当前位置显示不下时,会自动调整位置。<br/>默认值:Placement.Bottom |
| arrowOffset<sup>9+</sup> | [Length](ts-types.md#length) | 否 | popup箭头在弹窗处的偏移。箭头在气泡上下方时,默认居左;箭头在气泡左右侧时,默认居上。 |
| showInSubWindow<sup>9+</sup> | boolean | 否 | 是否在子窗口显示气泡,默认值为false。 |
| maskColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 提示气泡遮障层的颜色。 |
| popupColor | [ResourceColor](ts-types.md#resourcecolor) | 否 | 提示气泡的颜色。 |
| enableArrow | boolean | 否 | 是否显示箭头。<br/>从API Version 9开始,如果箭头所在方位侧的气泡长度不足以显示下箭头,则会默认不显示箭头。比如:placement设置为Left,但气泡高度小于箭头的宽度(32vp),则实际不会显示箭头。<br/>默认值:true |
......@@ -61,16 +63,33 @@ struct PopupExample {
// PopupOptions 类型设置弹框内容
Button('PopupOptions')
.onClick(() => {
this.handlePopup = !this.handlePopup //点击展示弹框
this.noHandlePopup = !this.noHandlePopup;
})
.bindPopup(this.handlePopup, {
message: 'This is a popup with PopupOptions',
.bindPopup(this.noHandlePopup, {
message: 'content1 content1',
placementOnTop: false,
// 第一个按钮
showInSubWindow:true,
onStateChange: (e) => {
console.info(e.isVisible.toString())
if (!e.isVisible) {
this.noHandlePopup = false;
}
}
})
.position({ x: 100, y: 50 })
Button('with handle popup')
.onClick(() => {
this.handlePopup = !this.handlePopup;
})
.bindPopup(this.handlePopup, {
message: 'content2 content2',
placementOnTop: true,
showInSubWindow:false,
primaryButton: {
value: 'confirm',
action: () => {
this.handlePopup = !this.handlePopup
this.handlePopup = !this.handlePopup;
console.info('ok Button click')
}
},
......@@ -78,14 +97,14 @@ struct PopupExample {
secondaryButton: {
value: 'cancle',
action: () => {
this.handlePopup = !this.handlePopup
this.handlePopup = !this.handlePopup;
console.info('cancle Button click')
}
},
onStateChange: (e) => {
console.info(e.isVisible.toString())
if (!e.isVisible) {
this.handlePopup = false
this.handlePopup = false;
}
}
})
......@@ -95,7 +114,7 @@ struct PopupExample {
// CustomPopupOptions 类型设置弹框内容
Button('CustomPopupOptions')
.onClick(() => {
this.customPopup = !this.customPopup
this.customPopup = !this.customPopup;
})
.bindPopup(this.customPopup, {
builder: this.popupBuilder,
......@@ -103,10 +122,10 @@ struct PopupExample {
maskColor: 0x33000000,
popupColor: Color.Yellow,
enableArrow: true,
autoCancel: true,
showInSubWindow:false,
onStateChange: (e) => {
if (!e.isVisible) {
this.customPopup = false
this.customPopup = false;
}
}
})
......
# DistributedSchedule错误码
## 201 权限校验失败
### 错误信息
Permission denied.
### 可能原因
该错误码表示权限校验失败,可能原因是未配置对应权限。
### 处理步骤
配置权限ohos.permission.MANAGER_MISSIONS或ohos.permission.DISTRIBUTED_DATASYNC。
## 401 参数检查错误
### 错误信息
The parameter check failed.
### 可能原因
该错误码表示入参检查错误,可能原因是callback入参检查错误。
### 处理步骤
检查入参callback是否为合法值。
## 16600001 系统服务工作异常
### 错误信息
The system ability work abnormally.
### 可能原因
该错误码表示系统服务工作异常,可能原因如下。
1. DMS服务没有正常启动。
2. DMS的binder对象无法正常获取。
3. 流转依赖的其他服务没有正常启动或者binder对象无法获取。
### 处理步骤
系统服务内部工作异常,请稍后重试,或者重启设备尝试。
## 16600002 指定的token或callback未注册
### 错误信息
The specified token or callback has not registered.
### 可能原因
该错误码可能原因是指定的token或callback未注册。
### 处理步骤
请先注册token或callback。
## 16600003 应用注册token已达到最大次数限制
### 错误信息
The number of token registration times has reached the upper limit.
### 可能原因
该错误码可能原因是应用注册token已达到最大次数限制。
### 处理步骤
请勿频繁注册,请使用已注册的token。
## 16600004 指定的callback已注册
### 错误信息
The specified callback has been registered.
### 可能原因
该错误码表示指定的callback已注册,可能原因是使用相同的callback重复注册。
### 处理步骤
请勿使用相同的callback重复注册。
## 16300501 系统服务工作异常
### 错误信息
The system ability work abnormally.
### 可能原因
该错误码表示系统服务工作异常,可能原因如下。
1. DMS服务没有正常启动。
2. DMS的binder对象无法正常获取。
3. 流转依赖的其他服务没有正常启动或者binder对象无法获取。
### 处理步骤
系统服务内部工作异常,请稍后重试,或者重启设备尝试。
## 16300502 获取指定的missionId的missionInfo失败
### 错误信息
Failed to get the missionInfo of the specified missionId.
### 可能原因
该错误码表示获取指定的missionId的missionInfo失败,可能原因如下。
1. missionId输入错误。
2. missionId对应的missionInfo确实不存在。
### 处理步骤
请检查输入的missionId是否正确。
## 16300503 远端未安装应用且不支持免安装
### 错误信息
The application is not installed on the remote end and installation-free is not supported.
### 可能原因
该错误码可能原因是远端未安装迁移应用并且不支持免安装。
### 处理步骤
1. 请检查远端是否已安装需要迁移的应用。
2. 请检查远端是否支持免安装。
## 16300504 远端未安装应用但支持免安装,需使用免安装标识重试
### 错误信息
The application is not installed on the remote end but installation-free is supported, try again with freeInstall flag.
### 可能原因
该错误码可能原因是远端未安装应用但支持免安装,使用时未使用免安装的标识。
### 处理步骤
请使用免安装的标识重试。
## 16300505 操作设备必须是迁移的应用所在的设备或需迁移到的目标设备
### 错误信息
The operation device must be the device where the application to be continued is located or the target device to be continued.
### 可能原因
该错误码可能原因是操作设备不是迁移的应用所在的设备或需迁移到的目标设备。
### 处理步骤
请检查操作设备是否是迁移的应用所在的设备或需迁移到的目标设备。
## 16300506 本地迁移任务已在进行中
### 错误信息
The local continuation task is already in progress.
### 可能原因
该错误码表示本地迁移任务已在进行中,可能原因是已经发起了迁移任务还未结束。
### 处理步骤
请检查是否已经发起了迁移并未结束。
## 3 序列化对象失败
### 错误信息
Failed to flatten the object.
### 可能原因
该错误码表示对象序列化过程中出现错误,可能原因是系统参数DMS_PROXY_INTERFACE_TOKEN序列化写失败。
### 处理步骤
请检查系统功能是否正常或者重启。
## 7 空对象
### 错误信息
The object is null.
### 可能原因
该错误码表示接口依赖的服务对象或参数对象为空,可能原因如下。
1. 入参序列化读失败。
2. DMS服务没有正常启动或binder对象无法正常获取。
3. DMS依赖的其他服务没有正常启动或者binder对象无法获取。
### 处理步骤
1. 检查入参是否为有效合法值。
2. 检查DMS服务是否正常启动,重新启动服务或重启设备。
3. 检查DMS依赖的其他服务是否正常启动,重新启动服务或重启设备。
## 29360207 注册超出最大次数
### 错误信息
The maximum number of registrations exceeded.
### 可能原因
该错误码可能原因是设备频繁注册,次数超出最大次数限制。
### 处理步骤
重启服务并且避免频繁注册。
## 29360208 token未注册
### 错误信息
The token has not registered.
### 可能原因
该错误码可能原因是未注册token。
### 处理步骤
注册token并使用已注册的token。
## 29360209 callback已注册
### 错误信息
Callback has been registered.
### 可能原因
该错误码能原因是指定的callback已经注册过。
### 处理步骤
请勿使用相同的callback重复注册。
## 29360210 callback未注册
### 错误信息
Callback has not been registered.
### 可能原因
该错误码可能原因是指定的callback未注册。
### 处理步骤
注册callback并使用已注册的callback。
## 29360211 连接ability失败
### 错误信息
Failed to connect ability.
### 可能原因
该错误码可能原因是指定token连接ability失败。
### 处理步骤
检查token是否有效以及相应ability是否正常服务,重新启动服务或重启设备。
## 29360214 callback类型错误
### 错误信息
The type of callback is not supported.
### 可能原因
该错误码表示callback类型错误,可能原因是不支持传入的callback类型。
### 处理步骤
请使用系统支持的callback类型并传入。
## 29360215 无效的连接状态
### 错误信息
Invalid continuation mode.
### 可能原因
该错误码表示无效的连接状态,可能原因是入参DeviceConnectState为非指定值。
### 处理步骤
设置指定合法的DeviceConnectState值。
## 29360216 无效的流转模式
### 错误信息
Invalid continuation mode.
### 可能原因
该错误码可能原因是入参ContinuationExtraParams.continuationMode为非指定值。
### 处理步骤
设置指定合法的ContinuationExtraParams.continuationMode值。
# 泛sensor子系统错误码
## 14500101 传感器服务异常
### 错误信息
Service exception.
### 错误描述
当调用sensor模块on、once、off接口时,若hdi服务异常,会报此错误码。
### 可能原因
访问hdi服务状态异常。
### 处理步骤
1. 定时重试操作,如间隔1s或者按照指数增长间隔重试。
2. 连续重试3次不可用则停止尝试,期间可优先尝试获取器件列表方式进一步获取设备可用性。
## 14600101 操作设备失败
### 错误信息
Device operation failed.
### 错误描述
当调用vibrator模块startVibration接口时,若hdi服务异常或者设备被占用,会报此错误码。
### 可能原因
1. 访问hdi服务状态异常。
2. 当前设备被占用。
### 处理步骤
1. 间隔一段时间重试操作,或按指数增长间隔重试;连续重试3次不可用则停止尝试,期间可优先尝试获取器件列表方式进一步获取设备可用性。
2. 设置振动优先级较低,尝试设置更高优先级。
\ No newline at end of file
......@@ -143,5 +143,7 @@
| ohos.permission.securityguard.REPORT_SECURITY_INFO | system_basic | system_grant | FALSE | 允许应用上报风险数据至设备风险管理平台。 |
| ohos.permission.securityguard.REQUEST_SECURITY_MODEL_RESULT | system_basic | system_grant | TRUE | 允许应用获取设备风险状态。 |
| ohos.permission.securityguard.REQUEST_SECURITY_EVENT_INFO | system_core | system_grant | FALSE | 允许应用获取风险详细数据。 |
| ohos.permission.READ_ACCESSIBILITY_CONFIG | system_basic | system_grant | FALSE | 允许应用读取无障碍配置信息。 |
| ohos.permission.WRITE_ACCESSIBILITY_CONFIG | system_basic | system_grant | FALSE | 允许应用设置无障碍配置信息。 |
| ohos.permission.ACCESS_CERT_MANAGER_INTERNAL | system_basic | system_grant | FALSE | 允许应用进行证书及凭据的安装、卸载、启用、禁用等操作。 |
| ohos.permission.ACCESS_CERT_MANAGER | normal | system_grant | FALSE | 允许应用进行私有凭据的相关操作、查询证书状态等操作。 |
......@@ -626,44 +626,44 @@
- [数据类型说明](reference/arkui-js/js-appendix-types.md)
- JS服务卡片UI组件参考
- JS服务卡片UI框架说明
- [文件组织](reference/js-service-widget-ui/js-service-widget-file.md)
- 语法
- [HML语法参考](reference/js-service-widget-ui/js-service-widget-syntax-hml.md)
- [CSS语法参考](reference/js-service-widget-ui/js-service-widget-syntax-css.md)
- [配置数据和事件](reference/js-service-widget-ui/js-service-widget-configuration.md)
- [多语言支持](reference/js-service-widget-ui/js-service-widget-multiple-languages.md)
- [低版本兼容](reference/js-service-widget-ui/js-service-widget-version-compatibility.md)
- [文件组织](reference/js-service-widget-ui/js-service-widget-file.md)
- 语法
- [HML语法参考](reference/js-service-widget-ui/js-service-widget-syntax-hml.md)
- [CSS语法参考](reference/js-service-widget-ui/js-service-widget-syntax-css.md)
- [配置数据和事件](reference/js-service-widget-ui/js-service-widget-configuration.md)
- [多语言支持](reference/js-service-widget-ui/js-service-widget-multiple-languages.md)
- [低版本兼容](reference/js-service-widget-ui/js-service-widget-version-compatibility.md)
- 组件
- 通用
- [通用属性](reference/js-service-widget-ui/js-service-widget-common-attributes.md)
- [通用样式](reference/js-service-widget-ui/js-service-widget-common-styles.md)
- [通用事件](reference/js-service-widget-ui/js-service-widget-common-events.md)
- [渐变样式](reference/js-service-widget-ui/js-service-widget-common-gradient.md)
- [媒体查询](reference/js-service-widget-ui/js-service-widget-common-mediaquery.md)
- [自定义字体样式](reference/js-service-widget-ui/js-service-widget-common-customizing-font.md)
- [无障碍](reference/js-service-widget-ui/js-service-widget-common-accessibility.md)
- [原子布局](reference/js-service-widget-ui/js-service-widget-common-atomic-layout.md)
- 容器组件
- [div](reference/js-service-widget-ui/js-service-widget-container-div.md)
- [list](reference/js-service-widget-ui/js-service-widget-container-list.md)
- [list-item](reference/js-service-widget-ui/js-service-widget-container-list-item.md)
- [stack](reference/js-service-widget-ui/js-service-widget-container-stack.md)
- [swiper](reference/js-service-widget-ui/js-service-widget-container-swiper.md)
- 基础组件
- [button](reference/js-service-widget-ui/js-service-widget-basic-button.md)
- [calendar](reference/js-service-widget-ui/js-service-widget-basic-calendar.md)
- [chart](reference/js-service-widget-ui/js-service-widget-basic-chart.md)
- [clock](reference/js-service-widget-ui/js-service-widget-basic-clock.md)
- [divider](reference/js-service-widget-ui/js-service-widget-basic-divider.md)
- [image](reference/js-service-widget-ui/js-service-widget-basic-image.md)
- [input](reference/js-service-widget-ui/js-service-widget-basic-input.md)
- [progress](reference/js-service-widget-ui/js-service-widget-basic-progress.md)
- [span](reference/js-service-widget-ui/js-service-widget-basic-span.md)
- [text](reference/js-service-widget-ui/js-service-widget-basic-text.md)
- 通用
- [通用属性](reference/js-service-widget-ui/js-service-widget-common-attributes.md)
- [通用样式](reference/js-service-widget-ui/js-service-widget-common-styles.md)
- [通用事件](reference/js-service-widget-ui/js-service-widget-common-events.md)
- [渐变样式](reference/js-service-widget-ui/js-service-widget-common-gradient.md)
- [媒体查询](reference/js-service-widget-ui/js-service-widget-common-mediaquery.md)
- [自定义字体样式](reference/js-service-widget-ui/js-service-widget-common-customizing-font.md)
- [无障碍](reference/js-service-widget-ui/js-service-widget-common-accessibility.md)
- [原子布局](reference/js-service-widget-ui/js-service-widget-common-atomic-layout.md)
- 容器组件
- [div](reference/js-service-widget-ui/js-service-widget-container-div.md)
- [list](reference/js-service-widget-ui/js-service-widget-container-list.md)
- [list-item](reference/js-service-widget-ui/js-service-widget-container-list-item.md)
- [stack](reference/js-service-widget-ui/js-service-widget-container-stack.md)
- [swiper](reference/js-service-widget-ui/js-service-widget-container-swiper.md)
- 基础组件
- [button](reference/js-service-widget-ui/js-service-widget-basic-button.md)
- [calendar](reference/js-service-widget-ui/js-service-widget-basic-calendar.md)
- [chart](reference/js-service-widget-ui/js-service-widget-basic-chart.md)
- [clock](reference/js-service-widget-ui/js-service-widget-basic-clock.md)
- [divider](reference/js-service-widget-ui/js-service-widget-basic-divider.md)
- [image](reference/js-service-widget-ui/js-service-widget-basic-image.md)
- [input](reference/js-service-widget-ui/js-service-widget-basic-input.md)
- [progress](reference/js-service-widget-ui/js-service-widget-basic-progress.md)
- [span](reference/js-service-widget-ui/js-service-widget-basic-span.md)
- [text](reference/js-service-widget-ui/js-service-widget-basic-text.md)
- 自定义组件
- [自定义组件基本用法](reference/js-service-widget-ui/js-service-widget-custom-basic-usage.md)
- [自定义事件](reference/js-service-widget-ui/js-service-widget-custom-events.md)
- [Props](reference/js-service-widget-ui/js-service-widget-custom-props.md)
- [自定义组件基本用法](reference/js-service-widget-ui/js-service-widget-custom-basic-usage.md)
- [自定义事件](reference/js-service-widget-ui/js-service-widget-custom-events.md)
- [Props](reference/js-service-widget-ui/js-service-widget-custom-props.md)
- [数据类型说明](reference/js-service-widget-ui/js-service-widget-appendix-types.md)
- 接口参考(JS及TS API)
- [开发说明](reference/apis/development-intro.md)
......
......@@ -46,15 +46,25 @@
- 校验输入只包含可接受的字符(“白名单”形式),尤其需要注意一些特殊情况下的特殊字符。
**外部数据校验原则**
**1.信任边界**
由于外部数据不可信,因此系统在运行过程中,如果数据传输与处理跨越不同的信任边界,为了防止攻击蔓延,必须对来自信任边界外的其他模块的数据进行合法性校验。
(a)so(或者dll)之间
so或dll作为独立的第三方模块,用于对外导出公共的api函数,供其他模块进行函数调用。so/dll无法确定上层调用者是否传递了合法参数,因此so/dll的公共函数需要检查调用者提供参数的合法性。so/dll应该设计成低耦合、高复用性,尽管有些软件的so/dll当前设计成只在本软件中使用,但仍然应该将不同的so/dll模块视为不同的信任边界。
(b)进程与进程之间
为防止通过高权限进程提权,进程与进程之间的IPC通信(包括单板之间的IPC通信、不同主机间的网络通信),应视为不同信任边界。
(c)应用层进程与操作系统内核
操作系统内核具有比应用层更高的权限,内核向应用层提供的接口,应该将来自应用层的数据作为不可信数据处理。
(d)可信执行环境内外环境
为防止攻击蔓延至可信执行环境,TEE、SGX等对外提供的接口,应该将来自外部的数据作为不可信数据处理。
**2.外部数据校验**
......@@ -2746,7 +2756,7 @@ int Encode(unsigned char *in, size_t inSize, unsigned char *out, size_t maxSize)
**【描述】**
**说明:**内核 mmap接口中,经常使用remap_pfn_range()函数将设备物理内存映射到用户进程空间。如果映射起始地址等参数由用户态控制并缺少合法性校验,将导致用户态可通过映射读写任意内核地址。如果攻击者精心构造传入参数,甚至可在内核中执行任意代码。
**说明**内核 mmap接口中,经常使用remap_pfn_range()函数将设备物理内存映射到用户进程空间。如果映射起始地址等参数由用户态控制并缺少合法性校验,将导致用户态可通过映射读写任意内核地址。如果攻击者精心构造传入参数,甚至可在内核中执行任意代码。
**【错误代码示例】**
......@@ -2876,7 +2886,7 @@ ssize_t correct_write(struct file *file, const char __user *user_buf, size_t cou
## 必须对copy_from_user()拷贝长度进行校验,防止缓冲区溢出
**说明:**内核态从用户态拷贝数据时通常使用copy_from_user()函数,如果未对拷贝长度做校验或者校验不当,会造成内核缓冲区溢出,导致内核panic或提权。
**说明**内核态从用户态拷贝数据时通常使用copy_from_user()函数,如果未对拷贝长度做校验或者校验不当,会造成内核缓冲区溢出,导致内核panic或提权。
**【错误代码示例】**
......@@ -2921,7 +2931,7 @@ static long gser_ioctl(struct file *fp, unsigned cmd, unsigned long arg)
**【描述】**
**说明:**内核态使用copy_to_user()向用户态拷贝数据时,当数据未完全初始化(如结构体成员未赋值、字节对齐引起的内存空洞等),会导致栈上指针等敏感信息泄漏。攻击者可利用绕过kaslr等安全机制。
**说明**内核态使用copy_to_user()向用户态拷贝数据时,当数据未完全初始化(如结构体成员未赋值、字节对齐引起的内存空洞等),会导致栈上指针等敏感信息泄漏。攻击者可利用绕过kaslr等安全机制。
**【错误代码示例】**
......
# xxx *(子系统名)* 错误码
> **说明:**
>
> *1、所有的写作说明,在完成写作后,都要删除。*
>
> *2、错误码文档的命名规则:统一前缀,命名格式为errorcode-xxx(具体子系统名).md。*
| | 说明项 | 细则 |
| ---- | ------------------------------ | ------------------------------------------------------------ |
| 1 | 错误码error.errorNumber | 按统一的错误码编号规则设计错误码ID。 |
| 2 | 错误信息error.message | **字段含义**:出现异常时,会给开发者抛出一个错误对象,对象里包括errorNumber和error.message,此处定义error.message的值,即英文错误码简述。<br/>**要求**<br/>1.应当简洁、具体,避免过于宽泛的定义。<br/>2.此处英文描述必须经过翻译中心审校。在提交本错误码设计评审前,请将预期的中英文message描述提供给翻译中心,将翻译中心审校后的英文填至此处。 |
| 3 | 错误简述<br/>Short Description | **字段含义**:中文错误码简述。<br/>**要求**<br/>1.与”错误信息“对应的中文简述,应当简洁、具体,避免过于宽泛的定义。 |
| 4 | 错误描述<br/>Description | **字段含义**:错误码详细描述,告知错误码所属的业务场景、产生位置等。<br/>**要求**<br/>1.描述错误码所属的业务场景(比如开发xx业务、开发xx功能时)。<br/>2.描述出现异常的具体现象、产生位置(比如xx模块、xx类、xx接口等),辅助开发者理解和处理异常。 |
| 5 | 可能原因<br/>Possible Causes | **字段含义**:列举出现该异常的所有可能原因(对应该错误码的产生机制)。<br/>**要求**<br/>1.全面、无遗漏。<br/>2.言简意赅。<br/>3.根据可能性从高到低排序。 |
| 6 | 处理步骤<br/>Procedure | **字段含义**:根据错误现象及可能原因,告知开发者遇到该异常时如何应对。<br/>**要求**<br/>1.采用step样式描述处理指导。每个大步骤与可能原因一一对应,按顺序分别给出各原因对应的处理指导。大步骤下可以有子步骤。<br/>2.步骤要明确、具体、可执行。涉及判断的,提供明确的判断标准。<br/>3.对系统或业务有影响的操作,在操作前以“注意”或“警告”形式提供警示信息。具体提示要求,请参见“风格指南”中的“提示与说明”:https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/style-guide/style-guide-content-elements.md |
## 1300001 重复操作 *(错误码number+空格+错误简述)*
### 错误信息
This is repeat operation.
### 错误描述
> **说明:**
>
> *1.描述**错误码所属的业务场景(比如开发xx业务、开发xx功能时)***。
>
> *2.描述**出现异常的具体现象、产生位置(比如xx模块、xx类、xx接口等)**,辅助开发者理解和处理异常。*
当对同一窗口对象存在重复操作时,xx模块(或xx类,或xx接口)会上报此错误码。
### 可能原因
> **说明:**
>
> *列举出现该异常的所有可能原因(对应该错误码的产生机制)。*
>
> *1.全面、无遗漏。*
>
> *2.言简意赅。*
>
> *3.根据可能性从高到低排序。*
1. 重复创建已创建的窗口。
2. xxx。
### 处理步骤
> **说明:**
>
> *根据错误现象及可能原因,告知开发者遇到该异常时如何应对。*
>
> *1.采用step样式描述处理指导。**每个大步骤与可能原因一一对应**,按顺序分别给出各原因对应的处理指导。**大步骤下可以有子步骤**。*
>
> *2.步骤要**明确、具体、可执行。涉及判断的,提供明确的判断标准**。*
>
> *3.对系统或业务有影响的操作,在操作前以“注意”或“警告”形式提供警示信息。具体提示要求,请参见“风格指南”中的“提示与说明”:https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/style-guide/style-guide-content-elements.md*
1. 检查该窗口是否已创建。
xxx。
```
uth([in] String appId, [in] IHwShareCallback callback);
int shareFaInfo([in] PacMapEx pacMapEx);
}
```
2. xxx。
a. xxx。
```
uth([in] String appId, [in] IHwShareCallback callback);
int shareFaInfo([in] PacMapEx pacMapEx);
}
```
b. xxx。
## 1300002 窗口状态异常
### 错误信息
xxx
### 错误描述
xxx
### 可能原因
1. xxx
### 处理步骤
1. 检查该窗口是否已创建。
xxx。
```
uth([in] String appId, [in] IHwShareCallback callback);
int shareFaInfo([in] PacMapEx pacMapEx);
}
```
2. xxx。
a. xxx。
```
uth([in] String appId, [in] IHwShareCallback callback);
int shareFaInfo([in] PacMapEx pacMapEx);
}
```
b. xxx。
\ No newline at end of file
......@@ -2,7 +2,7 @@
## 常见编译问题和解决方法
### 编译构建过程中,提示“usr/sbin/ninja: invalid option -- w”
### 提示“usr/sbin/ninja: invalid option -- w”
- **现象描述:** 编译失败,提示“usr/sbin/ninja: invalid option -- w”。
......@@ -10,7 +10,7 @@
- **解决办法:** 卸载环境中ninja和gn,按照[获取工具](../../device-dev/get-code/gettools-ide.md)
### 编译构建过程中,提示“/usr/bin/ld: cannot find -lncurses”
### 提示“/usr/bin/ld: cannot find -lncurses”
- **现象描述:** 编译失败,提示“/usr/bin/ld: cannot find -lncurses”。
......@@ -22,7 +22,7 @@
sudo apt-get install lib32ncurses5-dev
```
### 编译构建过程中,提示“line 77: mcopy: command not found”
### 提示“line 77: mcopy: command not found”
- **现象描述:** 编译失败,提示“line 77: mcopy: command not found”。
......@@ -34,7 +34,7 @@
sudo apt-get install dosfstools mtools
```
### 编译构建过程中,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”
### 提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”
- **现象描述:** 编译失败,提示“riscv32-unknown-elf-gcc: error trying to exec 'cc1': execvp: No such file or directory”。
......@@ -48,7 +48,7 @@
使用chmod命令修改目录权限为755。
### 编译构建过程中,提示“No module named 'Crypto'”
### 提示“No module named 'Crypto'”
- **现象描述:** 编译失败,提示“No module named 'Crypto'”。
......@@ -68,7 +68,7 @@
sudo pip3 install pycryptodome
```
### 编译构建过程中,提示“xx.sh : xx unexpected operator”
### 提示“xx.sh : xx unexpected operator”
- **现象描述:** 编译失败:“xx.sh [: xx unexpected operator”。
......@@ -82,7 +82,7 @@
```
### 编译构建过程中,提示“some services are not authenticated. Listed as follow”
### 提示“some services are not authenticated. Listed as follow”
- **现象描述:** 编译失败:“some services are not authenticated. Listed as follow”。
......
......@@ -6,7 +6,7 @@
- 根据产品配置可以按照组件组装打包产品需要的能力。
## 基本概念<a name="section175012297491"></a>
## 简介<a name="section175012297491"></a>
在了解编译构建子系统的能力前,应了解如下基本概念:
......@@ -31,6 +31,51 @@
ninja是一个专注于速度的小型构建系统。
## 目录
```text
/build # 编译构建主目录
├── __pycache__
├── build_scripts/ # 编译相关的python脚本
├── common/
├── config/ # 编译相关的配置项
├── core
│ ├── gn/ # 编译入口BUILD.gn配置
│ └── build_scripts/
├── docs
├── gn_helpers.py*
├── lite/ # hb和preloader入口
├── misc/
├── ohos # OpenHarmony编译打包流程配置
│ ├── kits # kits编译打包模板和处理流程
│ ├── ndk # ndk模板和处理流程
│ ├── notice # notice模板和处理流程
│ ├── packages # 版本打包模板和处理流程
│ ├── sa_profile # sa模板和处理流程
│ ├── sdk # sdk模板和处理流程,包括sdk中包含的模块配置
│ └── testfwk # 测试相关的处理
├── ohos.gni* # 汇总了常用的gni文件,方便各个模块一次性import
├── ohos_system.prop
├── ohos_var.gni*
├── prebuilts_download.sh* # 预编译脚本
├── print_python_deps.py*
├── scripts/
├── subsystem_config.json
├── subsystem_config_example.json
├── templates/ # c/c++编译模板定义
├── test.gni*
├── toolchain # 编译工具链配置
├── tools # 常用工具
├── version.gni
├── zip.py*
```
**图 1** 编译构建子系统架构图<a name="fig16488143010409"></a>
![](figures/build_framework_ZN.png "编译构建子系统架构图")
## 运作机制<a name="section193961322175011"></a>
OpenHarmony侧的编译构建流程主要包括以下三个步骤:
......@@ -51,9 +96,7 @@ OpenHarmony侧的编译构建流程主要包括以下三个步骤:
## 相关仓<a name="section44651652878"></a>
**编译构建子系统**
[build\_lite](https://gitee.com/openharmony/build_lite)
[build\_lite](https://gitee.com/openharmony/build_lite/blob/master/README_zh.md)
[build](https://gitee.com/openharmony/build)
[build](https://gitee.com/openharmony/build/blob/master/README_zh.md)
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册