HarmonyOS 鸿蒙Next底部小白条沉浸式适配问题
这是我的代码,我在EntryAbility已经加入
async function enterImmersion(windowClass: window.Window) {
// 获取状态栏和导航栏的高度
windowClass.on("avoidAreaChange", ({ type, area }) => {
if (type == window.AvoidAreaType.TYPE_SYSTEM) {
// 将状态栏和导航栏的高度保存在AppStorage中
AppStorage.SetOrCreate<number>("topHeight", area.topRect.height);
AppStorage.SetOrCreate<number>("bottomHeight", area.bottomRect.height);
}
})
// 设置窗口布局为沉浸式布局
await windowClass.setWindowLayoutFullScreen(true)
}
达到沉浸
import HomeComponent from './components/HomeComponent'
import MeComponent from './components/MeComponent'
import abilityAccessCtrl, { Permissions } from '@ohos.abilityAccessCtrl';
import common from '@ohos.app.ability.common';
import router from '@ohos.router';
import promptAction from '@ohos.promptAction';
import PermissionUtils from './utils/PermissionUtils';
import ScanComponent from './components/ScanComponent';
let statusHeight = AppStorage.Get('topHeight') as number
let navigateHeight = AppStorage.Get('bottomHeight') as number
const permissions: Array<Permissions> = ['ohos.permission.CAMERA', 'ohos.permission.READ_MEDIA'];
@Entry
@Component
struct Index {
@State username: string = ''
@State titles: Array<string> = ['主页', '我的']
@State currentIndex: number = 0;
@State permissonFlag: boolean = false
private controller: TabsController = new TabsController()
@Builder
TabBuilder(title: string, targeIndex: number, selectImg: Resource, normalImg: Resource, length?: number) {
Column() {
Image(this.currentIndex == targeIndex ? selectImg : normalImg)
.size({
width: 25,
height: 25
})
.margin({
top: 5
})
Text(title)
.fontColor(this.currentIndex == targeIndex ? '#28bff1' : '#8a8a8a')
.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM])
}
.backgroundColor('#f0f0f0')
.width('100%')
.height('100%')
.onClick(() => {
this.currentIndex = targeIndex
this.controller.changeIndex(targeIndex)
})
}
@Builder
NavigationMenus() {
Row() {
NavRouter() {
Column() {
Image($r('app.media.ic_public_input_scan'))
.width(24)
.height(24)
Text('扫一扫')
.fontSize(10)
}
NavDestination() {
ScanComponent()
}
.title('扫一扫')
.backgroundColor(Color.White)
}
}
}
build() {
Row() {
Column() {
Navigation() {
Tabs({
barPosition: BarPosition.End,
controller: this.controller
}) {
TabContent() {
HomeComponent()
}
.tabBar(this.TabBuilder('主页', 0, $r('app.media.home_press'), $r('app.media.home')))
TabContent() {
MeComponent()
}
.tabBar(this.TabBuilder('我的', 1, $r('app.media.me_press'), $r('app.media.me')))
}
.scrollable(false)
.onChange((index) => {
this.currentIndex = index
})
}
.titleMode(NavigationTitleMode.Mini)
.hideBackButton(true)
.title(this.titles[this.currentIndex])
.mode(NavigationMode.Auto)
.navBarWidth(360)
.menus(this.NavigationMenus())
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
}
.width('100%')
.height('100%')
.padding({
top: px2vp(statusHeight),
})
}
}
我在主页面底部导航栏自定义组件TabBuilder内底部文字加入了.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]),但是调试时底部白条并未沉浸效果如下各位大佬有知道的吗
6 回复
楼主您好,您可以看下沉浸式的指导文档中的底部页签场景说明。
开发应用沉浸式效果-开发布局-UI开发 (ArkTS声明式开发范式)-ArkUI(方舟UI框架)-应用框架 | 华为开发者联盟 (huawei.com)
设置expandSafeArea无效.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.START, SafeAreaEdge.TOP, SafeAreaEdge.END])
你要过去小白条的高度,你这里的导航栏高度是0,小白条叫navigationIndicator
获取
看文档的@ohos.window
针对HarmonyOS 鸿蒙Next底部小白条沉浸式适配问题,以下是一些专业的解决方案:
- 全屏布局设置:通过调用
setWindowLayoutFullScreen()
接口设置窗口全屏,这样可以让应用界面延伸到状态栏和导航条区域,实现沉浸式效果。 - 获取避让区域:使用
getWindowAvoidArea()
接口获取状态栏、导航条等布局遮挡区域的高度,以便在布局中对具体控件进行避让处理。 - 组件安全区扩展:通过设置
expandSafeArea
属性,允许组件绘制内容突破安全区域的限制,延伸到状态栏和导航条区域。但请注意,设置此属性时组件不能设置固定宽高尺寸(百分比除外)。 - UI元素避让:除了导航条底部区域可以响应点击事件外,其他可交互UI元素和应用关键信息不建议放到导航条区域。
如果以上方案仍无法解决您的问题,请联系官网客服。官网地址是:https://www.itying.com/category-93-b0.html。他们将为您提供更专业的技术支持和解决方案。