HarmonyOS 鸿蒙Next中横屏的状态下怎么避开安全区
HarmonyOS 鸿蒙Next中横屏的状态下怎么避开安全区
如图, 我这个页面仅有横屏状态, 这个时候,怎么让左边的显示区域避开挖孔呢,
我的代码:
build() {
NavDestination() {
Stack(){
Image($r("app.media.test"))
.objectFit(ImageFit.Contain)
.align(Alignment.Center)
Row(){
Column(){
Text("左边的").fontColor(Color.White)
}.backgroundColor(Color.Red)
.expandSafeArea([SafeAreaType.CUTOUT],[SafeAreaEdge.START,SafeAreaEdge.END])
Column(){
Text("上").fontColor(Color.White)
Text("中").fontColor(Color.White).layoutWeight(1)
Text("下").fontColor(Color.White)
}
.layoutWeight(1)
Column(){
Text("右边的").fontColor(Color.White)
}.expandSafeArea([SafeAreaType.CUTOUT],[SafeAreaEdge.START,SafeAreaEdge.END])
}
}
// .width('100%')
// .height('100%')
}
.backgroundColor(Color.Black)
.hideTitleBar(true)
.onHidden(() => {
})
.onDisAppear(() => {
})
}
更多关于HarmonyOS 鸿蒙Next中横屏的状态下怎么避开安全区的实战教程也可以访问 https://www.itying.com/category-93-b0.html
鸿蒙系统通过expandSafeArea
属性处理CUTOUT类型安全区域,需明确指定避让方向和组件层级关系,楼主代码左右两侧Column
组件参数设置顺序错误,好像也没有正确处理横屏方向与安全区域边缘映射关系。
优化了一下试试行不行?
build() {
NavDestination() {
Stack() {
Image($r("app.media.test"))
.objectFit(ImageFit.Contain)
.align(Alignment.Center)
Row() {
// 左侧避让区域
Column() {
Text("左边的").fontColor(Color.White)
}
.expandSafeArea([SafeAreaType.CUTOUT], [SafeAreaEdge.START])
.width('15%')
.backgroundColor(Color.Red)
// 中间内容区域
Column() {
Text("上").fontColor(Color.White)
Text("中").fontColor(Color.White).layoutWeight(1)
Text("下").fontColor(Color.White)
}
.layoutWeight(1)
// 右侧避让区域(根据实际需求设置)
Column() {
Text("右边的").fontColor(Color.White)
}
.expandSafeArea([SafeAreaType.CUTOUT], [SafeAreaEdge.END])
.width('15%')
}
.width('100%') // 必须设置行容器宽度
}
}
.backgroundColor(Color.Black)
.hideTitleBar(true)
}
更多关于HarmonyOS 鸿蒙Next中横屏的状态下怎么避开安全区的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
“metadata”:
[ { “name”: “avoid_cutout”, “value”: “true”, } ],
摄像头挖孔区域不属于避让区,页面默认不避让挖孔。
从API Version 12开始,可在module.json5中添加以下配置项, 摄像头挖孔区域会视为避让区,实现页面默认避让挖孔: 参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/ts-universal-attributes-expand-safe-area#expandsafearea
从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
摄像头挖孔区域不属于避让区,页面默认不避让挖孔。
从API Version 12开始,可在module.json5中添加以下配置项, 摄像头挖孔区域会视为避让区,实现页面默认避让挖孔:
"metadata": [
{
"name": "avoid_cutout",
"value": "true"
}
]
找到原因了, 其实是会自动避开安全区的,不需要写额外的代码,
只是,像我写的那样的代码, Row 里面左右两端的 Column 必须要设置宽度,才会避开安全区。
不设置宽度的话,它是默认全屏的。
在HarmonyOS Next中横屏避开安全区,可以使用WindowManager
的getWindowAvoidArea
方法获取安全区域信息。在Ability的onWindowStageCreate
中通过windowStage.getWindow().getAvoidArea(type)
获取具体区域(type包括TYPE_SYSTEM
、TYPE_CUTOUT
等)。使用setWindowLayoutFullScreen(true)
全屏后再通过setWindowLayout
调整布局避开返回数据中的left/right/top/bottom
值。安全区数据单位为像素,需结合实际屏幕分辨率处理。
在HarmonyOS Next中,可以通过expandSafeArea
方法来避开挖孔屏的安全区域。从你的代码来看,已经使用了这个方法,但需要调整参数来确保在横屏模式下正确避开左侧挖孔。
建议修改左侧Column的expandSafeArea
调用方式:
Column(){
Text("左边的").fontColor(Color.White)
}
.backgroundColor(Color.Red)
.expandSafeArea([SafeAreaType.CUTOUT],[SafeAreaEdge.START])
.width('100%')
关键修改点:
- 只保留
SafeAreaEdge.START
参数,因为只需要处理左侧挖孔 - 添加
width('100%')
确保Column填满可用空间 - 移除了不必要的
SafeAreaEdge.END
参数
这样修改后,左侧红色区域会自动避开挖孔区域,同时保持右侧内容正常显示。