• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Popup控制
2
3给组件绑定popup弹窗,并设置弹窗内容,交互逻辑和显示状态。
4
5>  **说明:**
6>
7> - 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
8>
9> - popup弹窗的显示状态在onStateChange事件回调中反馈,其显隐与组件的创建或销毁无强对应关系。
10
11## bindPopup
12
13bindPopup(show: boolean, popup: PopupOptions | CustomPopupOptions)
14
15给组件绑定Popup弹窗。
16
17**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
18
19**系统能力:** SystemCapability.ArkUI.ArkUI.Full
20
21**参数:**
22
23| 参数名 | 类型                                                         | 必填 | 说明                                                         |
24| ------ | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
25| show   | boolean                                                      | 是   | 弹窗显示状态,默认值为false,隐藏弹窗。popup弹窗必须等待页面全部构建完成才能展示,因此show不能在页面构建中设置为true,否则会导致popup弹窗显示位置及形状错误。 |
26| popup  | [PopupOptions](#popupoptions类型说明)&nbsp;\|&nbsp;[CustomPopupOptions](#custompopupoptions8类型说明)<sup>8+</sup> | 是   | 配置弹出弹窗的参数。                                         |
27
28## PopupOptions类型说明
29
30| 名称                                  | 类型                                                         | 必填 | 描述                                                         |
31| ------------------------------------- | ------------------------------------------------------------ | ---- | ------------------------------------------------------------ |
32| message                               | string                                                       | 是   | 弹窗信息内容。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                               |
33| placementOnTop<sup>(deprecated)</sup> | boolean                                                      | 否   | 是否在组件上方显示,默认值为false。<br />**说明:**<br />从 API version 10 开始废弃,建议使用`placement`替代。 |
34| primaryButton                         | {<br/>value:&nbsp;string,<br/>action:&nbsp;()&nbsp;=&gt;&nbsp;void<br/>} | 否   | 第一个按钮。<br/>value:&nbsp;弹窗里主按钮的文本。<br/>action:&nbsp;点击主按钮的回调函数。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
35| secondaryButton                       | {<br/>value:&nbsp;string,<br/>action:&nbsp;()&nbsp;=&gt;&nbsp;void<br/>} | 否   | 第二个按钮。<br/>value:&nbsp;弹窗里辅助按钮的文本。<br/>action:&nbsp;点击辅助按钮的回调函数。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
36| onStateChange                         | (event:&nbsp;{&nbsp;isVisible:&nbsp;boolean&nbsp;})&nbsp;=&gt;&nbsp;void | 否   | 弹窗状态变化事件回调,参数isVisible为弹窗当前的显示状态。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。    |
37| arrowOffset<sup>9+</sup>              | [Length](ts-types.md#length)                                 | 否   | popup箭头在弹窗处的偏移。箭头在气泡上下方时,数值为0表示箭头居最左侧,偏移量为箭头至最左侧的距离,默认居中。箭头在气泡左右侧时,偏移量为箭头至最上侧的距离,默认居中。如果显示在屏幕边缘,气泡会自动左右偏移,数值为0时箭头始终指向绑定组件。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
38| showInSubWindow<sup>9+</sup>          | boolean                                                      | 否   | 是否在子窗口显示气泡,默认值为false。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                        |
39| mask<sup>10+</sup>                    | boolean&nbsp;\|&nbsp;{ color : [ResourceColor](ts-types.md#resourcecolor) }| 否   | 设置气泡是否有遮罩层及遮罩颜色。如果设置为false,则没有遮罩层;如果设置为true,则设置有遮罩层并且颜色为透明色;如果设置为Color,则为遮罩层的颜色。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
40| messageOptions<sup>10+</sup>          | [PopupMessageOptions](#popupmessageoptions10类型说明)        | 否   | 设置弹窗信息文本参数。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                       |
41| targetSpace<sup>10+</sup>             | [Length](ts-types.md#length)                                 | 否   | 设置popup与目标的间隙。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                                      |
42| placement<sup>10+</sup>               | [Placement](ts-appendix-enums.md#placement8)                 | 否   | 设置popup组件相对于目标的显示位置,默认值为Placement.Bottom。<br />如果同时设置了`placementOnTop`和`placement`,则以`placement`的设置生效。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
43| offset<sup>10+</sup>                  | [Position](ts-types.md#position)                            | 否   | 设置popup组件相对于placement设置的显示位置的偏移。<br />**说明:**<br />不支持设置百分比。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
44| enableArrow<sup>10+</sup>             | boolean                                                      | 否   | 设置是否显示箭头。<br/>默认值:true<br/>**说明:** <br/>当页面可用空间无法让气泡完全避让时,气泡会覆盖到组件上并且不显示箭头。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
45| popupColor<sup>11+</sup>              | [Color](ts-appendix-enums.md#color) &nbsp;\|&nbsp;string&nbsp;\|&nbsp;number&nbsp; \|&nbsp; [Resource](ts-types.md#resource) | 否   | 提示气泡的颜色。如需去除模糊背景填充效果,需将backgroundBlurStyle设置为BlurStyle.NONE。<br/>默认值:透明色[TRANSPARENT](ts-appendix-enums.md#color)加模糊背景填充效果[COMPONENT_ULTRA_THICK](ts-universal-attributes-background.md#blurstyle9)。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
46| autoCancel<sup>11+</sup>              | boolean                                                      | 否   | 页面有操作时,是否自动关闭气泡。<br/>默认值:true <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。           |
47| width<sup>11+</sup>                   | [Dimension](ts-types.md#dimension10)                         | 否   | 弹窗宽度。<br />**说明:**<br />showInSubWindow=true时最大高度为设备屏幕高度,showInSubWindow=false时最大高度为应用窗口高度。高度限定逻辑=最大高度-状态栏高度(没有时高度为0)-dock栏高度(没有时高度为0)-40VP-40VP。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
48| arrowPointPosition<sup>11+</sup>      | [ArrowPointPosition](ts-appendix-enums.md#arrowpointposition11) | 否   | 气泡尖角相对于父组件显示位置,气泡尖角在垂直和水平方向上有 ”Start“、”Center“、”End“三个位置点可选。以上所有位置点均位于父组件区域的范围内,不会超出父组件的边界范围。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
49| arrowWidth<sup>11+</sup>             | [Dimension](ts-types.md#dimension10)                  | 否   | 设置箭头宽度。若所设置的箭头宽度超过所在边的长度减去两倍的气泡圆角大小,则不绘制气泡箭头。<br/>默认值:16.0_vp <br />**说明:**<br />不支持设置百分比。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                          |
50| arrowHeight<sup>11+</sup>             | [Dimension](ts-types.md#dimension10)                  | 否   | 设置箭头高度。<br/>默认值:8.0_vp <br />**说明:**<br />不支持设置百分比。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                          |
51| radius<sup>11+</sup>             | [Dimension](ts-types.md#dimension10)                  | 否   | 设置气泡圆角半径。<br/>默认值:20.0_vp<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                          |
52| shadow<sup>11+</sup>             | [ShadowOptions](ts-universal-attributes-image-effect.md#shadowoptions对象说明)&nbsp;\|&nbsp;[ShadowStyle](ts-universal-attributes-image-effect.md#shadowstyle10枚举说明)    | 否   | 设置气泡阴影。<br/>默认值:ShadowStyle.OUTER_DEFAULT_MD <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。     |
53| backgroundBlurStyle<sup>11+</sup> | [BlurStyle](ts-universal-attributes-background.md#blurstyle9) | 否 | 设置气泡模糊背景参数。<br />默认值:BlurStyle.COMPONENT_ULTRA_THICK<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
54| transition<sup>12+</sup> | [TransitionEffect](ts-transition-animation-component.md#transitioneffect10对象说明) | 否 | 自定义设置popup弹窗显示和退出的动画效果。<br/>**说明:**<br/>1.如果不设置,则使用默认的显示/退出动效。<br/>2.显示动效中按back键,打断显示动效,执行退出动效,动画效果为显示动效与退出动效的曲线叠加后的效果。<br/>3.退出动效中按back键,不会打断退出动效,退出动效继续执行,back键不被响应。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
55| onWillDismiss<sup>12+</sup>           | boolean\|(dismissPopupAction: [DismissPopupAction](#dismisspopupaction12类型说明)) => void                                                                               | 否   | 设置popup交互式关闭拦截开关及拦截回调函数,默认值为true,popup响应点击、左滑/右滑、三键back。<br />1.当为boolean类型时,如果设置为false,则不响应点击、左滑/右滑、三键back或键盘ESC退出事件,仅当设置“弹窗显示状态”参数show值为false时才退出;如果设置为true,则正常响应退出事件;<br />2.如果设置为函数类型,则拦截退出事件且执行回调函数。<br />**说明:**<br />在onWillDismiss回调中,不能再做onWillDismiss拦截。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
56| followTransformOfTarget<sup>13+</sup> | boolean | 否 | 气泡绑定的宿主组件或其宿主组件的父容器添加了旋转、缩放等变换时,气泡是否能显示在对应变化后的位置上。<br/>默认值:false <br/>**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。 |
57
58## PopupMessageOptions<sup>10+</sup>类型说明
59
60**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
61
62| 名称      | 类型                                       | 必填 | 描述                   |
63| --------- | ------------------------------------------ | ---- | ---------------------- |
64| textColor | [ResourceColor](ts-types.md#resourcecolor) | 否   | 设置弹窗信息文本颜色。 |
65| font      | [Font](ts-types.md#font)                   | 否   | 设置弹窗信息字体属性。 |
66
67## DismissPopupAction<sup>12+</sup>类型说明
68
69**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
70
71| 名称    | 类型                                      | 必填 | 描述                                                            |
72| ------- | ----------------------------------------- | ---- | --------------------------------------------------------------- |
73| dismiss | function                                  | 是   | popup关闭回调函数。开发者需要退出时调用,不需要退出时无需调用。 |
74| reason  | [DismissReason](#dismissreason12枚举说明) | 是   | 关闭原因,返回本次拦截popup消失的事件原因。                       |
75
76## DismissReason<sup>12+</sup>枚举说明
77
78
79| 名称          | 参数描述           |
80| ------------- | ------------------ |
81| PRESS_BACK    | 点击Back键。       |
82| TOUCH_OUTSIDE | 点击组件外部区域。 |
83
84## CustomPopupOptions<sup>8+</sup>类型说明
85
86| 名称                           | 类型                                       | 必填   | 描述                                       |
87| ---------------------------- | ---------------------------------------- | ---- | ---------------------------------------- |
88| builder                      | [CustomBuilder](ts-types.md#custombuilder8) | 是    | 提示气泡内容的构造器。<br />**说明:**<br />popup为通用属性,自定义popup中不支持再次弹出popup。对builder下的第一层容器组件不支持使用position属性,如果使用将导致气泡不显示。builder中若使用自定义组件,自定义组件的aboutToAppear和aboutToDisappear生命周期与popup弹窗的显隐无关,不能使用其生命周期判断popup弹窗的显隐。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                              |
89| placement                    | [Placement](ts-appendix-enums.md#placement8) | 否    | 气泡组件优先显示的位置,当前位置显示不下时,会自动调整位置。<br/>默认值:Placement.Bottom<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
90| popupColor                   | number&nbsp;\|&nbsp;[Color](ts-types.md#color)&nbsp;\|&nbsp;string&nbsp;\|&nbsp;[Resource](ts-types.md#resource) | 否    | 提示气泡的颜色。如需去除模糊背景填充效果,需将backgroundBlurStyle设置为BlurStyle.NONE。<br/>API version 10,默认值:'#4d4d4d'<br />API version 11及以后,默认值:透明色[TRANSPARENT](ts-appendix-enums.md#color)加模糊背景填充效果[COMPONENT_ULTRA_THICK](ts-universal-attributes-background.md#blurstyle9)<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
91| enableArrow                  | boolean                                  | 否    | 是否显示箭头。<br/>从API Version 9开始,如果箭头所在方位侧的气泡长度不足以显示下箭头,则会默认不显示箭头。比如:placement设置为Left,此时如果气泡高度小于箭头的宽度(32vp)与气泡圆角两倍(48vp)之和(80vp),则实际不会显示箭头。<br/>默认值:true<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
92| autoCancel                   | boolean                                  | 否    | 页面有操作时,是否自动关闭气泡。<br/>默认值:true<br />**说明:**<br />如果要实现点击气泡内消失需要在builder中先放一个布局组件,然后再将Popup高级组件放在布局组件里面,再在布局组件的onClick事件中修改的传入bindPopup的变量(show:&nbsp;boolean)值。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
93| onStateChange                | (event:&nbsp;{&nbsp;isVisible:&nbsp;boolean&nbsp;})&nbsp;=&gt;&nbsp;void | 否    | 弹窗状态变化事件回调,参数为弹窗当前的显示状态。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                 |
94| arrowOffset<sup>9+</sup>     | [Length](ts-types.md#length) | 否    | popup箭头在弹窗处的偏移。箭头在气泡上下方时,数值为0表示箭头居最左侧,偏移量为箭头至最左侧的距离,默认居中。箭头在气泡左右侧时,偏移量为箭头至最上侧的距离,默认居中。如果显示在屏幕边缘,气泡会自动左右偏移,数值为0时箭头始终指向绑定组件。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
95| showInSubWindow<sup>9+</sup> | boolean                                  | 否    | 是否在子窗口显示气泡,默认值为false。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                    |
96| maskColor<sup>(deprecated)</sup> | [Resource](ts-types.md#resource)&nbsp;\|&nbsp;string&nbsp;\|&nbsp;number&nbsp;\|&nbsp;&nbsp;[Color](ts-types.md#color) | 否   | 设置气泡遮罩层颜色。<br />**说明:**<br />从 API version 10 开始废弃,建议使用`mask`替代。 |
97| mask<sup>10+</sup>           | boolean&nbsp;\|&nbsp;{ color : [ResourceColor](ts-types.md#resourcecolor) }| 否    | 设置气泡是否有遮罩层及遮罩颜色。如果设置为false,则没有遮罩层;如果设置为true,则设置有遮罩层并且颜色为透明色;如果设置为Color,则为遮罩层的颜色。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
98| targetSpace<sup>10+</sup>    | [Length](ts-types.md#length)             | 否    | 设置popup与目标的间隙。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。                           |
99| offset<sup>10+</sup>         | [Position](ts-types.md#position)                            | 否   | 设置popup组件相对于placement设置的显示位置的偏移。<br />**说明:**<br />不支持设置百分比。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
100| width<sup>11+</sup> | [Dimension](ts-types.md#dimension10) | 否 | 弹窗宽度。<br />**说明:**<br />showInSubWindow=true时最大高度为设备屏幕高度,showInSubWindow=false时最大高度为应用窗口高度。高度限定逻辑=最大高度-状态栏高度(没有时高度为0)-dock栏高度(没有时高度为0)-40VP-40VP。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
101| arrowPointPosition<sup>11+</sup> | [ArrowPointPosition](ts-appendix-enums.md#arrowpointposition11) | 否 | 气泡尖角相对于父组件显示位置,气泡尖角在垂直和水平方向上有 ”Start“、”Center“、”End“三个位置点可选。以上所有位置点均位于父组件区域的范围内,不会超出父组件的边界范围。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 |
102| arrowWidth<sup>11+</sup>             | [Dimension](ts-types.md#dimension10)                                                      | 否   | 设置箭头宽度。若所设置的箭头宽度超过所在边的长度减去两倍的气泡圆角大小,则不绘制气泡箭头。<br/>默认值:16.0_vp <br />**说明:**<br />不支持设置百分比。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                          |
103| arrowHeight<sup>11+</sup>             | [Dimension](ts-types.md#dimension10)                  | 否   | 设置箭头高度。<br/>默认值:8.0_vp <br />**说明:**<br />不支持设置百分比。<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                          |
104| radius<sup>11+</sup>             | [Dimension](ts-types.md#dimension10)                  | 否   | 设置气泡圆角半径。<br/>默认值:20.0_vp<br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。                          |
105| shadow<sup>11+</sup>             | [ShadowOptions](ts-universal-attributes-image-effect.md#shadowoptions对象说明)&nbsp;\|&nbsp;[ShadowStyle](ts-universal-attributes-image-effect.md#shadowstyle10枚举说明)    | 否   | 设置气泡阴影。<br/>默认值:ShadowStyle.OUTER_DEFAULT_MD <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。     |
106| backgroundBlurStyle<sup>11+</sup> | [BlurStyle](ts-universal-attributes-background.md#blurstyle9) | 否 | 设置气泡模糊背景参数。<br />默认值:BlurStyle.COMPONENT_ULTRA_THICK <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
107| focusable<sup>11+</sup> | boolean | 否 | 设置气泡弹出后是否获焦。<br />默认值:false <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
108| transition<sup>12+</sup> | [TransitionEffect](ts-transition-animation-component.md#transitioneffect10对象说明) | 否 | 自定义设置popup弹窗显示和退出的动画效果。<br/>**说明:**<br/>如果不设置,则使用默认的显示/退出动效。<br/>2.显示动效中按back键,打断显示动效,执行退出动效,动画效果为显示动效与退出动效的曲线叠加后的效果。<br/>3.退出动效中按back键,不会打断退出动效,退出动效继续执行,back键不被响应。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
109| onWillDismiss<sup>12+</sup>           | boolean\|(dismissPopupAction: [DismissPopupAction](#dismisspopupaction12类型说明)) => void                                                                               | 否   | 设置popup交互式关闭拦截开关及拦截回调函数,默认值为true,popup响应点击、左滑/右滑、三键back。<br />1.当为boolean类型时,如果设置为false,则不响应点击、左滑/右滑、三键back或键盘ESC退出事件,仅当设置“弹窗显示状态”参数show值为false时才退出;如果设置为true,则正常响应退出事件;<br />2.如果设置为函数类型,则拦截退出事件且执行回调函数。<br />**说明:**<br />在onWillDismiss回调中,不能再做onWillDismiss拦截。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
110| followTransformOfTarget<sup>13+</sup> | boolean | 否 | 气泡绑定的宿主组件或其宿主组件的父容器添加了旋转、缩放等变换时,气泡是否能显示在对应变化后的位置上。<br/>默认值:false <br/>**原子化服务API:** 从API version 13开始,该接口支持在原子化服务中使用。 |
111
112## 示例
113
114### 示例1
115
116```ts
117// xxx.ets
118@Entry
119@Component
120struct PopupExample {
121  @State handlePopup: boolean = false
122  @State customPopup: boolean = false
123
124  // popup构造器定义弹框内容
125  @Builder popupBuilder() {
126    Row({ space: 2 }) {
127      Image($r("app.media.icon")).width(24).height(24).margin({ left: -5 })
128      Text('Custom Popup').fontSize(10)
129    }.width(100).height(50).padding(5)
130  }
131
132  build() {
133    Flex({ direction: FlexDirection.Column }) {
134      // PopupOptions 类型设置弹框内容
135      Button('PopupOptions')
136        .onClick(() => {
137          this.handlePopup = !this.handlePopup
138        })
139        .bindPopup(this.handlePopup, {
140          message: 'This is a popup with PopupOptions',
141          placementOnTop: true,
142          showInSubWindow:false,
143          primaryButton: {
144            value: 'confirm',
145            action: () => {
146              this.handlePopup = !this.handlePopup
147              console.info('confirm Button click')
148            }
149          },
150          // 第二个按钮
151          secondaryButton: {
152            value: 'cancel',
153            action: () => {
154              this.handlePopup = !this.handlePopup
155              console.info('cancel Button click')
156            }
157          },
158          onStateChange: (e) => {
159            console.info(JSON.stringify(e.isVisible))
160            if (!e.isVisible) {
161              this.handlePopup = false
162            }
163          }
164        })
165        .position({ x: 100, y: 150 })
166
167
168      // CustomPopupOptions 类型设置弹框内容
169      Button('CustomPopupOptions')
170        .onClick(() => {
171          this.customPopup = !this.customPopup
172        })
173        .bindPopup(this.customPopup, {
174          builder: this.popupBuilder,
175          placement: Placement.Top,
176          mask: {color:'#33000000'},
177          popupColor: Color.Yellow,
178          enableArrow: true,
179          showInSubWindow: false,
180          onStateChange: (e) => {
181            if (!e.isVisible) {
182              this.customPopup = false
183            }
184          }
185        })
186        .position({ x: 80, y: 300 })
187    }.width('100%').padding({ top: 5 })
188  }
189}
190```
191
192![](figures/popup.gif)
193
194### 示例2
195
196```ts
197// xxx.ets
198
199@Entry
200@Component
201struct PopupExample {
202  @State handlePopup: boolean = false
203  @State customPopup: boolean = false
204
205  // popup构造器定义气泡内容
206  @Builder popupBuilder() {
207    Row() {
208      Text('Custom Popup Message').fontSize(10)
209    }.height(50).padding(5)
210  }
211
212  build() {
213    Column({space: 100}) {
214      Button('PopupOptions')
215        .onClick(() => {
216          this.handlePopup = !this.handlePopup
217        })
218        .bindPopup(this.handlePopup, {  // PopupOptions类型气泡的内容
219          message: 'This is a popup with PopupOptions',
220          messageOptions: { // 气泡的文本样式
221            textColor: Color.Red,
222            font: {
223              size: '14vp',
224              style: FontStyle.Italic,
225              weight: FontWeight.Bolder
226            }
227          },
228          placement: Placement.Bottom,
229          enableArrow: false,
230          targetSpace: '15vp',
231          onStateChange: (e) => {
232            console.info(JSON.stringify(e.isVisible))
233            if (!e.isVisible) {
234              this.handlePopup = false
235            }
236          }
237        })
238      Button('CustomPopupOptions')
239        .onClick(() => {
240          this.customPopup = !this.customPopup
241        })
242        .bindPopup(this.customPopup, {  // CustomPopupOptions类型气泡的内容
243          builder: this.popupBuilder,
244          targetSpace: '15vp',
245          enableArrow: false, // 气泡弹出时不显示箭头
246          onStateChange: (e) => {
247            if (!e.isVisible) {
248              this.customPopup = false
249            }
250          }
251        })
252    }.margin(20)
253  }
254}
255```
256
257![](figures/popup_02.gif)
258
259### 示例3
260
261```ts
262// xxx.ets
263
264@Entry
265@Component
266struct PopupExample {
267  @State customPopup: boolean = false
268  @State handlePopup: boolean = false
269
270  build() {
271    Column({ space: 100 }) {
272      Button("popup")
273        .margin({ top: 50 })
274        .onClick(() => {
275          this.customPopup = !this.customPopup
276        })
277        .bindPopup(this.customPopup, {
278          message: "this is a popup",
279          arrowHeight: 20, // 设置气泡箭头高度
280          arrowWidth: 20, // 设置气泡箭头宽度
281          radius: 20, // 设置气泡的圆角
282          shadow: ShadowStyle.OUTER_DEFAULT_XS, // 设置气泡的阴影
283        })
284
285      Button('PopupOptions')
286        .onClick(() => {
287          this.handlePopup = !this.handlePopup
288        })
289        .bindPopup(this.handlePopup, {
290          width: 300,
291          message: 'This is a popup with PopupOptions',
292          arrowPointPosition: ArrowPointPosition.START, // 设置箭头的位置
293          backgroundBlurStyle: BlurStyle.NONE, // 关闭气泡的模糊背景
294          popupColor: Color.Red, // 设置气泡的背景色
295          autoCancel: true,
296        })
297    }
298    .width('100%')
299  }
300}
301```
302
303![](figures/popup_04.gif)
304
305### 示例4
306
307本示例通过transition实现了自定义气泡显示/退出动效。
308
309```ts
310// xxx.ets
311@Entry
312@Component
313struct PopupExample {
314  @State handlePopup: boolean = false
315  @State customPopup: boolean = false
316
317  // popup构造器定义弹框内容
318  @Builder popupBuilder() {
319    Row() {
320      Text('Custom Popup with transitionEffect').fontSize(10)
321    }.height(50).padding(5)
322  }
323
324  build() {
325    Flex({ direction: FlexDirection.Column }) {
326      // PopupOptions 类型设置弹框内容
327      Button('PopupOptions')
328        .onClick(() => {
329          this.handlePopup = !this.handlePopup
330        })
331        .bindPopup(this.handlePopup, {
332          message: 'This is a popup with transitionEffect',
333          placementOnTop: true,
334          showInSubWindow: false,
335          onStateChange: (e) => {
336            console.info(JSON.stringify(e.isVisible))
337            if (!e.isVisible) {
338              this.handlePopup = false
339            }
340          },
341          // 设置弹窗显示动效为透明度动效与平移动效的组合效果,无退出动效
342          transition:TransitionEffect.asymmetric(
343            TransitionEffect.OPACITY.animation({ duration: 1000, curve: Curve.Ease }).combine(
344              TransitionEffect.translate({ x: 50, y: 50 })),
345            TransitionEffect.IDENTITY)
346        })
347        .position({ x: 100, y: 150 })
348
349      // CustomPopupOptions 类型设置弹框内容
350      Button('CustomPopupOptions')
351        .onClick(() => {
352          this.customPopup = !this.customPopup
353        })
354        .bindPopup(this.customPopup, {
355          builder: this.popupBuilder,
356          placement: Placement.Top,
357          showInSubWindow: false,
358          onStateChange: (e) => {
359            if (!e.isVisible) {
360              this.customPopup = false
361            }
362          },
363          // 设置弹窗显示动效与退出动效为缩放动效
364          transition:TransitionEffect.scale({ x: 1, y: 0 }).animation({ duration: 500, curve: Curve.Ease })
365        })
366        .position({ x: 80, y: 300 })
367    }.width('100%').padding({ top: 5 })
368  }
369}
370```
371
372![](figures/popup_05.gif)
373
374### 示例5
375
376```ts
377// xxx.ets
378//该示例实现了设置bindPopup的onWillDismiss属性为回调函数时,拦截退出事件并执行回调函数
379@Entry
380@Component
381struct PopupExample {
382  @State handlePopup: boolean = false
383  build() {
384    Column() {
385      Button('PopupOptions')
386        .onClick(() => {
387          this.handlePopup = true
388        })
389        .bindPopup(this.handlePopup, {
390          message: 'This is a popup with PopupOptions',
391          messageOptions: {
392            textColor: Color.Red,
393            font: {
394              size: '14vp',
395              style: FontStyle.Italic,
396              weight: FontWeight.Bolder
397            }
398          },
399          placement: Placement.Bottom,
400          enableArrow: false,
401          targetSpace: '15vp',
402          onStateChange: (e) => {
403            if (!e.isVisible) {
404              this.handlePopup = false
405            }
406          },
407          onWillDismiss: (
408            (dismissPopupAction: DismissPopupAction) => {
409              console.info("dismissReason:" + JSON.stringify(dismissPopupAction.reason))
410              if (dismissPopupAction.reason == DismissReason.PRESS_BACK) {
411                dismissPopupAction.dismiss()
412              }
413            }
414          )
415        })
416    }.margin(20)
417  }
418}
419```
420
421![](figures/popup_004.gif)
422
423### 示例6
424
425```ts
426// xxx.ets
427//该示例实现了设置bindPopup的onWillDismiss属性为false时,拦截退出事件
428@Entry
429@Component
430struct PopupExample {
431  @State handlePopup: boolean = false
432  build() {
433    Column() {
434      Button('PopupOptions')
435        .onClick(() => {
436          this.handlePopup = true
437        })
438        .bindPopup(this.handlePopup, {
439          message: 'This is a popup with PopupOptions',
440          messageOptions: {
441            textColor: Color.Red,
442            font: {
443              size: '14vp',
444              style: FontStyle.Italic,
445              weight: FontWeight.Bolder
446            }
447          },
448          placement: Placement.Bottom,
449          enableArrow: false,
450          targetSpace: '15vp',
451          onStateChange: (e) => {
452            let timer = setTimeout(()=>{this.handlePopup = false},6000)
453            if (!e.isVisible) {
454              this.handlePopup = false
455              clearTimeout(timer)
456            }
457          },
458          onWillDismiss: false
459        })
460    }.margin(20)
461  }
462}
463```
464
465![](figures/popup_005.gif)