HarmonyOS鸿蒙Next中请问这个蒙版的属性设置为什么不生效啊?

HarmonyOS鸿蒙Next中请问这个蒙版的属性设置为什么不生效啊? 自定义弹出框以后没有蒙版,我发现它缩在我的自定义内容后面,可是这不科学啊,蒙版不应该是自动撑满屏幕的吗?

cke_1854.png


更多关于HarmonyOS鸿蒙Next中请问这个蒙版的属性设置为什么不生效啊?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

看楼主其它层的回复是需要实现蒙层的模糊效果,可以参考:

【解决方案】 自定义弹窗暂无内置属性支持设置蒙层背景模糊效果。给openCustomDialog蒙层添加模糊效果,可以在弹窗内容容器外包裹一层空column容器作为蒙层,设置backdropBlur属性,达到为蒙层添加模糊效果的目的,并通过监听onClick事件来关闭弹窗。为防止点击弹窗本身关闭弹窗,可以为弹窗内容容器设置空的onClick事件。 示例代码如下:

import { BusinessError } from '@kit.BasicServicesKit';
import { ComponentContent, promptAction, UIContext, window } from '@kit.ArkUI';
import { common } from '@kit.AbilityKit';

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

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

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

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

  static openDialog() {
    if (PromptActionDialogClass.contentNode !== null) {
      PromptActionDialogClass.context.getPromptAction().openCustomDialog(PromptActionDialogClass.contentNode, PromptActionDialogClass.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 (PromptActionDialogClass.contentNode !== null) {
      PromptActionDialogClass.context.getPromptAction().closeCustomDialog(PromptActionDialogClass.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 (PromptActionDialogClass.contentNode !== null) {
      PromptActionDialogClass.context.getPromptAction().updateCustomDialog(PromptActionDialogClass.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 = '';
  topHeight: number;
  constructor(text: string,topHeight: number) {
    this.text = text;
    this.topHeight = topHeight;
  }
}

@Builder
function buildText(params: Params) {
  // 蒙层
  Column() {
    // 实际弹窗内容
    Column(){
      Text(params.text)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 36 })
    }
    .backgroundColor(Color.Pink)
    // 加入空的点击事件弹窗就不会关闭
    .onClick(()=>{
    })
  }
  .width('100%')
  .height('100%')
  // 此处margin需要替换为顶部安全区高度topHeight,因为朦层会侵入安全区,所以做假朦层也要侵入安全区
  .margin({ top: -params.topHeight })
  .padding({ top: params.topHeight})
  .backdropBlur(20)
  .onClick(() => {
    PromptActionDialogClass.closeDialog();
  })
}

@Entry
@Component
struct Index {
  @State message: string = 'hello';
  private ctx: UIContext = this.getUIContext();
  private windowClass: window.Window = (this.getUIContext().getHostContext() as common.UIAbilityContext)
    .windowStage.getMainWindowSync();
  private topHeight: number = this.ctx.px2vp(
    this.windowClass.getWindowAvoidArea(window.AvoidAreaType.TYPE_SYSTEM).topRect.height);
  private contentNode: ComponentContent<Object> =
    new ComponentContent(this.ctx, wrapBuilder(buildText), new Params(this.message,this.topHeight));


  aboutToAppear(): void {
    PromptActionDialogClass.setContext(this.ctx);
    PromptActionDialogClass.setContentNode(this.contentNode);
    PromptActionDialogClass.setOptions({
      alignment: DialogAlignment.Top,
      offset: { dx: 0, dy: this.topHeight } ,
    });
  }

  build() {
    Row() {
      Column() {
        Button('open dialog and update options')
          .margin({ top: 50 })
          .onClick(() => {
            PromptActionDialogClass.openDialog();
          })
      }
      .width('100%')
      .height('100%')
    }
    .height('100%')
  }
}

【背景知识】

  • 推荐使用UIContext中获取到的PromptAction对象提供的openCustomDialog接口在相对应用复杂的场景来实现自定义弹出框,相较于CustomDialogController优势点在于页面解耦,支持动态刷新
  • backdropBlur为组件添加背景模糊效果,支持自定义设置模糊半径和灰阶参数。

更多关于HarmonyOS鸿蒙Next中请问这个蒙版的属性设置为什么不生效啊?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢!做出来了!非常感谢!

如果想要自定义的弹窗样式生效的话,需要将 CustomDialogController里的cusTomStyle字段设置为true;

customStyle: true

不然的话系统的预置弹窗样式会跟你自己的冲突,导致显示的效果不是理想效果~

我现在用的是自定义ComponentContent,不是直接调用系统的弹窗了,模糊度加不上,弹窗样式是有的,

小伙伴将maskColor去掉看看呢,颜色貌似太浅

// xxx.ets
@CustomDialog
struct CustomDialogExample {
  controller?: CustomDialogController;

  build() {
    Column() {
      Text('可展示在主窗口外的弹窗')
        .fontSize(30)
        .height(100)
      Button('点我关闭弹窗')
        .onClick(() => {
          if (this.controller != undefined) {
            this.controller.close();
          }
        })
        .margin(20)
    }
  }
}
@Entry
@Component
struct CustomDialogUser {
  dialogController: CustomDialogController | null = new CustomDialogController({
    builder: CustomDialogExample(),
    autoCancel: false,
    customStyle: false,
    cornerRadius: 20,
    offset: { dx: 0, dy: 120 },
    isModal: true,
    maskRect: { x: 0, y: 0, width: '100%', height: '100%' },
    // maskColor: '#00f5d700'
  })


  build() {
    Column() {
      Button('click me')
        .onClick(() => {
          if (this.dialogController != null) {
            this.dialogController.open();
          }
        }).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}

我已经换成component自定义弹窗了,然后我加上了蒙版,但是为什么加不上模糊度啊,

可以加上模糊度的,但是之前一版’#00f5d700’,这个色值透明度为0了,所以直接看不见了,不过弹窗还是用openCustomDialog,搭配wrapBuilder使用呢,也可以使用官方提供的第三方库dialogHub😊

哦哦,好,谢谢,

在HarmonyOS Next中,蒙版属性不生效通常与组件层级或样式冲突有关。检查是否在正确组件上应用了蒙版属性,确保其父容器未覆盖样式。确认蒙版属性值符合当前API规范,部分属性在特定容器内可能受限。若使用自定义组件,需验证属性绑定机制是否正确传递。

从截图来看,蒙版未生效通常是因为层级(z-index)或定位问题。在HarmonyOS Next中,蒙版组件需要设置绝对定位(position: absolute/fixed)并覆盖整个视口,同时确保其z-index高于背景内容但低于弹出层。

检查以下几点:

  1. 定位设置:蒙版应使用position: fixedabsolute,并设置top: 0; left: 0; width: 100%; height: 100%
  2. 层级顺序:蒙版的z-index需大于页面内容但小于弹出框(例如,内容z-index: 1,蒙版z-index: 2,弹出框z-index: 3)。
  3. 背景属性:确认蒙版的background属性已设置(如半透明黑色background: rgba(0,0,0,0.5))。
  4. 父容器限制:若蒙版被嵌套在具有定位或溢出隐藏的容器内,可能导致无法全屏覆盖。建议将蒙版置于根节点或独立层级。

可尝试在代码中显式定义蒙版样式,并检查是否有其他样式覆盖。若问题仍存在,提供相关代码片段可进一步分析。

回到顶部