自定义弹窗 自定义朦层,给蒙层加blur

逻辑端口
发布于 2025-9-25 10:55
浏览
0收藏
import { BusinessError } from '@kit.BasicServicesKit';
import { ComponentContent, display, promptAction, UIContext } from '@kit.ArkUI';

export class PromptActionClass {
  static ctx: UIContext;
  static contentNode: ComponentContent<Object>;
  static options: promptAction.BaseDialogOptions;


  static setContext(context: UIContext) {
    PromptActionClass.ctx = context;
  }


  static setContentNode(node: ComponentContent<Object>) {
    PromptActionClass.contentNode = node;
  }


  static setOptions(options: promptAction.BaseDialogOptions) {
    PromptActionClass.options = options;
  }


  static openDialog() {
    if (PromptActionClass.contentNode !== null) {
      PromptActionClass.ctx.getPromptAction().openCustomDialog(PromptActionClass.contentNode, PromptActionClass.options)
        .then(() => {
          console.info('OpenCustomDialog complete.');
        })
        .catch((error: BusinessError) => {
          let message = (error as BusinessError).message;
          let code = (error as BusinessError).code;
          console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);
        })
    }
  }


  static closeDialog() {
    if (PromptActionClass.contentNode !== null) {
      PromptActionClass.ctx.getPromptAction().closeCustomDialog(PromptActionClass.contentNode)
        .then(() => {
          console.info('CloseCustomDialog complete.');
        })
        .catch((error: BusinessError) => {
          let message = (error as BusinessError).message;
          let code = (error as BusinessError).code;
          console.error(`CloseCustomDialog args error code is ${code}, message is ${message}`);
        })
    }
  }


  static updateDialog(options: promptAction.BaseDialogOptions) {
    if (PromptActionClass.contentNode !== null) {
      PromptActionClass.ctx.getPromptAction().updateCustomDialog(PromptActionClass.contentNode, options)
        .then(() => {
          console.info('UpdateCustomDialog complete.');
        })
        .catch((error: BusinessError) => {
          let message = (error as BusinessError).message;
          let code = (error as BusinessError).code;
          console.error(`UpdateCustomDialog args error code is ${code}, message is ${message}`);
        })
    }
  }
}


class Params {
  text: string = "";


  constructor(text: string) {
    this.text = text;
  }
}






@Builder
function buildText(params: Params) {
  //朦层
  Column() {
    //实际弹窗内容
    Column(){
      Text(params.text)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 36 })
    }
    .backgroundColor('#fff')
    //todo 加入空的点击事件就不会关闭了
    .onClick(()=>{

    })
  }
  .width('100%')
  .height('100%')

  //获取顶部安全区
  // let topHeight = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height;
  // let bottomHeight = win.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR).bottomRect.height;
  // this.topPadding = px2vp(topHeight)
  // this.bottomPadding = px2vp(bottomHeight)
  //.margin({ top: -topHeight })
  .margin({ top: -40 })//todo 此处40需要替换为顶部安全区高度topHeight,因为朦层会侵入安全区,所以做假朦层也要侵入安全区
  .padding({ top: 40 })
  //此处设置沉浸式失效,所以得用 .margin({ top: -topHeight }) 来做沉浸式
  //.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM])
  .backgroundColor('#ff433535')

  .backdropBlur(20)
  .onClick(() => {
    PromptActionClass.closeDialog();
  })
}


@Entry
@Component
struct Index {
  @State message: string = "hello";
  private ctx: UIContext = this.getUIContext();
  private contentNode: ComponentContent<Object> =
    new ComponentContent(this.ctx, wrapBuilder(buildText), new Params(this.message));


  aboutToAppear(): void {
    PromptActionClass.setContext(this.ctx);
    PromptActionClass.setContentNode(this.contentNode);
    PromptActionClass.setOptions({
      alignment: DialogAlignment.Top,
      offset: { dx: 0, dy: 50 } ,
      maskColor: Color.Red
    });
  }


  build() {
    Row() {
      Column() {
        Button("open dialog and update options")
          .margin({ top: 50 })
          .onClick(() => {
            PromptActionClass.openDialog();
          })

      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

分类
标签
收藏
回复
举报
回复
    相关推荐