1# RelativeContainer
2
3相对布局组件,用于复杂场景中元素对齐的布局。
4
5>  **说明:**
6>
7> 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8
9## 规则说明
10
11 * 容器内子组件区分水平方向,垂直方向:
12   * 水平方向为left, middle, right,对应容器的HorizontalAlign.StartHorizontalAlign.CenterHorizontalAlign.End13   * 垂直方向为top, center, bottom,对应容器的VerticalAlign.TopVerticalAlign.CenterVerticalAlign.Bottom14 * 子组件可以将容器、guideline、barrier或者其他子组件设为锚点:
15   * 参与相对布局的容器内组件,不设置id的组件能显示,但是不能被其他子组件作为锚点,相对布局容器会为其拼接id,此id的规律无法被应用感知;容器id固定为__container__;guideline和barrier的id不能与组件重复,重复的话按照组件 > guideline > barrier的优先级生效。
16   * 此子组件某一方向上的三个位置(水平方向为left、middle、right,垂直方向为top、center、bottom)可以指定容器或其他子组件同方向的三个位置(水平方向为HorizontalAlign.StartHorizontalAlign.CenterHorizontalAlign.End,垂直方向为VerticalAlign.TopVerticalAlign.CenterVerticalAlign.Bottom)为锚点。若同方向上设置两个以上锚点,水平方向Start和Center优先,垂直方向Top和Center优先。例如,水平方向上指定了left以容器的HorizontalAlign.Start为锚点,middle以容器的HorizontalAlign.Center为锚点,又指定right的锚点为容器的HorizontalAlign.End,当组件的width和容器的width不能同时满足3条约束规则时,优先取Start和Center的约束规则。
17   * 当同时存在前端页面设置的子组件尺寸和相对布局规则时,子组件的绘制尺寸取决于约束规则。从API Version 11开始,该规则发生变化,子组件绘制尺寸取决于前端页面设置的尺寸。
18   * 对齐后需要额外偏移可设置offset(API Version 11上新增了[bias](ts-universal-attributes-location.md#bias对象说明), 不建议再使用offset)。
19   * 从API Version 11开始,在RelativeContainer组件中,width、height设置auto表示自适应子组件。
20   * 当width设置auto时,如果水平方向上子组件以容器作为锚点,则auto不生效,垂直方向上同理。
21   * 相对布局容器内的子组件的margin含义不同于通用属性的margin,其含义为到该方向上的锚点的距离。若该方向上没有锚点,则该方向的margin不生效。
22   * guideline的位置在不声明或者声明异常值(如undefined)时,取start:0的位置;start和end两种方式声明一种即可,同时声明时仅start生效。
23   * 当容器在某个方向的size声明为“auto”时,该方向上guideline的位置只能使用start的方式声明(不可使用百分比)。
24   * 垂直方向的guideline和barrier只能作为组件水平方向的锚点,作为垂直方向的锚点时取0;水平方向的guideline和barrier只能作为组件垂直方向的锚点,作为水平方向的锚点时取0。
25   * 链的形成依靠组件间的依赖关系。以一个组件A、组件B组成的最小水平链为例,需要有锚点1 <-- 组件A <---> 组件B --> 锚点2的依赖关系,即A具有left锚点,B具有right锚点,同时A的right锚点是B的HorizontalAlign.Start,B的left锚点是A的HorizontalAlign.End26   * 链的方向和格式声明在链头组件的[chainMode](ts-universal-attributes-location.md#chainmode12)接口;链内元素的bias属性全部失效,链头元素的bias作为整个链的bias生效。
27   * 链内所有元素的size如果超出链的锚点约束,超出的部分将均分在链的两侧。在[Packed](ts-universal-attributes-location.md#chainstyle12)链中,超出部分的分布可以通过[bias](ts-universal-attributes-location.md#bias对象说明)来设置。
28 * 特殊情况
29   * 根据约束条件和子组件本身的size属性无法确定子组件大小,则子组件不绘制。
30   * 互相依赖、环形依赖时容器内子组件全部不绘制。
31   * 同方向上两个及以上位置设置锚点但锚点位置逆序时此子组件大小为0,即不绘制。
32
33## 子组件
34
35支持多个子组件。
36
37
38## 接口
39
40RelativeContainer()
41
42**卡片能力:** 从API version 9开始,该接口支持在ArkTS卡片中使用。
43
44**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
45
46**系统能力:** SystemCapability.ArkUI.ArkUI.Full
47
48## 属性
49
50除支持[通用属性](ts-universal-attributes-size.md)外,还支持如下属性:
51
52### guideLine<sup>12+</sup>
53
54guideLine(value: Array&lt;GuideLineStyle&gt;)
55
56设置RelativeContainer容器内的辅助线,Array中每个项目即为一条guideline。
57
58**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
59
60**系统能力:** SystemCapability.ArkUI.ArkUI.Full
61
62**参数:** 
63
64| 参数名 | 类型                                       | 必填 | 说明                              |
65| ------ | ------------------------------------------ | ---- | --------------------------------- |
66| value  | Array<[GuideLineStyle](#guidelinestyle12对象说明)> | 是   | RelativeContainer容器内的辅助线。 |
67
68### barrier<sup>12+</sup>
69
70barrier(value: Array&lt;BarrierStyle&gt;)
71
72设置RelativeContainer容器内的屏障,Array中每个项目即为一条barrier。
73
74**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
75
76**系统能力:** SystemCapability.ArkUI.ArkUI.Full
77
78**参数:** 
79
80| 参数名 | 类型                                   | 必填 | 说明                            |
81| ------ | -------------------------------------- | ---- | ------------------------------- |
82| value  | Array<[BarrierStyle](#barrierstyle12对象说明)> | 是   | RelativeContainer容器内的屏障。 |
83
84### barrier<sup>12+</sup>
85
86barrier(barrierStyle: Array&lt;LocalizedBarrierStyle&gt;)
87
88设置RelativeContaine容器内的屏障,Array中每个项目即为一条barrier。
89
90**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
91
92**系统能力:** SystemCapability.ArkUI.ArkUI.Full
93
94**参数:**
95
96| 参数名 | 类型                                   | 必填 | 说明                           |
97| ------ | -------------------------------------- | ---- | ------------------------------ |
98| barrierStyle  | Array\<[LocalizedBarrierStyle](#localizedbarrierstyle12对象说明)\> | 是   | RelativeContaine容器内的屏障。 |
99
100## GuideLineStyle<sup>12+</sup>对象说明
101
102guideLine参数,用于定义一条guideline的id、方向和位置。
103
104**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
105
106**系统能力:** SystemCapability.ArkUI.ArkUI.Full
107
108| 名称    | 类型      | 必填   | 说明                    |
109| ----- | ------- | ---- | --------------------- |
110| id  | string  | 是    | guideline的id,必须是唯一的并且不可与容器内组件重名。   |
111| direction | [Axis](ts-appendix-enums.md#axis) | 是    | 指定guideline的方向。<br />默认值:Axis.Vertical |
112| position | [GuideLinePosition](#guidelineposition12对象说明) | 是    | 指定guideline的位置。<br />默认值:<br />{<br />start: 0<br />} |
113
114## GuideLinePosition<sup>12+</sup>对象说明
115
116guideLine位置参数,用于定义guideline的位置。
117
118**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
119
120**系统能力:** SystemCapability.ArkUI.ArkUI.Full
121
122| 名称    | 类型      | 必填   | 说明                    |
123| ----- | ------- | ---- | --------------------- |
124| start  | [Dimension](ts-types.md#dimension10)  | 否    | guideline距离容器左侧或者顶部的距离。   |
125| end | [Dimension](ts-types.md#dimension10) | 否    | guideline距离容器右侧或者底部的距离。 |
126
127## BarrierStyle<sup>12+</sup>对象说明
128
129barrier参数,用于定义一条barrier的id、方向和生成时所依赖的组件。
130
131**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
132
133**系统能力:** SystemCapability.ArkUI.ArkUI.Full
134
135| 名称    | 类型      | 必填   | 说明                    |
136| ----- | ------- | ---- | --------------------- |
137| id  | string  | 是    | barrier的id,必须是唯一的并且不可与容器内组件重名。   |
138| direction | [BarrierDirection](ts-container-relativecontainer.md#barrierdirection12) | 是    | 指定barrier的方向。<br />默认值:BarrierDirection.LEFT |
139| referencedId | Array\<string> | 是    | 指定生成barrier所依赖的组件。 |
140
141## BarrierDirection<sup>12+</sup>枚举说明
142
143定义屏障线的方向。
144
145**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
146
147**系统能力:** SystemCapability.ArkUI.ArkUI.Full
148
149| 名称     | 说明                          |
150| ------ | ----------------------------- |
151| LEFT | 屏障在其所有[referencedId](ts-container-relativecontainer.md#barrierstyle12对象说明)的最左侧。    |
152| RIGHT | 屏障在其所有[referencedId](ts-container-relativecontainer.md#barrierstyle12对象说明)的最右侧。   |
153| TOP  | 屏障在其所有[referencedId](ts-container-relativecontainer.md#barrierstyle12对象说明)的最上方。    |
154| BOTTOM  | 屏障在其所有[referencedId](ts-container-relativecontainer.md#barrierstyle12对象说明)的最下方。 |
155
156## LocalizedBarrierStyle<sup>12+</sup>对象说明
157
158barrier参数,用于定义一条barrier的id、方向和生成时所依赖的组件。
159
160**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
161
162**系统能力:** SystemCapability.ArkUI.ArkUI.Full
163
164| 名称    | 类型      | 必填   | 说明              |
165| ----- | ------- | ---- | --------------------- |
166| id  | string  | 是    | barrier的id,必须是唯一的并且不可与容器内组件重名。   |
167| localizedDirection | [LocalizedBarrierDirection](#localizedbarrierdirection12枚举说明) | 是    | 指定barrier的方向。 |
168| referencedId | Array\<string\> | 是    | 指定生成barrier所依赖的组件。 |
169
170## LocalizedBarrierDirection<sup>12+</sup>枚举说明
171
172定义屏障线的方向。
173
174**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
175
176**系统能力:** SystemCapability.ArkUI.ArkUI.Full
177
178| 名称 |  值  | 说明                       |
179| ------ | -- | ----------------------------- |
180| START  | 0  |屏障在其所有[referencedId](#localizedbarrierstyle12对象说明)的最左/右侧,LTR模式时为最左侧,RTL模式时为最右侧。 |
181| END    | 1  | 屏障在其所有[referencedId](#localizedbarrierstyle12对象说明)的最左/右侧, LTR模式时为最右侧,RTL模式时为最左侧。   |
182| TOP    | 2  | 屏障在其所有[referencedId](#localizedbarrierstyle12对象说明)的最上方。    |
183| BOTTOM | 3  | 屏障在其所有[referencedId](#localizedbarrierstyle12对象说明)的最下方。 |
184
185## 示例
186
187### 示例1
188
189本示例展示了以容器和容器内组件作为锚点进行布局的用法。
190
191```ts
192@Entry
193@Component
194struct Index {
195  build() {
196    Row() {
197      RelativeContainer() {
198        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
199          .width(100).height(100)
200          .backgroundColor("#FF3333")
201          .alignRules({
202            top: {anchor: "__container__", align: VerticalAlign.Top},
203            left: {anchor: "__container__", align: HorizontalAlign.Start}
204          })
205          .id("row1")
206
207        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
208          .width(100).height(100)
209          .backgroundColor("#FFCC00")
210          .alignRules({
211            top: {anchor: "__container__", align: VerticalAlign.Top},
212            right: {anchor: "__container__", align: HorizontalAlign.End}
213          })
214          .id("row2")
215
216        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
217          .height(100)
218          .backgroundColor("#FF6633")
219          .alignRules({
220            top: {anchor: "row1", align: VerticalAlign.Bottom},
221            left: {anchor: "row1", align: HorizontalAlign.End},
222            right: {anchor: "row2", align: HorizontalAlign.Start}
223          })
224          .id("row3")
225
226        Row(){Text('row4')}.justifyContent(FlexAlign.Center)
227          .backgroundColor("#FF9966")
228          .alignRules({
229            top: {anchor: "row3", align: VerticalAlign.Bottom},
230            bottom: {anchor: "__container__", align: VerticalAlign.Bottom},
231            left: {anchor: "__container__", align: HorizontalAlign.Start},
232            right: {anchor: "row1", align: HorizontalAlign.End}
233          })
234          .id("row4")
235
236        Row(){Text('row5')}.justifyContent(FlexAlign.Center)
237          .backgroundColor("#FF66FF")
238          .alignRules({
239            top: {anchor: "row3", align: VerticalAlign.Bottom},
240            bottom: {anchor: "__container__", align: VerticalAlign.Bottom},
241            left: {anchor: "row2", align: HorizontalAlign.Start},
242            right: {anchor: "__container__", align: HorizontalAlign.End}
243          })
244          .id("row5")
245      }
246      .width(300).height(300)
247      .margin({left: 50})
248      .border({width:2, color: "#6699FF"})
249    }
250    .height('100%')
251  }
252}
253```
254![relative container](figures/relativecontainer.png)
255
256### 示例2
257
258本示例展示了容器内子组件设置margin的用法。
259
260```ts
261@Entry
262@Component
263struct Index {
264  build() {
265    Row() {
266      RelativeContainer() {
267        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
268          .width(100).height(100)
269          .backgroundColor("#FF3333")
270          .alignRules({
271            top: {anchor: "__container__", align: VerticalAlign.Top},
272            left: {anchor: "__container__", align: HorizontalAlign.Start}
273          })
274          .id("row1")
275          .margin(10)
276
277        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
278          .width(100).height(100)
279          .backgroundColor("#FFCC00")
280          .alignRules({
281            left: {anchor: "row1", align: HorizontalAlign.End},
282            top: {anchor: "row1", align: VerticalAlign.Top}
283          })
284          .id("row2")
285
286        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
287          .width(100).height(100)
288          .backgroundColor("#FF6633")
289          .alignRules({
290            left: {anchor: "row1", align: HorizontalAlign.Start},
291            top: {anchor: "row1", align: VerticalAlign.Bottom}
292          })
293          .id("row3")
294
295        Row(){Text('row4')}.justifyContent(FlexAlign.Center)
296          .width(100).height(100)
297          .backgroundColor("#FF9966")
298          .alignRules({
299            left: {anchor: "row3", align: HorizontalAlign.End},
300            top: {anchor: "row2", align: VerticalAlign.Bottom}
301          })
302          .id("row4")
303          .margin(10)
304      }
305      .width(300).height(300)
306      .margin({left: 50})
307      .border({width:2, color: "#6699FF"})
308    }
309    .height('100%')
310  }
311}
312```
313![relative container](figures/relativecontainer1.png)
314
315### 示例3
316
317本示例展示了容器大小适应内容(声明size为"auto")的用法。
318
319```ts
320@Entry
321@Component
322struct Index {
323  build() {
324    Row() {
325      RelativeContainer() {
326        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
327          .width(100).height(100)
328          .backgroundColor("#FF3333")
329          .id("row1")
330
331        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
332          .width(100).height(100)
333          .backgroundColor("#FFCC00")
334          .alignRules({
335            left: {anchor: "row1", align: HorizontalAlign.End},
336            top: {anchor: "row1", align: VerticalAlign.Top}
337          })
338          .id("row2")
339
340        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
341          .width(100).height(100)
342          .backgroundColor("#FF6633")
343          .alignRules({
344            left: {anchor: "row1", align: HorizontalAlign.Start},
345            top: {anchor: "row1", align: VerticalAlign.Bottom}
346          })
347          .id("row3")
348
349        Row(){Text('row4')}.justifyContent(FlexAlign.Center)
350          .width(100).height(100)
351          .backgroundColor("#FF9966")
352          .alignRules({
353            left: {anchor: "row3", align: HorizontalAlign.End},
354            top: {anchor: "row2", align: VerticalAlign.Bottom}
355          })
356          .id("row4")
357      }
358      .width("auto").height("auto")
359      .margin({left: 50})
360      .border({width:2, color: "#6699FF"})
361    }
362    .height('100%')
363  }
364}
365```
366![relative container](figures/relativecontainer2.png)
367
368### 示例4
369
370本示例展示了bias的用法。
371
372```ts
373@Entry
374@Component
375struct Index {
376  build() {
377    Row() {
378      RelativeContainer() {
379        Row().width(100).height(100)
380          .backgroundColor("#FF3333")
381          .alignRules({
382            top: {anchor: "__container__", align: VerticalAlign.Top},
383            bottom : {anchor : "__container__", align : VerticalAlign.Bottom},
384            left: {anchor: "__container__", align: HorizontalAlign.Start},
385            right : {anchor : "__container__", align: HorizontalAlign.End},
386            bias : {vertical : 0.3}
387          })
388          .id("row1")
389      }
390      .width(300).height(300)
391      .margin({left: 50})
392      .border({width:2, color: "#6699FF"})
393    }
394    .height('100%')
395  }
396}
397```
398![relative container](figures/relativecontainer3.png)
399
400### 示例5
401
402本示例展示了guideline的声明和以guideline为锚点的用法。
403
404```ts
405@Entry
406@Component
407struct Index {
408  build() {
409    Row() {
410      RelativeContainer() {
411        Row().width(100).height(100)
412          .backgroundColor("#FF3333")
413          .alignRules({
414            left: {anchor: "guideline1", align: HorizontalAlign.End},
415            top: {anchor: "guideline2", align: VerticalAlign.Top}
416          })
417          .id("row1")
418      }
419      .width(300).height(300)
420      .margin({left: 50})
421      .border({width:2, color: "#6699FF"})
422      .guideLine([{id:"guideline1", direction: Axis.Vertical, position:{start:50}},
423        {id:"guideline2", direction: Axis.Horizontal, position:{start:50}}])
424    }
425    .height('100%')
426  }
427}
428```
429![relative container](figures/relativecontainer4.png)
430
431### 示例6
432
433本示例展示了barrier的声明和以barrier为锚点的用法。
434
435```ts
436@Entry
437@Component
438struct Index {
439  build() {
440    Row() {
441      RelativeContainer() {
442        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
443          .width(100).height(100)
444          .backgroundColor("#FF3333")
445          .id("row1")
446
447        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
448          .width(100).height(100)
449          .backgroundColor("#FFCC00")
450          .alignRules({
451            middle: {anchor: "row1", align: HorizontalAlign.End},
452            top: {anchor: "row1", align: VerticalAlign.Bottom}
453          })
454          .id("row2")
455
456        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
457          .width(100).height(100)
458          .backgroundColor("#FF6633")
459          .alignRules({
460            left: {anchor: "barrier1", align: HorizontalAlign.End},
461            top: {anchor: "row1", align: VerticalAlign.Top}
462          })
463          .id("row3")
464
465        Row(){Text('row4')}.justifyContent(FlexAlign.Center)
466          .width(50).height(50)
467          .backgroundColor("#FF9966")
468          .alignRules({
469            left: {anchor: "row1", align: HorizontalAlign.Start},
470            top: {anchor: "barrier2", align: VerticalAlign.Bottom}
471          })
472          .id("row4")
473      }
474      .width(300).height(300)
475      .margin({left: 50})
476      .border({width:2, color: "#6699FF"})
477      .barrier([{id: "barrier1", direction: BarrierDirection.RIGHT, referencedId:["row1", "row2"]},
478        {id: "barrier2", direction: BarrierDirection.BOTTOM, referencedId:["row1", "row2"]}])
479    }
480    .height('100%')
481  }
482}
483```
484![relative container](figures/relativecontainer5.png)
485
486### 示例7
487
488本示例通过chainMode接口从上至下分别实现了水平方向的SPREAD链,SPREAD_INSIDE链和PACKED链。
489
490```ts
491@Entry
492@Component
493struct Index {
494  build() {
495    Row() {
496      RelativeContainer() {
497        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
498          .width(80).height(80)
499          .backgroundColor("#FF3333")
500          .alignRules({
501            left: {anchor: "__container__", align: HorizontalAlign.Start},
502            right: {anchor: "row2", align : HorizontalAlign.Start},
503            top: {anchor: "__container__", align: VerticalAlign.Top}
504          })
505          .id("row1")
506          .chainMode(Axis.Horizontal, ChainStyle.SPREAD)
507
508        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
509          .width(80).height(80)
510          .backgroundColor("#FFCC00")
511          .alignRules({
512            left: {anchor: "row1", align: HorizontalAlign.End},
513            right: {anchor: "row3", align : HorizontalAlign.Start},
514            top: {anchor: "row1", align: VerticalAlign.Top}
515          })
516          .id("row2")
517
518        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
519          .width(80).height(80)
520          .backgroundColor("#FF6633")
521          .alignRules({
522            left: {anchor: "row2", align: HorizontalAlign.End},
523            right: {anchor: "__container__", align : HorizontalAlign.End},
524            top: {anchor: "row1", align: VerticalAlign.Top}
525          })
526          .id("row3")
527
528        Row(){Text('row4')}.justifyContent(FlexAlign.Center)
529          .width(80).height(80)
530          .backgroundColor("#FF3333")
531          .alignRules({
532            left: {anchor: "__container__", align: HorizontalAlign.Start},
533            right: {anchor: "row5", align : HorizontalAlign.Start},
534            center: {anchor: "__container__", align: VerticalAlign.Center}
535          })
536          .id("row4")
537          .chainMode(Axis.Horizontal, ChainStyle.SPREAD_INSIDE)
538
539        Row(){Text('row5')}.justifyContent(FlexAlign.Center)
540          .width(80).height(80)
541          .backgroundColor("#FFCC00")
542          .alignRules({
543            left: {anchor: "row4", align: HorizontalAlign.End},
544            right: {anchor: "row6", align : HorizontalAlign.Start},
545            top: {anchor: "row4", align: VerticalAlign.Top}
546          })
547          .id("row5")
548
549        Row(){Text('row6')}.justifyContent(FlexAlign.Center)
550          .width(80).height(80)
551          .backgroundColor("#FF6633")
552          .alignRules({
553            left: {anchor: "row5", align: HorizontalAlign.End},
554            right: {anchor: "__container__", align : HorizontalAlign.End},
555            top: {anchor: "row4", align: VerticalAlign.Top}
556          })
557          .id("row6")
558
559        Row(){Text('row7')}.justifyContent(FlexAlign.Center)
560          .width(80).height(80)
561          .backgroundColor("#FF3333")
562          .alignRules({
563            left: {anchor: "__container__", align: HorizontalAlign.Start},
564            right: {anchor: "row8", align : HorizontalAlign.Start},
565            bottom: {anchor: "__container__", align: VerticalAlign.Bottom}
566          })
567          .id("row7")
568          .chainMode(Axis.Horizontal, ChainStyle.PACKED)
569
570        Row(){Text('row8')}.justifyContent(FlexAlign.Center)
571          .width(80).height(80)
572          .backgroundColor("#FFCC00")
573          .alignRules({
574            left: {anchor: "row7", align: HorizontalAlign.End},
575            right: {anchor: "row9", align : HorizontalAlign.Start},
576            top: {anchor: "row7", align: VerticalAlign.Top}
577          })
578          .id("row8")
579
580        Row(){Text('row9')}.justifyContent(FlexAlign.Center)
581          .width(80).height(80)
582          .backgroundColor("#FF6633")
583          .alignRules({
584            left: {anchor: "row8", align: HorizontalAlign.End},
585            right: {anchor: "__container__", align : HorizontalAlign.End},
586            top: {anchor: "row7", align: VerticalAlign.Top}
587          })
588          .id("row9")
589      }
590      .width(300).height(300)
591      .margin({left: 50})
592      .border({width:2, color: "#6699FF"})
593    }
594    .height('100%')
595  }
596}
597```
598![relative container](figures/relativecontainer6.png)
599
600### 示例8
601
602本示例通过chainMode和bias接口实现了水平方向的带bias的PACKED链。
603
604```ts
605@Entry
606@Component
607struct Index {
608  build() {
609    Row() {
610      RelativeContainer() {
611        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
612          .width(80).height(80)
613          .backgroundColor("#FF3333")
614          .alignRules({
615            left: {anchor: "__container__", align: HorizontalAlign.Start},
616            right: {anchor: "row2", align : HorizontalAlign.Start},
617            center: {anchor: "__container__", align: VerticalAlign.Center},
618            bias : {horizontal : 0}
619          })
620          .id("row1")
621          .chainMode(Axis.Horizontal, ChainStyle.PACKED)
622
623        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
624          .width(80).height(80)
625          .backgroundColor("#FFCC00")
626          .alignRules({
627            left: {anchor: "row1", align: HorizontalAlign.End},
628            right: {anchor: "row3", align : HorizontalAlign.Start},
629            top: {anchor: "row1", align: VerticalAlign.Top}
630          })
631          .id("row2")
632
633        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
634          .width(80).height(80)
635          .backgroundColor("#FF6633")
636          .alignRules({
637            left: {anchor: "row2", align: HorizontalAlign.End},
638            right: {anchor: "__container__", align : HorizontalAlign.End},
639            top: {anchor: "row1", align: VerticalAlign.Top}
640          })
641          .id("row3")
642      }
643      .width(300).height(300)
644      .margin({left: 50})
645      .border({width:2, color: "#6699FF"})
646    }
647    .height('100%')
648  }
649}
650```
651![relative container](figures/relativecontainer7.png)
652
653### 示例9
654
655本示例展示了在RTL模式下以barrier为锚点时使用LocalizedAlignRuleOptions和LocalizedBarrierDirection设置对齐方式的用法。
656
657```ts
658@Entry
659@Component
660struct Index {
661  build() {
662    Row() {
663      RelativeContainer() {
664        Row(){Text('row1')}.justifyContent(FlexAlign.Center)
665          .width(100).height(100)
666          .backgroundColor("#FF3333")
667          .id("row1")
668
669        Row(){Text('row2')}.justifyContent(FlexAlign.Center)
670          .width(100).height(100)
671          .backgroundColor("#FFCC00")
672          .alignRules({
673            middle: {anchor: "row1", align: HorizontalAlign.End},
674            top: {anchor: "row1", align: VerticalAlign.Bottom}
675          })
676          .id("row2")
677
678        Row(){Text('row3')}.justifyContent(FlexAlign.Center)
679          .width(100).height(100)
680          .backgroundColor("#FF6633")
681          .alignRules({
682            start: {anchor: "barrier1", align: HorizontalAlign.End},
683            top: {anchor: "row1", align: VerticalAlign.Top}
684          })
685          .id("row3")
686
687        Row(){Text('row4')}.justifyContent(FlexAlign.Center)
688          .width(50).height(50)
689          .backgroundColor("#FF9966")
690          .alignRules({
691            start: {anchor: "row1", align: HorizontalAlign.Start},
692            top: {anchor: "barrier2", align: VerticalAlign.Bottom}
693          })
694          .id("row4")
695      }
696      .direction(Direction.Rtl)
697      .width(300).height(300)
698      .margin({left: 50})
699      .border({width:2, color: "#6699FF"})
700      .barrier([{id: "barrier1", localizedDirection: LocalizedBarrierDirection.END, referencedId:["row1", "row2"]},
701        {id: "barrier2", localizedDirection: LocalizedBarrierDirection.BOTTOM, referencedId:["row1", "row2"]}])
702    }
703    .height('100%')
704  }
705}
706```
707![relative container](figures/relativecontainer8.png)