1# 设置浮层(OverlayManager) 2 3**浮层(OverlayManager)** 用于将自定义的UI内容展示在页面(Page)之上,在Dialog、Popup、Menu、BindSheet、BindContentCover和Toast等组件之下,展示的范围为当前窗口安全区内。可适用于常驻悬浮等场景。 4 5 6 7可以通过使用[UIContext](../reference/apis-arkui/js-apis-arkui-UIContext.md#uicontext)中的[getOverlayManager](../reference/apis-arkui/js-apis-arkui-UIContext.md#getoverlaymanager12)方法获取当前UI上下文关联的[OverlayManager](../reference/apis-arkui/js-apis-arkui-UIContext.md#overlaymanager12)对象,再通过该对象调用对应方法。 8 9## 规格约束 10 11* OverlayManager上节点的层级在Page页面层级之上,在Dialog、Popup、Menu、BindSheet、BindContentCover和Toast等组件之下。 12* OverlayManager添加的节点显示和消失时没有默认动画。 13* OverlayManager上节点安全区域内外的绘制方式与Page一致,键盘避让方式与Page一致。 14* 与OverlayManager相关的属性推荐采用AppStorage来进行应用全局存储,以免切换页面后属性值发生变化从而导致业务错误。 15 16## 设置浮层 17 18在OverlayManager上[新增指定节点(addComponentContent)](../reference/apis-arkui/js-apis-arkui-UIContext.md#addcomponentcontent12)、[删除指定节点(removeComponentContent)](../reference/apis-arkui/js-apis-arkui-UIContext.md#removecomponentcontent12)、[显示所有节点(showAllComponentContents)](../reference/apis-arkui/js-apis-arkui-UIContext.md#showallcomponentcontents12)和[隐藏所有节点(hideAllComponentContents)](../reference/apis-arkui/js-apis-arkui-UIContext.md#hideallcomponentcontents12)。 19 20```ts 21import { ComponentContent, OverlayManager, router } from '@kit.ArkUI'; 22 23class Params { 24 text: string = "" 25 offset: Position 26 constructor(text: string, offset: Position) { 27 this.text = text 28 this.offset = offset 29 } 30} 31@Builder 32function builderText(params: Params) { 33 Column() { 34 Text(params.text) 35 .fontSize(30) 36 .fontWeight(FontWeight.Bold) 37 }.offset(params.offset) 38} 39 40@Entry 41@Component 42struct OverlayExample { 43 @State message: string = 'ComponentContent'; 44 private uiContext: UIContext = this.getUIContext() 45 private overlayNode: OverlayManager = this.uiContext.getOverlayManager() 46 @StorageLink('contentArray') contentArray: ComponentContent<Params>[] = [] 47 @StorageLink('componentContentIndex') componentContentIndex: number = 0 48 @StorageLink('arrayIndex') arrayIndex: number = 0 49 @StorageLink("componentOffset") componentOffset: Position = {x: 0, y: 80} 50 51 build() { 52 Column({space:10}) { 53 Button("递增componentContentIndex: " + this.componentContentIndex).onClick(()=>{ 54 ++this.componentContentIndex 55 }) 56 Button("递减componentContentIndex: " + this.componentContentIndex).onClick(()=>{ 57 --this.componentContentIndex 58 }) 59 Button("增加ComponentContent" + this.contentArray.length).onClick(()=>{ 60 let componentContent = new ComponentContent( 61 this.uiContext, wrapBuilder<[Params]>(builderText), 62 new Params(this.message + (this.contentArray.length), this.componentOffset) 63 ) 64 this.contentArray.push(componentContent) 65 this.overlayNode.addComponentContent(componentContent, this.componentContentIndex) 66 }) 67 Button("递增arrayIndex: " + this.arrayIndex).onClick(()=>{ 68 ++this.arrayIndex 69 }) 70 Button("递减arrayIndex: " + this.arrayIndex).onClick(()=>{ 71 --this.arrayIndex 72 }) 73 Button("删除ComponentContent" + this.arrayIndex).onClick(()=>{ 74 if (this.arrayIndex >= 0 && this.arrayIndex < this.contentArray.length) { 75 let componentContent = this.contentArray.splice(this.arrayIndex, 1) 76 this.overlayNode.removeComponentContent(componentContent.pop()) 77 } else { 78 console.info("arrayIndex有误") 79 } 80 }) 81 Button("显示ComponentContent" + this.arrayIndex).onClick(()=>{ 82 if (this.arrayIndex >= 0 && this.arrayIndex < this.contentArray.length) { 83 let componentContent = this.contentArray[this.arrayIndex] 84 this.overlayNode.showComponentContent(componentContent) 85 } else { 86 console.info("arrayIndex有误") 87 } 88 }) 89 Button("隐藏ComponentContent" + this.arrayIndex).onClick(()=>{ 90 if (this.arrayIndex >= 0 && this.arrayIndex < this.contentArray.length) { 91 let componentContent = this.contentArray[this.arrayIndex] 92 this.overlayNode.hideComponentContent(componentContent) 93 } else { 94 console.info("arrayIndex有误") 95 } 96 }) 97 Button("显示所有ComponentContent").onClick(()=>{ 98 this.overlayNode.showAllComponentContents() 99 }) 100 Button("隐藏所有ComponentContent").onClick(()=>{ 101 this.overlayNode.hideAllComponentContents() 102 }) 103 104 Button("跳转页面").onClick(()=>{ 105 router.pushUrl({ 106 url: 'pages/Second' 107 }) 108 }) 109 } 110 .width('100%') 111 .height('100%') 112 } 113} 114``` 115 116 117显示一个始终在屏幕左侧的悬浮球,点击可以弹出alertDialog弹窗。 118 119```ts 120import { ComponentContent, OverlayManager } from '@kit.ArkUI'; 121 122class Params { 123 context: UIContext 124 offset: Position 125 constructor(context: UIContext, offset: Position) { 126 this.context = context 127 this.offset = offset 128 } 129} 130@Builder 131function builderOverlay(params: Params) { 132 Column() { 133 Stack(){ 134 }.width(50).height(50).backgroundColor(Color.Yellow).position(params.offset).borderRadius(50) 135 .onClick(() => { 136 params.context.showAlertDialog( 137 { 138 title: 'title', 139 message: 'Text', 140 autoCancel: true, 141 alignment: DialogAlignment.Center, 142 gridCount: 3, 143 confirm: { 144 value: 'Button', 145 action: () => {} 146 }, 147 cancel: () => {} 148 } 149 ) 150 }) 151 }.focusable(false).width('100%').height('100%').hitTestBehavior(HitTestMode.Transparent) 152} 153 154@Entry 155@Component 156struct OverlayExample { 157 @State message: string = 'ComponentContent'; 158 private uiContext: UIContext = this.getUIContext() 159 private overlayNode: OverlayManager = this.uiContext.getOverlayManager() 160 private overlayContent:ComponentContent<Params>[] = [] 161 controller: TextInputController = new TextInputController() 162 163 aboutToAppear(): void { 164 let uiContext = this.getUIContext(); 165 let componentContent = new ComponentContent( 166 this.uiContext, wrapBuilder<[Params]>(builderOverlay), 167 new Params(uiContext, {x:0, y: 100}) 168 ) 169 this.overlayNode.addComponentContent(componentContent, 0) 170 this.overlayContent.push(componentContent) 171 } 172 173 aboutToDisappear(): void { 174 let componentContent = this.overlayContent.pop() 175 this.overlayNode.removeComponentContent(componentContent) 176 } 177 178 build() { 179 Column() { 180 181 } 182 .width('100%') 183 .height('100%') 184 } 185} 186 187``` 188 189 190