• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 窗口管理开发常见问题
2
3
4## 如何获取状态栏和导航栏高度(API 9)
5
6**解决措施**
7
8在加载窗口内容之前,采用systemAvoidAreaChange事件监听。
9
10**代码示例**
11
12```
13// MainAbility.ts
14import window from '@ohos.window';
15
16/**
17 * 设置沉浸式窗口,并获取状态栏和导航栏高度
18 * @param mainWindow 主窗口对象
19 */
20async function enterImmersion(mainWindow: window.Window) {
21  window.on("systemBarTintChange", (data) => {
22    let avoidAreaRect = data.regionTint[0].region; //data.regionTint是个数组,包含状态栏、导航栏的矩形区域坐标。
23  })
24  await mainWindow.setFullScreen(true)
25  await mainWindow.setSystemBarEnable(["status", "navigation"])
26  await mainWindow.systemBarProperties({
27    navigationBarColor: "#00000000",
28    statusBarColor: "#00000000",
29    navigationBarContentColor: "#FF0000",
30    statusBarContentColor: "#FF0000"
31  })
32}
33export default class MainAbility extends Ability {
34  // do something
35  async onWindowStageCreate(windowStage: window.WindowStage) {
36    let mainWindow = await windowStage.getMainWindow()
37    await enterImmersion(mainWindow)
38    windowStage.loadContent('pages/index')
39  }
40  // do something
41}
42```
43
44
45## 应用如何设置隐藏顶部的状态栏(API 9)
46
47**解决措施**
48
49在UIAbility的onWindowStageCreate的生命周期中设置setWindowSystemBarEnable接口即可。
50
51**代码示例**
52
53```
54onWindowStageCreate(windowStage){
55  windowStage.getMainWindowSync().setWindowSystemBarEnable([])
56  ......
57}
58```
59
60**参考链接**
61
62[窗口基础能力文档](../reference/apis-arkui/js-apis-window.md)
63
64## 如何锁定设备竖屏,使得窗口不随屏幕旋转(API 9)
65
66适用于Stage模型。
67
68**解决措施**
69
70采用窗口的setPreferredOrientation方法可以实现该效果,将orientation参数设置为window.Orientation.PORTRAIT时,可锁定屏幕为竖屏。
71
72**代码示例**
73
74```
75import window from "@ohos.window";
76//1.获取窗口实例对象,新建窗口使用createWindow方法,获取已有的窗口使用findWindow方法
77let windowClass = null;
78let config = {name: "alertWindow", windowType: window.WindowType.TYPE_SYSTEM_ALERT, ctx: this.context};
79try {
80    let promise = window.createWindow(config);
81    promise.then((data)=> {
82        windowClass = data;
83        console.info('Succeeded in creating the window. Data:' + JSON.stringify(data));
84    }).catch((err)=>{
85        console.error('Failed to create the Window. Cause:' + JSON.stringify(err));
86    });} catch (exception) {
87    console.error('Failed to create the window. Cause: ' + JSON.stringify(exception));
88}
89//2.窗口实例使用setPreferredOrientation方法,设置窗口的显示方向,PORTRAIT为固定竖屏,其他方向可参照参考链接
90let orientation = window.Orientation.PORTRAIT;
91if (windowClass) {
92    windowClass.setPreferredOrientation(orientation, (err) => {
93        if (err.code) {
94            console.error('Failed to set window orientation. Cause: ' + JSON.stringify(err));
95            return;
96        }
97        console.info('Succeeded in setting window orientation.');
98}
99```
100
101**参考链接**
102
103[window.Orientation](../reference/apis-arkui/js-apis-window.md#orientation9)
104
105## 调用Window实例的setWindowSystemBarProperties接口设置窗口状态栏和导航栏的高亮属性时不生效(API 9)
106
107适用于Stage模型。
108
109**解决措施**
110
111状态栏字体高亮属性的本质就只是让字体变成白色。调用window实例的setWindowSystemBarProperties接口时,如果设置了状态栏内容颜色statusBarContentColor,就以开发者设置的颜色为准,isStatusBarLightIcon状态栏字体高亮属性就不生效;同理,如果设置了导航栏内容颜色navigationBarContentColor,isNavigationBarLightIcon导航栏字体高亮属性就不生效。
112
113**参考链接**
114
115[window.SystemBarProperties](../reference/apis-arkui/js-apis-window.md#systembarproperties)
116
117
118## 如何保持屏幕常亮(API 9)
119
120**解决措施**
121
122设置屏幕常亮,不熄屏。
123
124获取窗口实例对象后,调用[setWindowKeepScreenOn方法](../reference/apis-arkui/js-apis-window.md#setwindowkeepscreenon9)可设置屏幕是否常亮。
125
126**代码示例**
127
128```
129let isKeepScreenOn = true;
130try {
131    windowClass.setWindowKeepScreenOn(isKeepScreenOn, (err) => {
132        if (err.code) {
133            console.error('Failed to set the screen to be always on. Cause: ' + JSON.stringify(err));
134            return;
135        }
136        console.info('Succeeded in setting the screen to be always on.');
137    });
138} catch (exception) {
139    console.error('Failed to set the screen to be always on. Cause: ' + JSON.stringify(exception));
140}
141```
142
143
144## 如何监听窗口大小的变化(API 9)
145
146**解决措施**
147
148获取窗口实例对象后,可以通过窗口的on('windowSizeChange')方法实现对窗口尺寸大小变化的监听
149
150```
151try {
152    windowClass.on('windowSizeChange', (data) => {
153        console.info('Succeeded in enabling the listener for window size changes. Data: ' + JSON.stringify(data));
154   });
155} catch (exception) {
156    console.error('Failed to enable the listener for window size changes. Cause: ' + JSON.stringify(exception));
157}
158```
159
160**参考链接**
161
162[window.on\("windowSizeChange"\)](../reference/apis-arkui/js-apis-window.md#onwindowsizechange7)
163
164## 如何监听当前屏幕的横竖屏状态(API 10)
165
166**解决措施**
167
168应用可以通过display.on监听屏幕状态改变。
169
170**参考链接**
171
172[开启显示设备变化的监听](../reference/apis-arkui/js-apis-display.md#displayonaddremovechange)
173
174## 如何实现页面跟随屏幕横竖屏自动旋转(API 10)
175
176**解决措施**
177
1781.Abilty级别配置:在模块配置文件module.json5中将EntryAbility设置为"orientation"。
1792.动态设置:使用window.setPreferredOrientation设置窗口方向。
180
181**代码示例**
182```ts
183import window from '@ohos.window';
184import display from '@ohos.display';
185
186const TAG = 'foo'
187const ORIENTATION: Array<string> = ['垂直', '水平', '反向垂直', '反向水平']
188
189@Entry
190@Component
191struct ScreenTest {
192  @State rotation: number = 0
193  @State message: string = ORIENTATION[this.rotation]
194
195  aboutToAppear() {
196    this.setOrientation()
197
198    let callback = async () => {
199      let d = await display.getDefaultDisplaySync()
200      this.rotation = d.rotation
201      this.message = ORIENTATION[this.rotation]
202      console.info(TAG, JSON.stringify(d))
203    }
204    try {
205      display.on("change", callback); // 监听屏幕状态改变
206    } catch (exception) {
207      console.error(TAG, 'Failed to register callback. Code: ' + JSON.stringify(exception));
208    }
209  }
210
211  setOrientation() {
212    try {
213      window.getLastWindow(getContext(this), (err, data) => { // 获取window实例
214        if (err.code) {
215          console.error(TAG, 'Failed to obtain the top window. Cause: ' + JSON.stringify(err));
216          return;
217        }
218        let windowClass = data;
219        console.info(TAG, 'Succeeded in obtaining the top window. Data: ' + JSON.stringify(data));
220
221        let orientation = window.Orientation.AUTO_ROTATION; // 设置窗口方向为传感器自动旋转模式。
222        try {
223          windowClass.setPreferredOrientation(orientation, (err) => {
224            if (err.code) {
225              console.error(TAG, 'Failed to set window orientation. Cause: ' + JSON.stringify(err));
226              return;
227            }
228            console.info(TAG, 'Succeeded in setting window orientation.');
229          });
230        } catch (exception) {
231          console.error(TAG, 'Failed to set window orientation. Cause: ' + JSON.stringify(exception));
232        }
233        ;
234      });
235    } catch (exception) {
236      console.error(TAG, 'Failed to obtain the top window. Cause: ' + JSON.stringify(exception));
237    }
238    ;
239  }
240
241  build() {
242    Row() {
243      Column() {
244        Text(`${this.rotation}`).fontSize(25)
245        Text(`${this.message}`).fontSize(25)
246      }
247      .width("100%")
248    }
249    .height("100%")
250  }
251}
252```
253**参考链接**
254
255[设置窗口的显示方向属性](../reference/apis-arkui/js-apis-window.md#setpreferredorientation9)
256[开启显示设备变化的监听](../reference/apis-arkui/js-apis-display.md#displayonaddremovechange)
257
258<!--no_check-->
259
260
261
262