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类型说明) \| [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: string,<br/>action: () => void<br/>} | 否 | 第一个按钮。<br/>value: 弹窗里主按钮的文本。<br/>action: 点击主按钮的回调函数。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 35| secondaryButton | {<br/>value: string,<br/>action: () => void<br/>} | 否 | 第二个按钮。<br/>value: 弹窗里辅助按钮的文本。<br/>action: 点击辅助按钮的回调函数。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 36| onStateChange | (event: { isVisible: boolean }) => 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 \| { 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) \| string \| number \| [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对象说明) \| [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 \| [Color](ts-types.md#color) \| string \| [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: boolean)值。<br />**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 | 93| onStateChange | (event: { isVisible: boolean }) => 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) \| string \| number \| [Color](ts-types.md#color) | 否 | 设置气泡遮罩层颜色。<br />**说明:**<br />从 API version 10 开始废弃,建议使用`mask`替代。 | 97| mask<sup>10+</sup> | boolean \| { 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对象说明) \| [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 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 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 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 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 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