HarmonyOS鸿蒙Next中怎么动态获取悬浮按钮高度?

HarmonyOS鸿蒙Next中怎么动态获取悬浮按钮高度? 在沉浸光感开发中,怎么获取底部悬浮按钮的实际高度?

6 回复

尊敬的开发者,您好,可以通过 onAreaChange 动态监听,以下是一个Demo示例:

import { hdsMaterial, HdsTabs } from '@kit.UIDesignKit';

@Entry
@Component
struct Index {
  @State tabBarHeight: number = 0; // 实际高度(vp)
  @State tabBarWidth: number = 0;  // 实际宽度(vp)

  build() {
    Stack() {
      HdsTabs() {
        TabContent() { /* 内容 */ }
        .tabBar('首页')
      }
      .barOverlap(true)
      .barPosition(BarPosition.End)
      .barFloatingStyle({
        barBottomMargin: 28,
        systemMaterialEffect: {
          materialType: hdsMaterial.MaterialType.IMMERSIVE,
          materialLevel: hdsMaterial.MaterialLevel.ADAPTIVE
        }
      })
      .onAreaChange((_oldArea: Area, newArea: Area) => {
        // 获取组件渲染后的实际尺寸
        this.tabBarHeight = Number(newArea.height);
        this.tabBarWidth = Number(newArea.width);
        console.info(`悬浮页签高度: ${this.tabBarHeight}vp, 宽度: ${this.tabBarWidth}vp`);
      })
    }
  }
}

更多关于HarmonyOS鸿蒙Next中怎么动态获取悬浮按钮高度?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


获取这类悬浮按钮的实际高度,优先用组件布局完成后的区域回调,而不是手写一个固定值。onAreaChange 可以拿到组件新旧区域信息,适合把高度同步给外层滚动留白、沉浸光感遮罩或避让逻辑。

示例思路是:给悬浮按钮外层容器加 .onAreaChange((oldArea, newArea) => { this.fabHeight = Number(newArea.height) })。如果拿到的是 px,后续参与 ArkUI 布局时要注意和 vp 的换算;如果按钮内容会变,比如文字、图标、横竖屏、安全区变化,最好同时监听外层容器,而不是只监听内部图标。底部还有导航条/安全区时,高度和 bottom inset 要分开算,避免重复留白。

.onAreaChange((oldValue, newValue) => let HdsTabsHeight: number = newValue.height as number)

在HarmonyOS Next中,可通过组件的 onAreaChange 事件动态监听悬浮按钮高度变化,或使用 getComponentRect 方法在 onPageShowonAppear 阶段主动获取。示例:this.$el('floatBtn').getComponentRect().then(rect => { height = rect.height; })

在HarmonyOS Next中,可以使用组件的onAreaChange事件动态获取悬浮按钮(例如FloatingButton或自定义Button)的实际高度。当组件尺寸发生变化时,该回调会提供新的区域信息,从中提取 height 即可。

@Entry
@Component
struct Index {
  @State buttonHeight: number = 0

  build() {
    Column() {
      // 悬浮按钮(示例使用 Button 模拟)
      Button('悬浮')
        .position({ x: '80%', y: '90%' })
        .onAreaChange((oldArea: Area, newArea: Area) => {
          // 获取新高度(单位:vp)
          this.buttonHeight = newArea.height as number
          console.info(`悬浮按钮高度: ${this.buttonHeight} vp`)
        })
    }
    .width('100%')
    .height('100%')
  }
}

若组件使用百分比或自动尺寸,onAreaChange 会在布局完成后触发,确保获取到实际渲染高度。所得值可直接用于沉浸式界面中底部安全距离等计算。

回到顶部