未验证 提交 b733f452 编写于 作者: O openharmony_ci 提交者: Gitee

!18439 FAQ更新+website修改

Merge pull request !18439 from zengyawen/master
......@@ -5,7 +5,6 @@
- [HTTP数据请求](http-request.md)
- [WebSocket连接](websocket-connection.md)
- [Socket连接](socket-connection.md)
- [策略管理](net-policy-management.md)
- [网络共享](net-sharing.md)
- [以太网连接](net-ethernet.md)
- [网络连接管理](net-connection-manager.md)
......
# 网络策略管理部件
## 简介
网络策略管理提供一些限制网络的基础能力,包括蜂窝网络策略、休眠/省电模式策略、后台网络策略、重置网络策略等功能。
> **说明:**
> 为了保证应用的运行效率,大部分API调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用callback函数,更多方式可以查阅[API参考](../reference/apis/js-apis-net-policy.md)。
## 基本概念
- 休眠模式:设备在不需要工作的时候把一些部件、外设关掉(进入低功耗模式),并限制部分应用对网络的访问。
- 省电模式:省电模式是系统里的一个开关,开启后会降低设备的性能,并限制部分应用对网络的访问。
- 省流量模式:即后台网络策略,对处于后台的使用计量网络的应用进行限制。
- 蜂窝网络:移动通信网络。
- 计量网络:设置了流量配额的电话卡网络、Wlan网络以及以太网。
## 约束
- 开发语言:C++ JS
- 系统:linux内核
- 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
## 场景介绍
网络策略管理的典型场景有:
- 设置计量网络配额/获取已经设置的计量网络策略
- 后台网络限制开关/获取后台网络限制状态/获取指定uid在后台状态下能否访问网络
- 设定指定uid访问计量网络的策略/获取指定uid访问计量网络的策略/获取设置了对应策略的uids
- 重置网络策略
- 判断uid能否访问计量/非计量网络
- 将对应uid从休眠白名单里添加、移除/获取休眠模式的白名单列表
- 将对应uid从省电白名单里添加、移除/获取省电模式的白名单列表
- 更新网络提醒策略
以下分别介绍具体开发方式。
## 接口说明
完整的JS API说明以及实例代码请参考:[网络策略管理](../reference/apis/js-apis-net-policy.md)
| 类型 | 接口 | 功能说明 |
| ---- | ---- | ---- |
| ohos.net.policy | function setBackgroundPolicy(isAllowed: boolean, callback: AsyncCallback\<void>): void |设置后台网络策略,使用callback方式作为异步方法 |
| ohos.net.policy | function isBackgroundAllowed(callback: AsyncCallback\<boolean>): void; |获取后台网络策略,使用callback方式作为异步方法 |
| ohos.net.policy | function setPolicyByUid(uid: number, policy: NetUidPolicy, callback: AsyncCallback\<void>): void; |设置对应uid应用的访问计量网络的策略,使用callback方式作为异步方法 |
| ohos.net.policy | function getPolicyByUid(uid: number, callback: AsyncCallback\<NetUidPolicy>): void;| 通过应用uid获取策略,使用callback方式作为异步方法 |
| ohos.net.policy | function getUidsByPolicy(policy: NetUidPolicy, callback: AsyncCallback\<Array\<number>>): void; | 通过策略获取设置这一策略的应用uid数组,使用callback方式作为异步方法 |
| ohos.net.policy | function getNetQuotaPolicies(callback: AsyncCallback\<Array\<NetQuotaPolicy>>): void; |获取计量网络策略,使用callback方式作为异步方法 |
| ohos.net.policy | function setNetQuotaPolicies(quotaPolicies: Array\<NetQuotaPolicy>, callback: AsyncCallback\<void>): void; |设置计量网络策略,使用callback方式作为异步方法 |
| ohos.net.policy | function restoreAllPolicies(iccid: string, callback: AsyncCallback\<void>): void; | 重置对应sim卡id的蜂窝网络、后台网络策略、防火墙策略、应用对应的策略,使用callback方式作为异步方法 |
| ohos.net.policy | function isUidNetAllowed(uid: number, isMetered: boolean, callback: AsyncCallback\<boolean>): void; | 获取对应uid能否访问计量或非计量网络,使用callback方式作为异步方法 |
| ohos.net.policy | function isUidNetAllowed(uid: number, iface: string, callback: AsyncCallback\<boolean>): void; | 获取对应uid能否访问指定的iface的网络,使用callback方式作为异步方法 |
| ohos.net.policy | function setDeviceIdleAllowList(uid: number, isAllowed: boolean, callback: AsyncCallback\<void>): void; | 设置指定uid应用是否在休眠防火墙的白名单,使用callback方式作为异步方法 |
| ohos.net.policy | function getDeviceIdleAllowList(callback: AsyncCallback\<Array\<number>>): void; | 获取休眠模式白名单所包含的uid数组,使用callback方式作为异步方法 |
| ohos.net.policy | function getBackgroundPolicyByUid(uid: number, callback: AsyncCallback\<NetBackgroundPolicy>): void; | 获取指定uid能否访问后台网络,使用callback方式作为异步方法 |
| ohos.net.policy | function resetPolicies(iccid: string, callback: AsyncCallback\<void>): void; | 重置对应sim卡id的蜂窝网络、后台网络策略、防火墙策略、应用对应的策略,使用callback方式作为异步方法 |
| ohos.net.policy | function updateRemindPolicy(netType: NetBearType, iccid: string, remindType: RemindType, callback: AsyncCallback\<void>): void; | 更新提醒策略,使用callback方式作为异步方法 |
| ohos.net.policy | function setPowerSaveAllowList(uid: number, isAllowed: boolean, callback: AsyncCallback\<void>): void; | 设置指定uid应用是否在省电防火墙的白名单,使用callback方式作为异步方法 |
| ohos.net.policy | function getPowerSaveAllowList(callback: AsyncCallback\<Array\<number>>): void; | 获取省电模式白名单所包含的uid数组,使用callback方式作为异步方法 |
| ohos.net.policy | function on(type: "netUidPolicyChange", callback: Callback\<{ uid: number, policy: NetUidPolicy }>): void; | 订阅policy发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function off(type: "netUidPolicyChange", callback: Callback\<{ uid: number, policy: NetUidPolicy }>): void; | 取消订阅policy发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function on(type: "netUidRuleChange", callback: Callback\<{ uid: number, rule: NetUidRule }>): void; | 订阅rule发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function off(type: "netUidRuleChange", callback: Callback\<{ uid: number, rule: NetUidRule }>): void; | 取消订阅rule发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function on(type: "netMeteredIfacesChange", callback: Callback\<Array\<string>>): void; | 订阅计量iface发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function off(type: "netMeteredIfacesChange", callback: Callback\<Array\<string>>): void; | 取消订阅计量iface发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function on(type: "netQuotaPolicyChange", callback: Callback\<Array\<NetQuotaPolicy>>): void; | 订阅计量网络策略发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function off(type: "netQuotaPolicyChange", callback: Callback\<Array\<NetQuotaPolicy>>): void; | 取消订阅计量网络策略发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function on(type: "netBackgroundPolicyChange", callback: Callback\<boolean>): void; | 订阅后台网络策略发生改变时的回调,使用callback方式作为异步方法 |
| ohos.net.policy | function off(type: "netBackgroundPolicyChange", callback: Callback\<boolean>): void; | 取消订阅后台网络策略发生改变时的回调,使用callback方式作为异步方法 |
## 设置计量网络配额/获取已经设置的计量网络策略
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用setNetQuotaPolicies方法,设置计量网络策略。
3. 调用getNetQuotaPolicies方法,获取计量网络策略。
```js
// 引入包名
import policy from '@ohos.net.policy';
addNetQuotaPolicy(){
let param = {
// netType值详见 [NetBearType](../reference/apis/js-apis-net-connection.md#netbeartype)
netType:Number.parseInt(this.netType),
// 计量蜂窝网络的SIM卡的标识值。以太网,wifi网络不会用到
iccid:this.iccid,
// 计量蜂窝网络中配合iccid联合使用。以太网,wifi网络单独使用。用于标记类型
ident:this.ident,
// 计量开始时间。例如M1、D1、Y1等
periodDuration:this.periodDuration,
// 发出警告的流量阈值 大于0的整数即可
warningBytes:Number.parseInt(this.warningBytes),
// 流量设置的配额 大于0的整数即可
limitBytes:Number.parseInt(this.limitBytes),
// 是否为计量网络 true为计量网络 false为非计量网络
metered:Boolean(Number.parseInt(this.metered)),https://gitee.com/openharmony/docs/pulls/14404
// 到达流量限制后的动作 详见[LimitAction](../reference/apis/js-apis-net-policy.md#limitaction)
limitAction:Number.parseInt(this.limitAction)
};
this.netQuotaPolicyList.push(param);
},
// 订阅计量网络iface发生改变时的回调
policy.on('netMeteredIfacesChange', (data) => {
this.log('on netMeteredIfacesChange:' + JSON.stringify(data));
});
// 订阅计量网络策略发生改变时的回调
policy.on('netQuotaPolicyChange', (data) => {
this.log('on netQuotaPolicyChange:' + JSON.stringify(data));
});
// 调用setNetQuotaPolicies方法,设置计量网络策略
setNetQuotaPolicies(){
this.dialogType = DialogType.HIDE;
policy.setNetQuotaPolicies(this.netQuotaPolicyList, (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用getNetQuotaPolicies方法,获取计量网络策略
getNetQuotaPolicies(){
policy.getNetQuotaPolicies((err, data) => {
this.callBack(err, data);
if(data){
this.netQuotaPolicyList = data;
}
});
},
// 取消订阅计量网络iface发生改变时的回调
policy.off('netMeteredIfacesChange', (data) => {
this.log('off netMeteredIfacesChange:' + JSON.stringify(data));
});
// 取消订阅计量网络策略发生改变时的回调
policy.off('netQuotaPolicyChange', (data) => {
this.log('off netQuotaPolicyChange:' + JSON.stringify(data));
});
```
## 后台网络限制开关/获取后台网络限制状态/获取指定uid在后台状态下能否访问网络
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用setBackgroundAllowed方法,设置开启后台省流量或关闭后台省流量。
3. 调用isBackgroundAllowed方法,获取后台网络限制状态(省流量)是开启还是关闭。
4. 调用getBackgroundPolicyByUid方法,获取指定uid在后台状态下能否访问网络。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 订阅后台网络策略发生改变时的回调
policy.on('netBackgroundPolicyChange', (data) => {
this.log('on netBackgroundPolicyChange:' + JSON.stringify(data));
});
// 调用setBackgroundAllowed方法,设置开启后台省流量或关闭后台省流量
setBackgroundAllowed() {
policy.setBackgroundAllowed(Boolean(Number.parseInt(this.isBoolean)), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用isBackgroundAllowed方法,获取后台网络限制状态(省流量)是开启还是关闭。
isBackgroundAllowed() {
policy.isBackgroundAllowed((err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用getBackgroundPolicyByUid方法,获取指定uid在后台状态下能否访问网络。
getBackgroundPolicyByUid() {
policy.getBackgroundPolicyByUid(Number.parseInt(this.firstParam), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 取消订阅后台网络策略发生改变时的回调
policy.off('netBackgroundPolicyChange', (data) => {
this.log('off netBackgroundPolicyChange:' + JSON.stringify(data));
});
```
## 设定指定uid访问计量网络的策略/获取指定uid访问计量网络的策略/获取设置了对应策略的uids
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用setPolicyByUid方法,设置指定uid是否可以访问后台网络。
3. 调用getPolicyByUid方法,获取指定uid的策略。
4. 调用getUidsByPolicy方法,获取使用指定策略的uids。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 订阅uid的policy发生改变时的回调
policy.on('netUidPolicyChange', (data) => {
this.log('on netUidPolicyChange:' + JSON.stringify(data));
});
// 订阅uid的rule发生改变时的回调
policy.on('netUidRuleChange', (data) => {
this.log('on netUidRuleChange:' + JSON.stringify(data));
});
// 调用setPolicyByUid方法,设置指定uid是否可以访问后台网络
setPolicyByUid() {
let param = {
uid: Number.parseInt(this.firstParam), policy: Number.parseInt(this.currentNetUidPolicy)
}
policy.setPolicyByUid(Number.parseInt(this.firstParam), Number.parseInt(this.currentNetUidPolicy), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用getPolicyByUid方法,获取指定uid的策略
getPolicyByUid() {
policy.getPolicyByUid(Number.parseInt(this.firstParam), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用getUidsByPolicy方法,获取使用指定策略的uids
getUidsByPolicy(){
policy.getUidsByPolicy(Number.parseInt(this.currentNetUidPolicy), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 取消订阅uid的policy发生改变时的回调
policy.off('netUidPolicyChange', (data) => {
this.log('off netUidPolicyChange:' + JSON.stringify(data));
});
// 取消订阅uid的rule发生改变时的回调
policy.off('netUidRuleChange', (data) => {
this.log('off netUidRuleChange:' + JSON.stringify(data));
});
```
## 重置网络策略
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用restoreAllPolicies方法,重置网络策略。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 调用restoreAllPolicies方法,重置网络策略
restoreAllPolicies(){
policy.restoreAllPolicies(this.firstParam, (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
```
## 判断uid能否访问计量/非计量网络
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用isUidNetAllowed方法,获取uid能否访问计量/非计量网络。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 调用isUidNetAllowed方法,获取uid能否访问计量/非计量网络
isUidNetAllowedIsMetered(){
let param = {
uid: Number.parseInt(this.firstParam), isMetered: Boolean(Number.parseInt(this.isBoolean))
}
policy.isUidNetAllowed(Number.parseInt(this.firstParam), Boolean(Number.parseInt(this.isBoolean)), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
```
## 将对应uid从休眠白名单里添加、移除/获取休眠模式的白名单列表
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用setDeviceIdleAllowList方法,设置uid是否添加到休眠模式白名单。
3. 调用getDeviceIdleAllowList方法,获取添加在休眠模式白名单的uids。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 调用setDeviceIdleAllowList方法,设置uid是否添加到休眠模式白名单
setDeviceIdleAllowList(){
let param = {
uid: Number.parseInt(this.firstParam), isAllowed: Boolean(Number.parseInt(this.isBoolean))
}
policy.setDeviceIdleAllowList(Number.parseInt(this.firstParam), Boolean(Number.parseInt(this.isBoolean)), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用getDeviceIdleAllowList方法,获取添加在休眠模式白名单的uids
getDeviceIdleAllowList(){
policy.getDeviceIdleAllowList((err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
```
## 将对应uid从省电白名单里添加、移除/获取省电模式的白名单列表
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用setPowerSaveAllowList方法,设置uid是否添加到省电模式白名单。
3. 调用getPowerSaveAllowList方法,获取添加在省电模式白名单的uids。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 调用setPowerSaveAllowList方法,设置uid是否添加到省电模式白名单
setPowerSaveAllowList(){
let param = {
uid: Number.parseInt(this.firstParam), isAllowed: Boolean(Number.parseInt(this.isBoolean))
}
policy.setPowerSaveAllowList(Number.parseInt(this.firstParam), Boolean(Number.parseInt(this.isBoolean)), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
// 调用getPowerSaveAllowList方法,获取添加在省电模式白名单的uids
getPowerSaveAllowList(){
policy.getPowerSaveAllowList((err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
```
## 更新网络提醒策略
### 开发步骤
1. 从@ohos.net.policy.d.ts中导入policy命名空间。
2. 调用updateRemindPolicy,更新网络提醒策略。
```js
// 引入包名
import policy from '@ohos.net.policy'
// 调用updateRemindPolicy,更新网络提醒策略
updateRemindPolicy() {
let param = {
netType: Number.parseInt(this.netType), iccid: this.firstParam, remindType: this.currentRemindType
}
policy.updateRemindPolicy(Number.parseInt(this.netType), this.firstParam, Number.parseInt(this.currentRemindType), (err, data) => {
console.log(JSON.stringify(err))
console.log(JSON.stringify(data))
});
},
```
\ No newline at end of file
......@@ -3,8 +3,13 @@
- [如何编译full-SDK](full-sdk-compile-guide.md)
- [如何替换full-SDK](full-sdk-switch-guide.md)
- [Ability开发常见问题](faqs-ability.md)
- [ArkUI框架开发常见问题](faqs-arkui.md)
- [ArkUI开发框架开发-ArkTS语法常见问题](faqs-arkui-arkts.md)
- ArkUI框架开发常见问题(ArkTS)
- [ArkTS语法使用常见问题](faqs-arkui-arkts.md)
- [ArkUI组件开发常见问题(ArkTS)](faqs-arkui-component.md)
- [ArkUI布局开发常见问题(ArkTS)](faqs-arkui-layout.md)
- [ArkUI路由/导航开发常见问题(ArkTS)](faqs-arkui-route-nav.md)
- [ArkUI动画/交互事件开发常见问题(ArkTS)](faqs-arkui-animation-interactive-event.md)
-[ArkUI框架开发常见问题(JS)](faqs-arkui-js.md)
- [Web开发常见问题](faqs-arkui-web.md)
- [包管理开发常见问题](faqs-bundle-management.md)
- [资源管理开发常见问题](faqs-globalization.md)
......
# ArkUI动画/交互事件开发常见问题(ArkTS)
## 焦点事件onBlur/onFocus回调无法触发
适用于 OpenHarmony 3.2 Beta5 API 9
**问题现象**
焦点事件onBlur/onFocus回调无法触发
**解决措施**
焦点事件默认情况下需要外接键盘的Tab键,或方向键触发,点击触发焦点事件需要添加焦点控制属性focusOnTouch。
**参考链接**
[焦点控制](../reference/arkui-ts/ts-universal-attributes-focus.md)
## scroll里面套一个grid,如何禁用grid的滑动事件
适用于 OpenHarmony 3.2 Beta5 API 9
可以通过onScrollFrameBegin事件和scrollBy方法实现容器嵌套滚动。
可参考:[容器嵌套滚动样例](../reference/arkui-ts/ts-container-scroll.md#示例2)
## 如何实现一个组件不停地旋转
适用于 OpenHarmony 3.2 Beta5 API 9
可以通过[属性动画](../reference/arkui-ts/ts-animatorproperty.md)的方式实现。
## 列表目前无法键盘上下滑动,是否能力不支持
适用于 OpenHarmony 3.2 Beta5 API 9
**解决措施**
有以下两种方案:
1. 需要在列表子项中添加focusable\(true\)进行获焦。
2. 在每个item的外层嵌套一个可获焦组件,例如Button。
## 键盘移动焦点对象按下enter,为什么不会触发点击事件
适用于 OpenHarmony 3.2 Beta5 API 9
组件的内置的点击事件和开发者自定义的onClick点击事件默认会和空格键绑定,并非与enter键绑定(UX规格)。
## 多层组件嵌套button,如何阻止事件传递
适用于 OpenHarmony 3.2 Beta5 API 9
可以通过将button组件绑定参数stopPropagation来控制冒泡传递。
## 使用router或Navigator实现页面跳转时,如何关闭页面间转场动效
适用于 OpenHarmony 3.2 Beta5 API 9
1. 参考[页面间转场示例](../reference/arkui-ts/ts-page-transition-animation.md#示例)在当前页面和目标页面中定义pageTransition方法。
2. 将页面入场组件PageTransitionEnter和页面退场组件PageTransitionExit的动效参数duration都设置为0。
## 在容器组件嵌套的场景下,如何解决手势拖拽事件出现错乱的问题
适用于 OpenHarmony 3.2 Beta5 API 9
PanGesture用于触发拖动手势事件,滑动的最小距离distance默认为5vp时拖动手势识别成功。可以将distance值设为1,使拖动更灵敏,避免造成事件错乱。
**参考链接**
[PanGesture](../reference/arkui-ts/ts-basic-gestures-pangesture.md)
## 基于OpenHarmony开发的应用,是否支持使用fontFamily属性设置不同的字体
适用于:OpenHarmony 3.2 Beta5 API 9
基于OpenHarmony开发的应用,默认字体'HarmonyOS Sans',且当前只支持这种字体。
## 点击输入框时会拉起软键盘,点击button时软键盘关闭要如何实现
适用于 OpenHarmony 3.2 Beta5 API 9
TextInput获取焦点会弹出输入法,失去焦点就会关闭软键盘,使用focusControl控制焦点即可关闭软件盘。
**代码示例**
```
build() {
Column() {
TextInput()
Button(`hide`)
.key('button')
.onClick(()=>{
focusControl.requestFocus('button')
})
}
}
```
## 当父组件绑定了onTouch,其子组件Button绑定了onClick,如何做到点击Button只响应Button的onClick,而不用响应父组件的onTouch?
适用于 OpenHarmony 3.2 Beta5 API 9
可以在Button组件中绑定onTouch,并在onTouch中使用stopPropagation\(\)阻止onTouch冒泡传递到父组件阻止冒泡传递。
**代码示例**
```
build() {
Row() {
Button("点击我")
.width(100)
.width(100)
.backgroundColor('#f00')
.onClick(()=>{
console.log("Button onClick")
})
.onTouch((e) => {
console.log("Button onTouch")
e.stopPropagation()
})
}
.onTouch(() => {
console.log("Row onTouch")
})
}
```
## 绑定菜单后无法使用右键触发菜单
适用于:OpenHarmony 3.2 Beta API 9
**解决措施**
目前菜单仅支持点击、长按触发方式,没有右键方式。
## 点击文本输入框,如何屏蔽系统默认键盘弹起行为?
适用于:OpenHarmony 3.2 Beta5 API 9
设置TextInput组件的focusable属性为false,此组件则不可获焦,就不会拉起系统默认的键盘。
## 如何实现上下切换的页面间跳转动画
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
页面切换时如何实现上下切换动画
**解决措施**
可以使用pageTransition函数来实现页面转场效果,通过PageTransitionEnter和PageTransitionExit指定页面进入和退出的动画效果,将其slide属性设置为SlideEffect.Bottom,则页面入场时从下边划入,出场时滑出到下边,即可实现上下切换效果。
**代码示例**
```
// Index.ets
@Entry
@Component
struct PageTransition1 {
build() {
Stack({alignContent: Alignment.Bottom}) {
Navigator({ target: 'pages/Page1'}) {
Image($r('app.media.ic_banner01')).width('100%').height(200) // 图片存放在media文件夹下
}
}.height('100%').width('100%')
}
pageTransition() {
PageTransitionEnter({ duration: 500, curve: Curve.Linear }).slide(SlideEffect.Bottom)
PageTransitionExit({ duration: 500, curve: Curve.Ease }).slide(SlideEffect.Bottom)
}
}
```
```
// Page1.ets
@Entry
@Component
struct PageTransition2 {
build() {
Stack({alignContent: Alignment.Bottom}) {
Navigator({ target: 'pages/Index'}) {
Image($r('app.media.ic_banner02')).width('100%').height(200) // 图片存放在media文件夹下
}
}.height('100%').width('100%')
}
pageTransition() {
PageTransitionEnter({ duration: 500, curve: Curve.Linear }).slide(SlideEffect.Bottom)
PageTransitionExit({ duration: 500, curve: Curve.Ease }).slide(SlideEffect.Bottom)
}
}
```
**参考链接**
[页面转场动画](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/ui/arkts-page-transition-animation.md/)
## 自定义组件间如何实现从底部滑入滑出的效果
适用于:OpenHarmony 3.2 Beta5 API 9
**问题现象**
一个页面底部默认显示自定义组件A,点击自定义组件A,则A消失,自定义组件B从底部出现;点击自定义组件B,则组件B消失,A从底部出现。这个效果要如何实现?
**解决措施**
可以使用transition产生组件转场动画,其参数type用来设置组件变化场景,包括新增和删除;参数translate用来设置转场时的平移效果。注意transition需要配合animateTo才能生效,动效时长、曲线、延时跟随animateTo中的配置。
**代码示例**
```
@Entry
@Component
struct ComponentTransition {
@State flag: boolean = true;
build() {
Stack({alignContent: Alignment.Bottom}) {
if (this.flag) {
ComponentChild1({ flag: $flag })
.transition({ type: TransitionType.Insert,translate: { x: 0, y: 200 } })
}
if (!this.flag) {
ComponentChild2({ flag: $flag })
.transition({ type: TransitionType.Insert, translate: { x: 0, y: 200 } })
}
}.height('100%').width('100%')
}
}
@Component
struct ComponentChild1 {
@Link flag: boolean
build() {
Column() {
Image($r('app.media.ic_banner01'))
.width('100%')
.height(200)
.onClick(() => {
animateTo({ duration: 1000 }, () => {
this.flag = !this.flag;
})
})
}
}
}
@Component
struct ComponentChild2 {
@Link flag: boolean
build() {
Column() {
Image($r('app.media.ic_banner02'))
.width('100%')
.height(200)
.onClick(() => {
animateTo({ duration: 1000 }, () => {
this.flag = !this.flag;
})
})
}
}
}
```
**参考链接**
[组件内转场动画](https://docs.openharmony.cn/pages/v3.2/zh-cn/application-dev/ui/arkts-transition-animation-within-component.md/)
# ArkUI开发框架(ArkTS语法)
# ArkTS语法使用常见问题
## ArkUI如何通过代码动态创建组件
......
# ArkUI框架开发常见问题(JS)
## 用数组变量控制组件属性不生效
适用于:OpenHarmony,IDE 3.0.0.993,API 8
目前类web范式对数组中元素的修改不会被监听,因此不会触发页面刷新 ,需要产生数组对象的修改才可以触发页面刷新。所以,使用test1\(\)对修改数组的引用时,button组件会被禁用,使用test2\(\)修改数组中某个元素,对控制button组件disabled属性的数组单元赋值,button组件并不会被禁用。除了test1\(\)中对数组整体赋值,我们还可以使用修改数组的方法,如splice\(\),也可以达到页面刷新的效果。
```
test1() {this.isDisabled = [true, true, true, true, true]; //该语句可实现对button组件的禁用
test2() {this.isDisabled[0] = true; //该语句对button组件的禁用不生效
```
## input组件是否支持设置文本居中对齐
适用于:OpenHarmony 3.2 Beta5 API 9 FA模型
**问题现象**
input组件中输入的文本如何实现文本居中对齐格式,使用text-align没有效果。
**解决措施**
input组件属于类web范式组件,不_支_持设置文本对齐方式,text-align样式只针对text组件生效。
**参考链接**
[input组件](../reference/arkui-js/js-components-basic-input.md)[text组件](../reference/arkui-js/js-components-basic-text.md)
## 如何判断JS对象中是否存在某个值
适用于:OpenHarmony 3.2 Release API 9
**解决措施**
Object.values\(对象名\).indexOf\(想要判断的值\),若返回-1表示不包含对应值,返回值不等于-1则表示包含。
\ No newline at end of file
# ArkUI布局开发常见问题(ArkTS)
## 使用position之后height不生效
适用于 OpenHarmony 3.2 Beta5 API 9
**解决措施**
容器组件在使用position之后会脱离文本流,导致容器脱离外层容器束缚,导致height不生效,可以将外层容器换成Stack可以解决这个问题。
## Grid组件如何实现横向滚动
适用于 OpenHarmony 3.2 Beta5 API 9
将Grid组件设置当前网格布局行数rowsTemplate且不设置列数,当内容超出Grid组件宽度时,Grid可横向滚动进行内容展示。
## List组件与其他组件并列使用时,若未设置List滚动方向上的尺寸,无法拖动到底部
适用于 OpenHarmony 3.2 Beta5 API 9
给List加上layoutWeight属性,设置列表自适应占满剩余高度。原理:List属于可滚动容器组件,默认高度是占满全屏幕高度,当出现其他固定高度的组件占领了屏幕的部分高度时,需要开发人员显性的指定List组件占满剩余高度,而不是全屏幕高度。
## Tabs组件在点击Tab项时是否支持禁止切换
适用于 OpenHarmony 3.2 Release API 9
不支持。
## 如何拦截住onBackPress事件,不触发页面返回
适用于 OpenHarmony 3.2 Release API 9
在onBackPress中返回true表示页面自己处理返回逻辑,不会执行默认的返回逻辑。
可参考[自定义组件的生命周期-onBackPress](../reference/arkui-ts/ts-custom-component-lifecycle.md#onbackpress)
## List组件怎么实现分组列表的粘性标题效果
适用于 OpenHarmony 3.2 Release API 9
可以通过List组件的sticky属性配合ListItemGroup组件来实现。通过给List组件设置sticky属性为StickyStyle.Header,设置ListItemGroup中header参数对应的头部组件呈现粘性标题效果
可参考:[创建列表-添加粘性标题](../ui/arkts-layout-development-create-list.md#添加粘性标题)
# ArkUI路由/导航开发常见问题(ArkTS)
## router中params无法正常传递class对象
适用于:OpenHarmony 3.2 Beta5 ,API 9 Stage模型
只能传递对象中的属性,无法传递对象中的方法。
## 在Stage模型下,如何通过router实现页面跳转
适用于:OpenHarmony 3.2 Beta5 ,API 9 Stage模型
1. 对于通过页面路由router实现页面跳转,首先要在main\_pages.json配置文件中将所有跳转的页面加入pages列表;
2. 页面路由需要在页面渲染完成之后才能调用,在onInit和onReady生命周期中页面还处于渲染阶段,禁止调用页面路由方法。
**参考链接:**[页面路由](../reference/apis/js-apis-router.md)
## router通过调用push方法进堆栈的page是否会被回收
适用于:OpenHarmony 3.2 Beta5 ,API 9 Stage模型
调用push进入堆栈的page不回收,调用back方法出栈后可以被回收。
**参考链接:**[Router传递参数](../reference/apis/js-apis-router.md#routergetparams)
# Native API
Native API是OHOS SDK上提供的一组native开发接口与工具集合,方便开发者使用C或者C++语言实现应用的关键功能。Native API只覆盖了OHOS基础的一些底层能力,如libc,图形库,窗口系统,多媒体,压缩库等,并没有完全提供类似于JS API上的完整的OHOS 平台能力。在应用中使用Native API会编译成动态库打包到应用中。
<br/>
## Native API构成介绍
### Native API目录结构
Native API在SDK包的位置为$(SDK_ROOT)/native目录,主要有以下几个部分组成
|目录|功能说明|
|--|--|
|build|应用中编译动态库的toolchain cmake脚本;这个目录下ohos.toolchain.cmake文件定义了给OHOS交叉编译选项|
|build-tools|放置编译构建的工具,如cmake|
|docs|Native API接口参考文档,通过doxgen从头文件中提取出来|
|llvm|支持OHOS ABI的llvm交叉编译器|
|sysroot|放置编译链接的依赖文件目录,包含头文件,动态库等|
<br/>
### Native API接口
|接口分类|接口功能|引入版本|
|--|--|--|
|标准C库|以musl为基础提供的标准c库接口,当前提供了1500+的接口|8|
|标准C++库|c++运行时库libc++_shared,此库在打包的时候需要打包或者静态链接到应用中|8|
|日志|打印日志到系统的hilog接口|8|
|napi|ArkUI提供的,方便应用开发接入JS应用环境的一组类Node-API,是属于Native API的一部分|8|
|XComponent|ArkUI XComponent组件中的surface与触屏事件接口,方便开发者开发高性能图形应用|8|
|libuv|ArkUI集成的三方的异步IO库|8|
|libz|zlib库,提供基本的压缩,解压接口|8|
|Drawing|系统提供的2D图形库,可以在surface进行绘制|8|
|OpenGL|系统提供的openglv3接口|8|
|Rawfile|应用资源访问接口,可以读取应用中打包的各种资源|8|
|OpenSLES|用于2D,3D音频加速的接口库|8|
|Mindspore|AI模型接口库|9|
|包管理|包服务接口,方便查询应用包信息|8|
Native API中有一部分接口采用开源标准,详细列表见《[Native API中支持的标准库](https://docs.openharmony.cn/pages/v3.1/zh-cn/application-dev/reference/native-lib/third_party_libc/musl.md/)》《[Node_API](https://docs.openharmony.cn/pages/v3.1/zh-cn/application-dev/reference/native-lib/third_party_napi/napi.md/)
## 使用介绍
<br/>
### 建议使用Native API的场景
主要有如下一些
1. 应用性能敏感代码,比如游戏,物理模拟等计算密集型场景
2. 需要复用已有的C或C++库
3. 需要针对CPU特性进行专项定制的库,如neon加速
<br/>
### 不建议使用Native API的场景
1. 写一个纯native的的OHOS应用
2. 希望在尽可能多的OHOS设备上保持兼容的应用
<br/>
# Native API的相关指导
- [Native API hello world]()
- 本例子引导开发者开发一个hello的Native API库,在ts界面上显示出从hello库中获取的字符串
- [Native API介绍](introduction.md)
- [Native API在应用工程中的使用指导](napi-guidelines.md)
- 介绍如何使用各种napi接口与js中的模块,接口,异步任务进行互操作
- [Drawing开发指导](drawing-guidelines.md)
- [Rawfile开发指导](rawfile-guidelines.md)
- [NativeWindow开发指导](native-window-guidelines.md)
......
# Native API 介绍
Native API是OHOS SDK上提供的一组native开发接口与工具集合,方便开发者使用C或者C++语言实现应用的关键功能。Native API只覆盖了OHOS基础的一些底层能力,如libc,图形库,窗口系统,多媒体,压缩库等,并没有完全提供类似于JS API上的完整的OHOS 平台能力。在应用中使用Native API会编译成动态库打包到应用中。
## Native API构成介绍
### Native API目录结构
Native API在SDK包的位置为$(SDK_ROOT)/native目录,主要有以下几个部分组成
|目录|功能说明|
|--|--|
|build|应用中编译动态库的toolchain cmake脚本;这个目录下ohos.toolchain.cmake文件定义了给OHOS交叉编译选项|
|build-tools|放置编译构建的工具,如cmake|
|docs|Native API接口参考文档,通过doxgen从头文件中提取出来|
|llvm|支持OHOS ABI的llvm交叉编译器|
|sysroot|放置编译链接的依赖文件目录,包含头文件,动态库等|
### Native API接口
|接口分类|接口功能|引入版本|
|--|--|--|
|标准C库|以musl为基础提供的标准c库接口,当前提供了1500+的接口|8|
|标准C++库|c++运行时库libc++_shared,此库在打包的时候需要打包或者静态链接到应用中|8|
|日志|打印日志到系统的hilog接口|8|
|napi|ArkUI提供的,方便应用开发接入JS应用环境的一组类Node-API,是属于Native API的一部分|8|
|XComponent|ArkUI XComponent组件中的surface与触屏事件接口,方便开发者开发高性能图形应用|8|
|libuv|ArkUI集成的三方的异步IO库|8|
|libz|zlib库,提供基本的压缩,解压接口|8|
|Drawing|系统提供的2D图形库,可以在surface进行绘制|8|
|OpenGL|系统提供的openglv3接口|8|
|Rawfile|应用资源访问接口,可以读取应用中打包的各种资源|8|
|OpenSLES|用于2D,3D音频加速的接口库|8|
|Mindspore|AI模型接口库|9|
|包管理|包服务接口,方便查询应用包信息|8|
Native API中有一部分接口采用开源标准,详细列表见《[Native API中支持的标准库](../reference/native-lib/third_party_libc/musl.md)》《[Node_API](../reference/native-lib/third_party_napi/napi.md)
## 使用介绍
### 建议使用Native API的场景
主要有如下一些
1. 应用性能敏感代码,比如游戏,物理模拟等计算密集型场景
2. 需要复用已有的C或C++库
3. 需要针对CPU特性进行专项定制的库,如neon加速
### 不建议使用Native API的场景
1. 写一个纯native的的OHOS应用
2. 希望在尽可能多的OHOS设备上保持兼容的应用
......@@ -40,7 +40,7 @@
- [app对象内部结构](app-structure.md)
- [deviceConfig内部结构](deviceconfig-structure.md)
- [module对象内部结构](module-structure.md)
- [资源分类与访问](resource-categories-and-access.md)
- [资源分类与访问](resource-categories-and-access.md)
- 学习ArkTS语言
- [初识ArkTS语言](arkts-get-started.md)
- 基本语法
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册