HarmonyOS鸿蒙Next中@Builder的外层是一个Column,@Builder里边能调用Column相关的东西吗
ArkTS目前不支持类似@Composable的UI重组特性,如果是为了实现父子组件的对齐布局的话,可以参考下述基于锚点对齐的方式。
【背景知识】 RelativeContainer是一种采用相对布局的容器,支持容器内部的子元素设置相对位置关系,对多个子元素进行对齐和排列。子元素可以指定兄弟元素或父容器作为锚点,基于锚点进行相对位置布局。
- 参考边界:设置当前组件的哪个边界对齐到锚点。
- 锚点:通过锚点设置当前元素基于哪个元素确定位置。
- 对齐方式:通过对齐方式,设置当前元素是基于锚点的上中下对齐,还是基于锚点的左中右对齐。
- 子组件位置偏移:子组件经过相对位置对齐后,可能尚未达到目标位置。开发者可根据需要设置额外偏移(offset)。
【解决方案】 从API Version 11开始,子组件自身设置的尺寸优先级高于相对布局规则中的对齐锚点尺寸。因此,若要使子组件与锚点严格对齐,应仅使用alignRules,避免使用组件尺寸设置。
在仅使用alignRules时,先按照水平或垂直方向的锚点和对齐方式计算子组件宽高(包含锚点的margin),再按照对齐方式与锚点content部分(不包含锚点的margin)对齐。
由于相对布局规则中的对齐锚点尺寸包含了锚点的margin,但对齐是与content部分(不包含锚点的margin)对齐,因此可能与预期不符。解决方案有以下两种:
- 不设置锚点margin,使用设置了尺寸的组件将margin替代。
- 给子组件设置对应的margin,再设置对应的负值offset(推荐此种方式)。
@Entry
@Component
struct Index {
textOneMarginLeft = 8;
textOneMarginTop = 20;
build() {
RelativeContainer() {
Text("我是第一个元素")
.fontSize(14)
.fontWeight(FontWeight.Bold)
.fontColor("#D9FFFFFF")
.margin({ top: this.textOneMarginTop, left: this.textOneMarginLeft })
.alignRules({
top: { anchor: "", align: VerticalAlign.Bottom },
left: { anchor: "", align: HorizontalAlign.Start }
}).id("text_1")
Text("我是第二个元素")
.fontSize(14)
.fontWeight(FontWeight.Bold)
.fontColor("#D9FFFFFF")
.margin({ top: 4 })
.backgroundColor(Color.Red)
.alignRules({
top: { anchor: "text_1", align: VerticalAlign.Bottom },
left: { anchor: "text_1", align: HorizontalAlign.Start }
}).id("text_2")
Line()
.width(2)
.backgroundColor("#D9FFFFFF")
.alignRules({
left: { anchor: "", align: HorizontalAlign.Start },
top: { anchor: "text_1", align: VerticalAlign.Top },
bottom: { anchor: "text_2", align: VerticalAlign.Bottom }
})
.id("line_1")
// 设置margin和偏移,可使消除锚点margin干扰。或将锚点的textOneMarginTop设置为0亦可。
// .margin({top: 20}).offset({x:0,y:-20})
}.backgroundColor('#000000')
}
}
【常见FAQ】
Q:子元素设置的锚点不存在时以什么作为锚点?
A:父元素RelativeContainer的标识默认为__container__
,子元素设置的锚点为空或不存在时以标识为__container__
的父元素RelativeContainer为锚点。
Q:RelativeContainer的子元素没有显示? A:有以下几种可能:
- 根据约束条件和子组件自身的size属性无法确定子组件的大小,此时,不绘制该子组件。
- 在同一方向上设置两个或更多锚点时,若这些锚点的位置顺序有误,该子组件将被视为大小为0而不予绘制。
- 组件间设置锚点时应避免形成依赖循环(组件之间设置链除外),依赖循环将导致子组件缺乏定位基准,最终无法绘制。
更多关于HarmonyOS鸿蒙Next中@Builder的外层是一个Column,@Builder里边能调用Column相关的东西吗的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html