From dc690ee89ee1641d96935c7d1b121b64e29c21be Mon Sep 17 00:00:00 2001 From: guozejun Date: Wed, 26 Oct 2022 10:43:14 +0800 Subject: [PATCH] improve custom layout doc Signed-off-by: guozejun Change-Id: I623935306711ca2bad41bedcbb2a68f42cd12e60 --- .../ui/figures/customLayout.png | Bin 0 -> 13538 bytes ...ts-custom-component-lifecycle-callbacks.md | 92 ++++++++++++++++-- 2 files changed, 82 insertions(+), 10 deletions(-) create mode 100644 zh-cn/application-dev/ui/figures/customLayout.png diff --git a/zh-cn/application-dev/ui/figures/customLayout.png b/zh-cn/application-dev/ui/figures/customLayout.png new file mode 100644 index 0000000000000000000000000000000000000000..10b8ed02016616d8fdc91f37cc1d2f8d1379842f GIT binary patch literal 13538 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 Y?9+ onLayout?(children: Array, constraint: [ConstraintSizeOptions](../reference/arkui-ts/ts-types.md#constraintsizeoptions)): void 框架会在自定义组件布局时,将该自定义组件的子节点信息和自身的尺寸范围通过onLayout传递给该自定义组件。不允许在onLayout函数中改变状态变量。 -## onMeasure +## onMeasure9+ onMeasure?(children: Array, constraint: [ConstraintSizeOptions](../reference/arkui-ts/ts-types.md#constraintsizeoptions)): void 框架会在自定义组件确定尺寸时,将该自定义组件的子节点信息和自身的尺寸范围通过onMeasure传递给该自定义组件。不允许在onMeasure函数中改变状态变量。 -## LayoutChild类型说明 +**示例3:** -| 参数 | 参数类型 | 描述 | -| ----- | ----------- | ----------- | -| name | string | 子组件名称 | -| id | string | 子组件id | -| constraint | [ConstraintSizeOptions](../reference/arkui-ts/ts-types.md#constraintsizeoptions) | 子组件约束尺寸 | -| borderInfo | { borderWidth: number, margin: [Margin](../reference/arkui-ts/ts-types.md#margin), padding: [Padding](../reference/arkui-ts/ts-types.md#padding) } | 子组件边框样式 | -| position | { x: number, y: number } | 子组件位置坐标 | +```ts +// xxx.ets +@Entry +@Component +struct Index { + build() { + Column() { + CustomLayout() { + ForEach([1, 2, 3], (index) => { + Text("Sub" + index) + .fontSize(30) + .borderWidth(2) + }) + } + } + } +} + + +@Component +struct CustomLayout { + @BuilderParam builder: () => {} + + onLayout(children: Array, constraint: ConstraintSizeOptions) { + let pos = 0 + children.forEach((child) => { + child.layout({ position: { x: pos, y: pos }, constraint: constraint }) + pos += 100; + }) + } + + onMeasure(children: Array, constraint: ConstraintSizeOptions) { + let size = 100 + children.forEach((child) => { + child.measure({ minHeight: size, minWidth: size, maxWidth: size, maxHeight: size }) + size += 50 + }) + } + + build() { + this.builder() + } +} +``` + +![customlayout](figures/customLayout.png) + +## LayoutChild9+ + +子组件布局信息 + +| 参数 | 参数类型 | 描述 | +| ---------- | ----------------------------------------------------------------------------------------------------------- | ---------------- | +| name | string | 子组件名称 | +| id | string | 子组件id | +| constraint | [ConstraintSizeOptions](../reference/arkui-ts/ts-types.md#constraintsizeoptions) | 子组件约束尺寸 | +| borderInfo | [LayoutBorderInfo](#layoutborderinfo9) | 子组件border信息 | +| position | [Position](../reference/arkui-ts/ts-types.md#position) | 子组件位置坐标 | +| measure | (childConstraint: [ConstraintSizeOptions](../reference/arkui-ts/ts-types.md#constraintsizeoptions)) => void | 子组件位置坐标 | +| layout | (LayoutInfo: [LayoutInfo](#layoutinfo9)) => void | 子组件位置坐标 | + +## LayoutBorderInfo9+ + +子组件border信息 + +| 参数 | 参数类型 | 描述 | +| ----------- | ---------------------------------------------------------- | -------------------------------------------- | +| borderWidth | [EdgeWidths](../reference/arkui-ts/ts-types.md#edgewidths) | 边框宽度类型,用于描述组件边框不同方向的宽度 | +| margin | [Margin](../reference/arkui-ts/ts-types.md#margin) | 外边距类型,用于描述组件不同方向的外边距 | +| padding | [Padding](../reference/arkui-ts/ts-types.md#padding) | 内边距类型,用于描述组件不同方向的内边距 | + +## LayoutInfo9+ + +子组件layout信息 + +| 参数 | 参数类型 | 描述 | +| ---------- | -------------------------------------------------------------------------------- | -------------- | +| position | [Position](../reference/arkui-ts/ts-types.md#position) | 子组件位置坐标 | +| constraint | [ConstraintSizeOptions](../reference/arkui-ts/ts-types.md#constraintsizeoptions) | 子组件约束尺寸 | -- GitLab