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