鸿蒙通用属性-位置设置position、offset对比 原创

auhgnixgnahz
发布于 2025-10-14 09:41
浏览
0收藏

修改一个组件的位置,可以通过position或offset实现,今天通过一篇文章,了解这两个属性的异同。

相同点

传参类型:他们都支持三个传参类型,分别是Position、Edges、LocalizedEdges,接下来详细看一每个类型。
Position:用于表示一个坐标点,参数可选。

名称 说明
x x轴坐标。单位:vp
y y轴坐标。单位:vp

Edges:表示相对四边的偏移量。同时设置top和bottom,仅top生效;同时设置left和right,仅left生效。参数可选。参数类型为Dimension类型,稍后介绍

名称 说明
top 相对顶边的偏移量。
bottom 相对底边的偏移量。
left 相对左边的偏移量。
right 相对右边的偏移量。

LocalizedEdges:表示相对四边的偏移量。同时设置top和bottom,仅top生效;同时设置start和end,仅start生效。参数可选。参数类型为LengthMetrics类型,稍后介绍

名称 说明
top 相对顶边的偏移量。
bottom 相对底边的偏移量。
start LTR模式时相对左边的偏移量,RTL模式时相对右边的偏移量。
end LTR模式时相对右边的偏移量,RTL模式时相对左边的偏移量。

以上是三个传参类型的属性介绍,接下来看一下DimensionLengthMetrics,他们的传值类型更多样

Dimension

名称 说明
PX 以px像素单位,如’10px’。
VP 以数字或vp像素单位,如10或’10vp’。
FP 以fp像素单位,如’10fp’。
LPX 以lpx像素单位,如’10lpx’。
Percentage 以%像素单位,如’10%'。
Resource 引入系统资源。

LengthMetrics 需要传2个参数,为必传

名称 说明
value 长度属性的值。
unit 长度属性的单位,默认为VP。(PX、VP、FP、Percentage)

不同点

1.offset和position一起使用时,position生效,offset不生效
2.offset相对于自己的初始位置进行偏移,position相对于父容器偏移
鸿蒙通用属性-位置设置position、offset对比-鸿蒙开发者社区

3.当父容器是Row/Column/Flex时,设置position的子组件不占位
鸿蒙通用属性-位置设置position、offset对比-鸿蒙开发者社区

Row(){
        Row().backgroundColor(Color.Yellow).width(100).height(100).onAreaChange((oldValue: Area, newValue: Area)=>{
            this.areaWidth=newValue.width as  number
            this.areaHeight=newValue.height as  number
            this.positionX=newValue.position.x as  number
            this.positionY=newValue.position.y as  number
            this.globalX=newValue.globalPosition.x as  number
            this.globalY=newValue.globalPosition.y as  number
        })
          .position({
            x:this.positionX,
            y:this.positionY
          })
          // .offset({
          //   x:this.offsetX
          // })
        Row().backgroundColor(Color.Red).width(30).height(100)
        Row().backgroundColor(Color.Blue).width(30).height(100)
        Row().backgroundColor(Color.Green).width(30).height(100)
      }
      .justifyContent(FlexAlign.SpaceAround)

4.当父容器为RelativeContainer时,子组件设置了alignRules属性时,子组件的position属性不生效。当子组件没有设置alignRules,绘制完成之后,修改position和offset,不影响其他子组件的位置。
鸿蒙通用属性-位置设置position、offset对比-鸿蒙开发者社区

RelativeContainer(){
        Row().backgroundColor(Color.Yellow).width(100).height(100).onAreaChange((oldValue: Area, newValue: Area)=>{
            this.areaWidth=newValue.width as  number
            this.areaHeight=newValue.height as  number
            this.positionX=newValue.position.x as  number
            this.positionY=newValue.position.y as  number
            this.globalX=newValue.globalPosition.x as  number
            this.globalY=newValue.globalPosition.y as  number
        })
          .position({
            x:this.positionX,
            y:this.positionY
          })
          .id('row1')
          // .offset({
          //   x:this.offsetX
          // })
        Row().backgroundColor(Color.Blue).width(30).height(100).alignRules(AlignRules.right('row1'))
      }

5.动态修改position时,会触发组件的onAreaChange回调,修改offset时,不会触发
鸿蒙通用属性-位置设置position、offset对比-鸿蒙开发者社区

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐