当前位置: 首页 > news >正文

【HarmonyOS NEXT】获取组件宽高和在屏幕上的位置

一、背景

在开发过程中,获取组件的宽高和位置信息是一个常见的需求。本文将介绍几种获取组件宽高和位置的方法,并通过代码示例详细说明如何使用这些方法。

二、获取方式

2.1、使用 getRectangleById

getRectangleById 方法可以获取组件的大小、位置、平移、缩放、旋转以及仿射矩阵等属性信息。使用该方法时,首先需要通过 UIContext 中的 getComponentUtils() 方法获取 ComponentUtils 对象,然后通过该对象调用 getRectangleById 方法。

代码示例

import { componentUtils } from '@kit.ArkUI'

@Entry
@Component
struct GetRectangleByIdPage {
  private arr: number[] = [0, 1, 2, 3, 4, 5]

  build() {
    Column() {
      List({ space: 20, initialIndex: 0 }) {
        ForEach(this.arr, (item: number) => {
          ListItem() {
            Text('' + item)
              .width('100%').height(100).fontSize(16)
              .textAlign(TextAlign.Center).borderRadius(10).backgroundColor(0xFFFFFF)
              .id(item.toString())
          }
        }, (item: string) => item)
      }
      .listDirection(Axis.Vertical) // 排列方向
      .scrollBar(BarState.Off)
      .friction(0.6)
      .divider({ strokeWidth: 2, color: 0xFFFFFF, startMargin: 20, endMargin: 20 }) // 每行之间的分界线
      .edgeEffect(EdgeEffect.Spring) // 边缘效果设置为Spring
      .width('90%')

      Button('获取点击组件的位置')
        .onClick(()=>{
          let obj = componentUtils.getRectangleById('4');
          console.log('lucy== obj',JSON.stringify(obj))
        })
    }
    .width('100%')
    .height('100%')
    .backgroundColor(0xDCDCDC)
    .padding({ top: 5 })
  }
}

输出结果

点击按钮后,控制台会输出对应组件的大小及位置信息: 

lucy== obj {"size":{"width":972,"height":312.5},"localOffset":{"x":0,"y":0},"windowOffset":{"x":54,"y":1636},"screenOffset":{"x":54,"y":1636},"translate":{"x":0,"y":0,"z":0},"scale":{"x":1,"y":1,"z":1,"centerX":15552,"centerY":5008},"rotate":{"x":0,"y":0,"z":0,"angle":0,"centerX":15552,"centerY":5008},"transform":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}

2.2、使用 onAreaChange

onAreaChange 方法在组件区域变化时触发回调。该方法仅会响应由布局变化所导致的组件大小、位置发生变化时的回调。

代码示例


@Entry
@Component
struct GetRectangleByIdPage {

  build() {
    Text('哈咯呀')
      .onAreaChange((oldValue: Area, newValue: Area) =>{
        console.log('lucy== oldValue',JSON.stringify(oldValue))
        console.log('lucy== newValue',JSON.stringify(newValue))
      })
  }
}

输出结果

当组件区域发生变化时,控制台会输出变化前后的宽高及位置信息:

//其中newValue返回目标元素变化之后的宽高以及目标元素相对父元素和页面左上角的坐标位置。

 lucy== oldValue {"pos":{"x":0,"y":0},"position":{"x":0,"y":0},"globalPos":{"x":0,"y":0},"globalPosition":{"x":0,"y":0},"width":0,"height":0}


lucy== newValue {"pos":{"x":0,"y":0},"position":{"x":0,"y":0},"globalPos":{"x":0,"y":38.72},"globalPosition":{"x":0,"y":38.72},"width":48,"height":18.88}

2.3、使用 onSizeChange

onSizeChange 方法在组件区域变化时触发回调,主要用于获取组件的宽高信息。

代码示例


@Entry
@Component
struct GetRectangleByIdPage {

  build() {
    Text('哈咯呀')
      .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) =>{
        console.log('lucy== oldValue',JSON.stringify(oldValue))
        console.log('lucy== newValue',JSON.stringify(newValue))
      })
  }
}

输出结果

当组件大小发生变化时,控制台会输出变化前后的宽高信息:

lucy== oldValue {"width":0,"height":0}

lucy== newValue {"width":48,"height":18.88}

2.4、总结

  • getRectangleById:适用于需要获取组件的详细属性信息,包括大小、位置、平移、缩放、旋转等。

  • onAreaChange:适用于监听组件区域变化,获取变化前后的宽高及位置信息。

  • onSizeChange:适用于监听组件大小变化,获取变化前后的宽高信息。

根据具体需求选择合适的方法,可以更高效地获取组件的宽高和位置信息。

相关文章:

  • 【AI】从头到脚详解如何创建部署Azure Web App的OpenAI项目
  • 工程化与框架系列(30)--前端日志系统实现
  • IDEA软件安装环境配置中文插件
  • 解锁MATLAB语言:从入门到实战的编程秘籍
  • 版本控制器Git(4)
  • flutter EventBus 的使用介绍
  • C语言——变量与常量
  • 搭建活动报名新神器
  • 54.HarmonyOS NEXT 登录模块开发教程(八):测试与调试技巧
  • 【高级篇】DeepSeek V3 vs R1架构拆解:MoE万亿参数与纯RL训练的秘密战争
  • shell --getopts
  • 分布式事务的产生背景及理论指导
  • 如何在Ubuntu上构建编译LLVM和ISPC,以及Ubuntu上ISPC的使用方法
  • Java基础:枚举类enum入门案例
  • 深入浅出C++ STL:统领STL全局
  • RGV调度算法(三)--遗传算法
  • 响应式数据和双向绑定关系
  • 监控快手关注列表更新以及去视频水印视频
  • qt 自带虚拟键盘的编译使用记录
  • Unity 使UI始终朝向摄像机
  • 泰安企业建站公司哪里找/长尾关键词查询
  • 重庆网站建设挑夹夹虫/接广告的平台
  • WordPress做漫画网站/在线收录
  • 从网站建设到网站运营/广告接单平台有哪些
  • 浙江高端网站建设/竞价托管推广哪家好
  • 机加工外协网站/重要新闻