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() { 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显示一个始终在屏幕左侧的悬浮球,点击可以弹出alertDialog弹窗。 116 117```ts 118import { ComponentContent, OverlayManager } from '@kit.ArkUI'; 119 120class Params { 121 context: UIContext 122 offset: Position 123 constructor(context: UIContext, offset: Position) { 124 this.context = context 125 this.offset = offset 126 } 127} 128@Builder 129function builderOverlay(params: Params) { 130 Column() { 131 Stack(){ 132 }.width(50).height(50).backgroundColor(Color.Yellow).position(params.offset).borderRadius(50) 133 .onClick(() => { 134 params.context.showAlertDialog( 135 { 136 title: 'title', 137 message: 'text', 138 autoCancel: true, 139 alignment: DialogAlignment.Center, 140 gridCount: 3, 141 confirm: { 142 value: 'button', 143 action: () => {} 144 }, 145 cancel: () => {} 146 } 147 ) 148 }) 149 }.focusable(false).width('100%').height('100%').hitTestBehavior(HitTestMode.Transparent) 150} 151 152@Entry 153@Component 154struct OverlayExample { 155 @State message: string = 'ComponentContent'; 156 private uiContext: UIContext = this.getUIContext() 157 private overlayNode: OverlayManager = this.uiContext.getOverlayManager() 158 private overlayContent:ComponentContent<Params>[] = [] 159 controller: TextInputController = new TextInputController() 160 161 aboutToAppear(): void { 162 let uiContext = this.getUIContext(); 163 let componentContent = new ComponentContent( 164 this.uiContext, wrapBuilder<[Params]>(builderOverlay), 165 new Params(uiContext, {x:0, y: 100}) 166 ) 167 this.overlayNode.addComponentContent(componentContent, 0) 168 this.overlayContent.push(componentContent) 169 } 170 171 aboutToDisappear(): void { 172 let componentContent = this.overlayContent.pop() 173 this.overlayNode.removeComponentContent(componentContent) 174 } 175 176 build() { 177 Column() { 178 179 } 180 .width('100%') 181 .height('100%') 182 } 183} 184 185``` 186 187 188