# FrameNode
FrameNode表示组件树的实体节点。[NodeController](./js-apis-arkui-nodeController.md)可通过[BuilderNode](./js-apis-arkui-builderNode.md)持有的FrameNode将其挂载到[NodeContainer](arkui-ts/ts-basic-components-nodecontainer.md)上,也可通过FrameNode获取[RenderNode](./js-apis-arkui-renderNode.md),挂载到其他FrameNode上。最佳实践请参考[组件动态创建-组件动态添加、更新和删除](https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-ui-dynamic-operations#section153921947151012)。
> **说明:**
>
> 本模块首批接口从API version 11开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
>
> 当前不支持在预览器中使用FrameNode节点。
>
> FrameNode节点暂不支持拖拽。
## 导入模块
```ts
import { FrameNode, LayoutConstraint, ExpandMode, typeNode, NodeAdapter } from "@kit.ArkUI";
```
## LayoutConstraint12+
描述组件的布局约束。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
| 名称 | 类型 | 只读 | 可选 | 说明 |
| -------------- | ------ | ----- | ----------|-------------------------------- |
| maxSize | [Size](./js-apis-arkui-graphics.md#size) |否| 是 | 最大尺寸。 |
| minSize | [Size](./js-apis-arkui-graphics.md#size) |否| 是 | 最小尺寸。 |
| percentReference | [Size](./js-apis-arkui-graphics.md#size) |否| 是 | 子节点计算百分比时的尺寸基准。|
## CrossLanguageOptions15+
该接口用于配置或查询FrameNode的跨语言访问权限。例如,针对ArkTS语言创建的节点,可通过该接口控制是否允许通过非ArkTS语言进行属性访问或修改。
**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
| 名称 | 类型 | 只读 | 可选 | 说明 |
| ------ | ------ | ---- | ---- | ---------------------- |
| attributeSetting | boolean | 否 | 是 | FrameNode是否支持跨ArkTS语言进行属性设置。
true表示支持跨ArkTS语言进行属性设置,false表示不支持跨ArkTS语言进行属性设置。
默认为false。 |
## ExpandMode15+
子节点展开模式枚举。
**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
| 名称 | 值 | 说明 |
| -------- | -------- | -------- |
| NOT_EXPAND | 0 | 表示不展开当前FrameNode的子节点。如果FrameNode包含[LazyForEach](./arkui-ts/ts-rendering-control-lazyforeach.md)子节点,获取在主节点树上的子节点时,不展开当前FrameNode的子节点。子节点序列号按在主节点树上的子节点计算。 |
| EXPAND | 1 | 表示展开当前FrameNode的子节点。如果FrameNode包含[LazyForEach](./arkui-ts/ts-rendering-control-lazyforeach.md)子节点,获取所有子节点时,展开当前FrameNode的子节点。子节点序列号按所有子节点计算。 |
| LAZY_EXPAND | 2 | 表示按需展开当前FrameNode的子节点。如果FrameNode包含[LazyForEach](./arkui-ts/ts-rendering-control-lazyforeach.md)子节点,获取在主树上的子节点时,不展开当前FrameNode的子节点;获取不在主树上的子节点时,展开当前FrameNode的子节点。子节点序列号按所有子节点计算。 |
## InteractionEventBindingInfo19+
如果当前节点上绑定了所要查询的交互事件,则返回一个InteractionEventBindingInfo对象,指示事件绑定详细信息。
**原子化服务API:** 从API version 19开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
| 名称 | 类型 | 只读 | 可选 | 说明 |
| ------ | ------ | ---- | ---- | ---------------------- |
| baseEventRegistered | boolean | 否 | 否 | 是否以声明方式绑定事件。
true表示以声明方式绑定事件,false表示没有以声明方式绑定事件。 |
| nodeEventRegistered | boolean | 否 | 否 | 是否以自定义组件节点的方式绑定事件,请参考[基础事件示例](#基础事件示例)
true表示以自定义组件节点的方式绑定事件,false表示没有以自定义组件节点的方式绑定事件。 |
| nativeEventRegistered | boolean | 否 | 否 | 是否以注册节点事件([registerNodeEvent](capi-arkui-nativemodule-arkui-nativenodeapi-1.md#registernodeevent))的方式绑定事件。
true表示以注册节点事件的方式绑定事件,false表示没有以注册节点事件的方式绑定事件。|
| builtInEventRegistered | boolean | 否 | 否 | 组件是否绑定内置事件(组件内部定义的事件, 无需开发者手动绑定)。
true表示组件绑定内置事件,false表示组件没有绑定内置事件。 |
## UIState20+
多态样式状态枚举。
**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
| 名称 | 值 | 说明 |
| -------- | -------- | -------- |
| NORMAL | 0 | 正常状态。 |
| PRESSED | 1 << 0 | 按下状态。 |
| FOCUSED | 1 << 1 | 获焦状态。 |
| DISABLED | 1 << 2 | 禁用状态。 |
| SELECTED | 1 << 3 | 选中状态。
仅特定的组件支持此状态:Checkbox、Radio、Toggle、List、Grid、MenuItem。 |
## UIStatesChangeHandler20+
type UIStatesChangeHandler = (node: FrameNode, currentUIStates: number) => void
当UI状态发生变化时触发的回调。
**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| -------- | ----------------------------- | ---- | ------------------------------------------------------------ |
| node | [FrameNode](#framenode-1) | 是 | 触发UI状态变化的节点。 |
| currentUIStates | number | 是 | 回调触发时当前的UI状态。
可以通过位与运算判断当前包含哪些[UIState](#uistate20)状态。
位与运算方法:if (currentState & UIState.PRESSED == UIState.PRESSED)。 |
## FrameNode
### constructor
constructor(uiContext: UIContext)
FrameNode的构造函数。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| --------- | ----------------------------------------- | ---- | ---------------------------------- |
| uiContext | [UIContext](./arkts-apis-uicontext-uicontext.md) | 是 | 创建对应节点时所需的UI上下文。 |
### getRenderNode
getRenderNode(): RenderNode | null
获取FrameNode中持有的RenderNode。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| [RenderNode](./js-apis-arkui-renderNode.md) \| null | 一个RenderNode对象。若该FrameNode不包含RenderNode,则返回空对象null。如果当前FrameNode为声明式组件创建的节点,则返回null。 |
**示例:**
```ts
import { NodeController, FrameNode } from '@kit.ArkUI';
class MyNodeController extends NodeController {
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
const renderNode = this.rootNode.getRenderNode();
if (renderNode !== null) {
renderNode.size = { width: 100, height: 100 };
renderNode.backgroundColor = 0XFFFF0000;
}
return this.rootNode;
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
build() {
Row() {
NodeContainer(this.myNodeController)
}
}
}
```
### isModifiable12+
isModifiable(): boolean
判断当前节点是否可修改。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| boolean | 判断当前节点是否可修改。
true表示当前节点可修改,false表示当前节点不可修改。
当节点为系统组件的代理节点或节点已经[dispose](#dispose12)时返回false。
当返回false时,当前FrameNode不支持appendChild、insertChildAfter、removeChild、clearChildren、createAnimation、cancelAnimations的操作。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### appendChild12+
appendChild(node: FrameNode): void
在FrameNode最后一个子节点后添加新的子节点。当前FrameNode如果不可修改,抛出异常信息。[typeNode](#typenode12)在appendChild时会校验子组件类型或个数,不满足抛出异常信息,限制情况请查看[typeNode](#typenode12)描述。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ----------------------- | ---- | --------------------- |
| node | [FrameNode](#framenode-1) | 是 | 需要添加的FrameNode。
**说明:**
node节点不可以为声明式创建的节点,即不可修改的FrameNode。仅有从BuilderNode中获取的声明式节点可以作为子节点。若子节点不符合规格,则抛出异常信息。
node节点不可以拥有父节点,否则抛出异常信息。|
**错误码:**
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 100021 | The FrameNode is not modifiable. |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### insertChildAfter12+
insertChildAfter(child: FrameNode, sibling: FrameNode | null): void
在FrameNode指定子节点之后添加新的子节点。当前FrameNode如果不可修改,抛出异常信息。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ----------------------------------------- | ---- | ---------------------------------------------------------------------------- |
| child | [FrameNode](#framenode-1) | 是 | 需要添加的子节点。
**说明:**
child节点不可以为声明式创建的节点,即不可修改的FrameNode。仅有从BuilderNode中获取的声明式节点可以作为子节点。若子节点不符合规格,则抛出异常信息。
child节点不可以拥有父节点,否则抛出异常信息。 |
| sibling | [FrameNode](#framenode-1) \| null | 是 | 新节点将插入到该节点之后。若该参数设置为空,则新节点将插入到首个子节点之前。 |
**错误码:**
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 100021 | The FrameNode is not modifiable. |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### removeChild12+
removeChild(node: FrameNode): void
从FrameNode中删除指定的子节点。当前FrameNode如果不可修改,抛出异常信息。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ----------------------- | ---- | ------------------ |
| node | [FrameNode](#framenode-1) | 是 | 需要删除的子节点。 |
**错误码:**
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 100021 | The FrameNode is not modifiable. |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### clearChildren12+
clearChildren(): void
清除当前FrameNode的所有子节点。当前FrameNode如果不可修改,抛出异常信息。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**错误码:**
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 100021 | The FrameNode is not modifiable. |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getChild12+
getChild(index: number): FrameNode | null
获取当前节点指定位置的子节点。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | -------------------------- |
| index | number | 是 | 需要查询的子节点的序列号。
若当前节点有n个子节点,index取值范围为[0, n-1]。 |
**返回值:**
| 类型 | 说明 |
| ------------------------------- | ------------------------------------------------------------- |
| [FrameNode](#framenode-1) \| null | 子节点。若该FrameNode不包含所查询的子节点,则返回空对象null。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getChild15+
getChild(index: number, expandMode?: ExpandMode): FrameNode | null
获取当前节点指定位置的子节点,支持指定子节点展开模式。
**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ------ | ---- | -------------------------- |
| index | number | 是 | 需要查询的子节点的序列号。
若当前节点有n个子节点,index取值范围为[0, n-1]。 |
| expandMode | [ExpandMode](#expandmode15) | 否 | 指定子节点展开模式。
默认值:ExpandMode.EXPAND |
**返回值:**
| 类型 | 说明 |
| ------------------------------- | ------------------------------------------------------------- |
| [FrameNode](#framenode-1) \| null | 子节点。若该FrameNode不包含所查询的子节点,则返回空对象null。 |
**示例:**
请参考[LazyForEach场景节点操作示例](#lazyforeach场景节点操作示例)。
### getFirstChildIndexWithoutExpand15+
getFirstChildIndexWithoutExpand(): number
获取当前节点第一个在主节点树上的子节点的序列号。子节点序列号按所有子节点计算。
**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------ | ---------------------------------------- |
| number | 当前节点第一个在主节点树上的子节点的序列号。 |
**示例:**
请参考[LazyForEach场景节点操作示例](#lazyforeach场景节点操作示例)。
### getLastChildIndexWithoutExpand15+
getLastChildIndexWithoutExpand(): number
获取当前节点最后一个在主节点树上的子节点的序列号。子节点序列号按所有子节点计算。
**原子化服务API:** 从API version 15开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------ | ------------------------------------------ |
| number | 当前节点最后一个在主节点树上的子节点的序列号。 |
**示例:**
请参考[LazyForEach场景节点操作示例](#lazyforeach场景节点操作示例)。
### getFirstChild12+
getFirstChild(): FrameNode | null
获取当前FrameNode的第一个子节点。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------------------------------- | --------------------------------------------------------- |
| [FrameNode](#framenode-1) \| null | 首个子节点。若该FrameNode不包含子节点,则返回空对象null。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getNextSibling12+
getNextSibling(): FrameNode | null
获取当前FrameNode的下一个同级节点。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------------------------------- | ------------------------------------------------------------------------------------ |
| [FrameNode](#framenode-1) \| null | 当前FrameNode的下一个同级节点。若该FrameNode不包含下一个同级节点,则返回空对象null。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getPreviousSibling12+
getPreviousSibling(): FrameNode | null
获取当前FrameNode的上一个同级节点。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------- | ------------------------------------------------------------------------------------ |
| [FrameNode](#framenode-1) \| null | 当前FrameNode的上一个同级节点。若该FrameNode不包含上一个同级节点,则返回空对象null。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getParent12+
getParent(): FrameNode | null
获取当前FrameNode的父节点。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------- | -------------------------------------------------------------------- |
| [FrameNode](#framenode-1) \| null | 当前FrameNode的父节点。若该FrameNode不包含父节点,则返回空对象null。 |
**示例:**
请参考[节点操作示例](#节点操作示例)和[获取根节点示例](#获取根节点示例)。
### getChildrenCount12+
getChildrenCount(): number
获取当前FrameNode的子节点数量。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------- | ------------------------------- |
| number | 获取当前FrameNode的子节点数量。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### moveTo18+
moveTo(targetParent: FrameNode, index?: number): void
将当前FrameNode移动到目标FrameNode的指定位置。当前FrameNode如果不可修改,抛出异常信息。targetParent为[typeNode](#typenode12)时会校验子组件类型或个数,不满足抛出异常信息,限制情况请查看[typeNode](#typenode12)描述。
> **说明:**
>
> 当前仅支持以下类型的[TypedFrameNode](#typedframenode12)进行移动操作:[Stack](#stack12)、[XComponent](#xcomponent12)。对于其他类型的节点,移动操作不会生效。
>
> 当前仅支持根节点为以下类型组件的[BuilderNode](./js-apis-arkui-builderNode.md#buildernode-1)进行移动操作:[Stack](./arkui-ts/ts-container-stack.md)、[XComponent](./arkui-ts/ts-basic-components-xcomponent.md)、[EmbeddedComponent](./arkui-ts/ts-container-embedded-component.md)。对于其他类型的组件,移动操作不会生效。
**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------------ | ----------------------- | ---- | --------------------- |
| targetParent | [FrameNode](#framenode-1) | 是 | 目标父节点。
**说明:**
targetParent节点不可以为声明式创建的节点,即不可修改的FrameNode。若目标父节点不符合规格,则抛出异常信息。 |
| index | number | 否 | 子节点序列号。当前FrameNode将被添加到目标FrameNode对应序列号的子节点之前,若目标FrameNode有n个节点,index取值范围为[0, n-1]。
若参数无效或不指定,则添加到目标FrameNode的最后。
默认值:-1 |
**错误码:**
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 100021 | The FrameNode is not modifiable. |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getPositionToWindow12+
getPositionToWindow(): Position
获取FrameNode相对于窗口的位置偏移,单位为VP。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------- | ------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于窗口的位置偏移,单位为VP。 |
**示例:**
```ts
import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
const TEST_TAG: string = "FrameNode ";
class MyNodeController extends NodeController {
public frameNode: FrameNode | null = null;
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.frameNode = new FrameNode(uiContext);
this.frameNode.commonAttribute.backgroundColor(Color.Pink);
this.frameNode.commonAttribute.size({ width: 100, height: 100 });
this.rootNode.appendChild(this.frameNode);
return this.rootNode;
}
getPositionToWindow() {
let positionToWindow = this.rootNode?.getPositionToWindow();
console.info(`${TEST_TAG}${JSON.stringify(positionToWindow)}`);
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
private scroller: Scroller = new Scroller();
@State index: number = 0;
build() {
Scroll(this.scroller) {
Column({ space: 8 }) {
Column() {
Text("This is a NodeContainer.")
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(0xFFFFFF)
.width('100%')
.fontSize(16)
NodeContainer(this.myNodeController)
.borderWidth(1)
.width(300)
.height(100)
}
Button("getPositionToWindow")
.width(300)
.onClick(() => {
this.myNodeController.getPositionToWindow();
})
}
.width("100%")
}
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
}
}
```
请参考[节点操作示例](#节点操作示例)。
### getPositionToParent12+
getPositionToParent(): Position
获取FrameNode相对于父组件的位置偏移,单位为VP。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于父组件的位置偏移,单位为VP。 |
**示例:**
```ts
import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
const TEST_TAG: string = "FrameNode ";
class MyNodeController extends NodeController {
public frameNode: FrameNode | null = null;
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.frameNode = new FrameNode(uiContext);
this.frameNode.commonAttribute.backgroundColor(Color.Pink);
this.frameNode.commonAttribute.size({ width: 100, height: 100 });
this.rootNode.appendChild(this.frameNode);
return this.rootNode;
}
getPositionToParent() {
let positionToParent = this.rootNode?.getPositionToParent();
console.info(TEST_TAG + JSON.stringify(positionToParent));
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
private scroller: Scroller = new Scroller();
@State index: number = 0;
build() {
Scroll(this.scroller) {
Column({ space: 8 }) {
Column() {
Text("This is a NodeContainer.")
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(0xFFFFFF)
.width('100%')
.fontSize(16)
NodeContainer(this.myNodeController)
.borderWidth(1)
.width(300)
.height(100)
}
Button("getPositionToParent")
.width(300)
.onClick(() => {
this.myNodeController.getPositionToParent();
})
}
.width("100%")
}
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
}
}
```
请参考[节点操作示例](#节点操作示例)。
### getPositionToScreen12+
getPositionToScreen(): Position
获取FrameNode相对于屏幕的位置偏移,单位为VP。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------- | ------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于屏幕的位置偏移,单位为VP。 |
**示例:**
```ts
import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
const TEST_TAG: string = "FrameNode ";
class MyNodeController extends NodeController {
public frameNode: FrameNode | null = null;
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.frameNode = new FrameNode(uiContext);
this.frameNode.commonAttribute.backgroundColor(Color.Pink);
this.frameNode.commonAttribute.size({ width: 100, height: 100 });
this.rootNode.appendChild(this.frameNode);
return this.rootNode;
}
getPositionToScreen() {
let positionToScreen = this.rootNode?.getPositionToScreen();
console.info(TEST_TAG + JSON.stringify(positionToScreen));
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
private scroller: Scroller = new Scroller();
@State index: number = 0;
build() {
Scroll(this.scroller) {
Column({ space: 8 }) {
Column() {
Text("This is a NodeContainer.")
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(0xFFFFFF)
.width('100%')
.fontSize(16)
NodeContainer(this.myNodeController)
.borderWidth(1)
.width(300)
.height(100)
}
Button("getPositionToScreen")
.width(300)
.onClick(() => {
this.myNodeController.getPositionToScreen();
})
}
.width("100%")
}
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
}
}
```
请参考[节点操作示例](#节点操作示例)。
### getGlobalPositionOnDisplay20+
getGlobalPositionOnDisplay(): Position
获取FrameNode相对于全局屏幕的位置偏移,单位为VP。
**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------- | ------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于全局屏幕的位置偏移,单位为VP。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getPositionToParentWithTransform12+
getPositionToParentWithTransform(): Position
获取FrameNode相对于父组件带有绘制属性的位置偏移,单位为VP,绘制属性比如transform, translate等,返回的坐标是组件布局时左上角变换后的坐标。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于父组件的位置偏移,单位为VP。 当设置了其他(比如:transform, translate等)绘制属性,由于浮点数精度的影响,返回值会有微小偏差。 |
**示例:**
```ts
import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
const TEST_TAG: string = "FrameNode ";
class MyNodeController extends NodeController {
public frameNode: FrameNode | null = null;
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.frameNode = new FrameNode(uiContext);
this.frameNode.commonAttribute.backgroundColor(Color.Pink);
this.frameNode.commonAttribute.size({ width: 100, height: 100 });
this.rootNode.appendChild(this.frameNode);
return this.rootNode;
}
getPositionToParentWithTransform() {
let positionToParentWithTransform = this.rootNode?.getPositionToParentWithTransform();
console.info(TEST_TAG + JSON.stringify(positionToParentWithTransform));
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
private scroller: Scroller = new Scroller();
@State index: number = 0;
build() {
Scroll(this.scroller) {
Column({ space: 8 }) {
Column() {
Text("This is a NodeContainer.")
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(0xFFFFFF)
.width('100%')
.fontSize(16)
NodeContainer(this.myNodeController)
.borderWidth(1)
.width(300)
.height(100)
}
Button("getPositionToParentWithTransform")
.width(300)
.onClick(() => {
this.myNodeController.getPositionToParentWithTransform();
})
}
.width("100%")
}
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
}
}
```
请参考[节点操作示例](#节点操作示例)。
### getPositionToWindowWithTransform12+
getPositionToWindowWithTransform(): Position
获取FrameNode相对于窗口带有绘制属性的位置偏移,单位为VP,绘制属性比如transform, translate等,返回的坐标是组件布局时左上角变换后的坐标。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于窗口的位置偏移,单位为VP。 当设置了其他(比如:transform, translate等)绘制属性,由于浮点数精度的影响,返回值会有微小偏差。 |
**示例:**
```ts
import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
const TEST_TAG: string = "FrameNode ";
class MyNodeController extends NodeController {
public frameNode: FrameNode | null = null;
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.frameNode = new FrameNode(uiContext);
this.frameNode.commonAttribute.backgroundColor(Color.Pink);
this.frameNode.commonAttribute.size({ width: 100, height: 100 });
this.rootNode.appendChild(this.frameNode);
return this.rootNode;
}
getPositionToWindowWithTransform() {
let positionToWindowWithTransform = this.rootNode?.getPositionToWindowWithTransform();
console.info(TEST_TAG + JSON.stringify(positionToWindowWithTransform));
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
private scroller: Scroller = new Scroller();
@State index: number = 0;
build() {
Scroll(this.scroller) {
Column({ space: 8 }) {
Column() {
Text("This is a NodeContainer.")
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(0xFFFFFF)
.width('100%')
.fontSize(16)
NodeContainer(this.myNodeController)
.borderWidth(1)
.width(300)
.height(100)
}
Button("getPositionToWindowWithTransform")
.width(300)
.onClick(() => {
this.myNodeController.getPositionToWindowWithTransform();
})
}
.width("100%")
}
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
}
}
```
请参考[节点操作示例](#节点操作示例)。
### getPositionToScreenWithTransform12+
getPositionToScreenWithTransform(): Position
获取FrameNode相对于屏幕带有绘制属性的位置偏移,单位为VP,绘制属性比如transform, translate等,返回的坐标是组件布局时左上角变换后的坐标。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点相对于屏幕的位置偏移,单位为VP。 当设置了其他(比如:transform, translate等)绘制属性,由于浮点数精度的影响,返回值会有微小偏差。 |
**示例:**
```ts
import { NodeController, FrameNode, UIContext } from '@kit.ArkUI';
const TEST_TAG: string = "FrameNode ";
class MyNodeController extends NodeController {
public frameNode: FrameNode | null = null;
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.frameNode = new FrameNode(uiContext);
this.frameNode.commonAttribute.backgroundColor(Color.Pink);
this.frameNode.commonAttribute.size({ width: 100, height: 100 });
this.rootNode.appendChild(this.frameNode);
return this.rootNode;
}
getPositionToScreenWithTransform() {
let positionToScreenWithTransform = this.rootNode?.getPositionToScreenWithTransform();
console.info(TEST_TAG + JSON.stringify(positionToScreenWithTransform));
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
private scroller: Scroller = new Scroller();
@State index: number = 0;
build() {
Scroll(this.scroller) {
Column({ space: 8 }) {
Column() {
Text("This is a NodeContainer.")
.textAlign(TextAlign.Center)
.borderRadius(10)
.backgroundColor(0xFFFFFF)
.width('100%')
.fontSize(16)
NodeContainer(this.myNodeController)
.borderWidth(1)
.width(300)
.height(100)
}
Button("getPositionToScreenWithTransform")
.width(300)
.onClick(() => {
this.myNodeController.getPositionToScreenWithTransform();
})
}
.width("100%")
}
.scrollable(ScrollDirection.Vertical) // 滚动方向纵向
}
}
```
请参考[节点操作示例](#节点操作示例)。
### getMeasuredSize12+
getMeasuredSize(): Size
获取FrameNode测量后的大小,单位为PX。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Size](./js-apis-arkui-graphics.md#size) | 节点测量后的大小,单位为PX。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getLayoutPosition12+
getLayoutPosition(): Position
获取FrameNode布局后相对于父组件的位置偏移,单位为PX。该偏移是父容器对该节点进行布局之后的结果,因此布局之后生效的offset属性和不参与布局的position属性不影响该偏移值。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Position](./js-apis-arkui-graphics.md#position) | 节点布局后相对于父组件的位置偏移,单位为PX。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getUserConfigBorderWidth12+
getUserConfigBorderWidth(): Edges\
获取用户设置的边框宽度。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Edges](./js-apis-arkui-graphics.md#edgest12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的边框宽度。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getUserConfigPadding12+
getUserConfigPadding(): Edges\
获取用户设置的内边距。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Edges](./js-apis-arkui-graphics.md#edgest12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的内边距。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getUserConfigMargin12+
getUserConfigMargin(): Edges\
获取用户设置的外边距。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| [Edges](./js-apis-arkui-graphics.md#edgest12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的外边距。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getUserConfigSize12+
getUserConfigSize(): SizeT\
获取用户设置的宽高。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------------------------------------------------------------ | ---------------- |
| [SizeT](./js-apis-arkui-graphics.md#sizett12)\<[LengthMetrics](./js-apis-arkui-graphics.md#lengthmetrics12)\> | 用户设置的宽高。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getId12+
getId(): string
获取用户设置的节点ID(通用属性设置的[ID](./arkui-ts/ts-universal-attributes-component-id.md))。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| string | 用户设置的节点ID(通用属性设置的[ID](./arkui-ts/ts-universal-attributes-component-id.md))。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getUniqueId12+
getUniqueId(): number
获取系统分配的唯一标识的节点UniqueID。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| number | 系统分配的唯一标识的节点UniqueID。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getNodeType12+
getNodeType(): string
获取节点的类型。系统组件类型为组件名称,例如,按钮组件Button的类型为Button。而对于自定义组件,若其有渲染内容,则其类型为__Common__。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| string | 节点的类型。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getOpacity12+
getOpacity(): number
获取节点的不透明度,最小值为0,最大值为1。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| number | 节点的不透明度。范围是[0, 1],值越大透明度越低。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### isVisible12+
isVisible(): boolean
获取节点是否可见。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| boolean | 节点是否可见。
true表示节点可见,false表示节点不可见。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### isClipToFrame12+
isClipToFrame(): boolean
获取节点是否是剪裁到组件区域。当调用[dispose](#dispose12)解除对实体FrameNode节点的引用关系之后,返回值为true。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| boolean | 节点是否是剪裁到组件区域。
true表示节点剪裁到组件区域,false表示节点不是剪裁到组件区域。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### isAttached12+
isAttached(): boolean
获取节点是否被挂载到主节点树上。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| boolean | 节点是否被挂载到主节点树上。
true表示节点被挂载到主节点树上,false表示节点不是被挂载到主节点树上。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### isDisposed20+
isDisposed(): boolean
查询当前FrameNode对象是否已解除与后端实体节点的引用关系。前端节点均绑定有相应的后端实体节点,当节点调用dispose接口解除绑定后,再次调用接口可能会出现crash、返回默认值的情况。由于业务需求,可能存在节点在dispose后仍被调用接口的情况。为此,提供此接口以供开发者在操作节点前检查其有效性,避免潜在风险。
**原子化服务API:** 从API version 20开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| ------- | ------------------ |
| boolean | 后端实体节点是否解除引用。true为节点已与后端实体节点解除引用,false为节点未与后端实体节点解除引用。
**示例:**
请参考[检验FrameNode是否有效示例](#检验framenode是否有效示例)。
### getInspectorInfo12+
getInspectorInfo(): Object
获取节点的结构信息,该信息和DevEco Studio内置ArkUI Inspector工具里面的一致。
> **说明:**
>
> getInspectorInfo接口用于获取所有节点的信息,作为调试接口使用,频繁调用会导致性能下降。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| Object | 节点的结构信息。 |
以查询Button组件节点为例获取到的Object结果部分值如下所示
```json
{
"$type": "Button", // 组件类型
"$ID": 44, // 组件id
"type": "build-in", // build-in为系统组件,custom为自定义组件
"$rect": "[498.00, 468.00],[718.00,598.00]", // 组件框左上角坐标和右下角坐标
"$debugLine": "", // 组件对应源码的调试信息,包括源码路径和组件所在的行号。
"$attrs": {
"borderStyle": "BorderStyle.Solid",
"borderColor": "#FF000000",
"borderWidth": "0.00vp",
"borderRadius": {
"topLeft": "65.00px",
"topRight": "65.00px",
"bottomLeft": "65.00px",
"bottomRight": "65.00px"
},
"border": "{\"style\":\"BorderStyle.Solid\",\"color\":\"#FF000000\",\"width\":\"0.00vp\",\"radius\":{\"topLeft\":\"65.00px\",\"topRight\":\"65.00px\",\"bottomLeft\":\"65.00px\",\"bottomRight\":\"65.00px\"},\"dashGap\":\"0.00vp\",\"dashWidth\":\"0.00vp\"}",
"outlineStyle": "OutlineStyle.SOLID",
"outlineColor": "#FF000000"
}
}
```
以上返回结果的\$attrs字段会根据不同的组件类型具有不同的属性,具体可以参考[getInspectorInfo返回结果$attrs映射表.xlsx](./figures/getInspectorInfo返回结果%24attrs映射表.xlsx)
**示例:**
请参考[节点操作示例](#节点操作示例)。
### getCustomProperty12+
getCustomProperty(name: string): Object | undefined
通过名称获取组件的自定义属性。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------ | ---------------------------------------------------- | ---- | ------------------------------------------------------------ |
| name | string | 是 | 自定义属性的名称。 |
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | --------------------------------------------------------------------- |
| Object \| undefined | 自定义属性的值。 |
**示例:**
请参考[节点操作示例](#节点操作示例)。
### dispose12+
dispose(): void
立即解除当前FrameNode对象对实体FrameNode节点的引用关系。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
> **说明:**
>
> FrameNode对象调用dispose后,由于不对应任何实体FrameNode节点,在调用部分查询接口([getMeasuredSize](#getmeasuredsize12)、[getLayoutPosition](#getlayoutposition12))的时候会导致应用出现jscrash。
>
> 通过[getUniqueId](#getuniqueid12)可以判断当前FrameNode是否对应一个实体FrameNode节点。当UniqueId大于0时表示该对象对应一个实体FrameNode节点。
**示例:**
```ts
import { NodeController, FrameNode, BuilderNode } from '@kit.ArkUI';
@Component
struct TestComponent {
build() {
Column() {
Text('This is a BuilderNode.')
.fontSize(16)
.fontWeight(FontWeight.Bold)
}
.width('100%')
.backgroundColor(Color.Gray)
}
aboutToAppear() {
console.error('aboutToAppear');
}
aboutToDisappear() {
console.error('aboutToDisappear');
}
}
@Builder
function buildComponent() {
TestComponent()
}
class MyNodeController extends NodeController {
private rootNode: FrameNode | null = null;
private builderNode: BuilderNode<[]> | null = null;
makeNode(uiContext: UIContext): FrameNode | null {
this.rootNode = new FrameNode(uiContext);
this.builderNode = new BuilderNode(uiContext, { selfIdealSize: { width: 200, height: 100 } });
this.builderNode.build(new WrappedBuilder(buildComponent));
const rootRenderNode = this.rootNode.getRenderNode();
if (rootRenderNode !== null) {
rootRenderNode.size = { width: 200, height: 200 };
rootRenderNode.backgroundColor = 0xff00ff00;
rootRenderNode.appendChild(this.builderNode!.getFrameNode()!.getRenderNode());
}
return this.rootNode;
}
disposeFrameNode() {
if (this.rootNode !== null && this.builderNode !== null) {
this.rootNode.removeChild(this.builderNode.getFrameNode());
this.builderNode.dispose();
this.rootNode.dispose();
}
}
removeBuilderNode() {
const rootRenderNode = this.rootNode!.getRenderNode();
if (rootRenderNode !== null && this.builderNode !== null && this.builderNode.getFrameNode() !== null) {
rootRenderNode.removeChild(this.builderNode!.getFrameNode()!.getRenderNode());
}
}
}
@Entry
@Component
struct Index {
private myNodeController: MyNodeController = new MyNodeController();
build() {
Column({ space: 4 }) {
NodeContainer(this.myNodeController)
Button('FrameNode dispose')
.onClick(() => {
this.myNodeController.disposeFrameNode();
})
.width('100%')
}
}
}
```
### commonAttribute12+
get commonAttribute(): CommonAttribute
获取FrameNode中持有的CommonAttribute接口,用于设置[通用属性](./arkui-ts/ts-component-general-attributes.md)和[通用事件](./arkui-ts/ts-component-general-events.md)。
仅可以修改自定义节点的属性。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| CommonAttribute | 获取FrameNode中持有的CommonAttribute接口,用于设置通用属性和通用事件。|
> **说明:**
>
> FrameNode的效果参考对齐方式为顶部起始端的[Stack](./arkui-ts/ts-container-stack.md)容器组件。
>
> FrameNode的属性支持范围参考[CommonModifier](./arkui-ts/ts-universal-attributes-attribute-modifier.md#attribute支持范围)。
**示例:**
请参考[基础事件示例](#基础事件示例)。
### commonEvent12+
get commonEvent(): UICommonEvent
获取FrameNode中持有的UICommonEvent对象,用于设置基础事件。设置的基础事件与声明式定义的事件平行,参与事件竞争;设置的基础事件不覆盖原有的声明式事件。同时设置两个事件回调的时候,优先回调声明式事件。
LazyForEach场景下,由于存在节点的销毁重建,对于重建的节点需要重新设置事件回调才能保证监听事件正常响应。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| [UICommonEvent](./arkui-ts/ts-uicommonevent.md#uicommonevent) | UICommonEvent对象,用于设置基础事件。 |
**示例:**
请参考[基础事件示例](#基础事件示例)和[LazyForEach场景基础事件使用示例](#lazyforeach场景基础事件使用示例)。
### gestureEvent14+
get gestureEvent(): UIGestureEvent
获取FrameNode中持有的UIGestureEvent对象,用于设置组件绑定的手势事件。通过gestureEvent接口设置的手势不会覆盖通过[声明式手势接口](./arkui-ts/ts-gesture-settings.md)绑定的手势,两者同时设置了手势时,优先回调声明式接口设置的手势事件。
**原子化服务API:** 从API version 14开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**返回值:**
| 类型 | 说明 |
| -------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| [UIGestureEvent](./arkui-ts/ts-uigestureevent.md#uigestureevent) | UIGestureEvent对象,用于设置组件绑定的手势。 |
**示例:**
请参考[手势事件示例](#手势事件示例)。
### onDraw12+
onDraw?(context: DrawContext): void
FrameNode的自绘制方法,该方法会重写默认绘制方法,在FrameNode进行内容绘制时被调用。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| context | [DrawContext](./js-apis-arkui-graphics.md#drawcontext) | 是 | 图形绘制上下文。自绘制区域无法超出组件自身大小。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### onMeasure12+
onMeasure(constraint: LayoutConstraint): void
FrameNode的自定义测量方法,该方法会重写默认测量方法,在FrameNode进行测量时被调用,测量FrameNode及其内容的大小。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| constraint | [LayoutConstraint](#layoutconstraint12) | 是 | 组件进行测量时使用的布局约束。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### onLayout12+
onLayout(position: Position): void
FrameNode的自定义布局方法,该方法会重写默认布局方法,在FrameNode进行布局时被调用,为FrameNode及其子节点指定位置。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| position | [Position](./js-apis-arkui-graphics.md#position) | 是 | 组件进行布局时使用的位置信息。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### setMeasuredSize12+
setMeasuredSize(size: Size): void
设置FrameNode的测量后的尺寸,默认单位PX。若设置的宽高为负数,自动取零。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| size | [Size](./js-apis-arkui-graphics.md#size) | 是 | FrameNode的测量后的尺寸。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### setLayoutPosition12+
setLayoutPosition(position: Position): void
设置FrameNode的布局后的位置,默认单位PX。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| position | [Position](./js-apis-arkui-graphics.md#position) | 是 | FrameNode的布局后的位置。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### measure12+
measure(constraint: LayoutConstraint): void
调用FrameNode的测量方法,根据父容器的布局约束,对FrameNode进行测量,计算出尺寸,如果测量方法被重写,则调用重写的方法。建议在[onMeasure](#onmeasure12)方法中调用。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| constraint | [LayoutConstraint](#layoutconstraint12) | 是 | 组件进行测量时使用的父容器布局约束。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### layout12+
layout(position: Position): void
调用FrameNode的布局方法,为FrameNode及其子节点指定布局位置,如果布局方法被重写,则调用重写的方法。建议在[onLayout](#onlayout12)方法中调用。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| position | [Position](./js-apis-arkui-graphics.md#position) | 是 | 组件进行布局时使用的位置信息。 |
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### setNeedsLayout12+
setNeedsLayout(): void
该方法会将FrameNode标记为需要布局的状态,下一帧将会进行重新布局。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**示例:**
请参考[节点自定义示例](#节点自定义示例)。
### invalidate12+
invalidate(): void
该方法会触发FrameNode自绘制内容的重新渲染。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
### addComponentContent12+
addComponentContent\(content: ComponentContent\): void
支持添加ComponentContent类型的组件内容。要求当前节点是一个可修改的节点,即[isModifiable](#ismodifiable12)的返回值为true,否则抛出异常信息。
**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
**系统能力:** SystemCapability.ArkUI.ArkUI.Full
**参数:**
| 参数名 | 类型 | 必填 | 说明 |
| ------- | ------------------------------------------------------ | ---- | ---------------- |
| content | [ComponentContent](./js-apis-arkui-ComponentContent.md)\ | 是 | FrameNode节点中显示的组件内容。 |
**错误码:**
| 错误码ID | 错误信息 |
| -------- | -------------------------------- |
| 100021 | The FrameNode is not modifiable. |
```ts
import { NodeController, FrameNode, ComponentContent, typeNode } from '@kit.ArkUI';
@Builder
function buildText() {
Column() {
Text('hello')
.width(50)
.height(50)
.backgroundColor(Color.Yellow)
}
}
class MyNodeController extends NodeController {
makeNode(uiContext: UIContext): FrameNode | null {
let node = new FrameNode(uiContext)
node.commonAttribute.width(300).height(300).backgroundColor(Color.Red)
let col = typeNode.createNode(uiContext, "Column")
col.initialize({ space: 10 })
node.appendChild(col)
let row4 = typeNode.createNode(uiContext, "Row")
row4.attribute.width(200)
.height(200)
.borderWidth(1)
.borderColor(Color.Black)
.backgroundColor(Color.Green)
let component = new ComponentContent