华为仓颉鸿蒙HarmonyOS NEXT仓颉原生CustomDialogController 自定义弹窗

488 阅读4分钟

通过CustomDialogController类显示自定义弹窗。使用弹窗组件时,可优先考虑自定义弹窗,便于自定义弹窗的样式与内容。

图片

说明

自定义弹窗组件需要用@CustomDialog修饰,
@CustomDialog是一个具有限制的@Component@CustomDialog修饰的组件必须包含一个类型为Option<Customdialog>的
属性。这个属性会在使用到该弹窗的组件中被隐式地赋值。
混合页面场景下CustomDialog暂不支持设置动画属性。

构造函数

init(CustomDialogControllerOptions)

public init(options: CustomDialogControllerOptions)

自定义弹窗的所有参数,不支持动态刷新。

参数名参数类型必填默认值描述
optionsCustomDialogControllerOptions-自定义弹窗设置的参数。

说明

构造的时候options参数需直接使用CustomDialogControllerOptions
构造函数,不能使用变量。

函数

close()

public func close()

关闭显示的自定义弹窗,若已关闭,则不生效。

open()

public func `open`()

显示自定义弹窗内容,允许多次使用,但如果弹框为SubWindow模式,则该弹框不允许再弹出SubWindow弹框。

setBuilder(()-> Unit)

public func setBuilder(builder: ()-> Unit)

设置一个构建器,用户无需主动调用,会在宏展开后隐式地调用。

参数名参数类型必填默认值描述
builder()-> Unit-builder对应的渲染函数。

bindView(CustomView)

public func bindView(view: CustomView)

将CustomView绑定到自定义弹窗构建器, 用户无需主动调用,会在宏展开后隐式地调用。

参数名参数类型必填默认值描述
viewCustomView-被绑定的CustomView。

枚举类型

DialogAlignment

定义弹窗在竖直方向上的对齐方式。

枚举值描述
Top垂直顶部对齐。
Center垂直居中对齐。
Bottom垂直底部对齐。
Default默认对齐。
TopStart左上对齐。
TopEnd右上对齐。
CenterStart左中对齐。
CenterEnd右中对齐。
BottomStart左下对齐。
BottomEnd右下对齐。

自定义类型说明

CustomDialogControllerOptions

构造函数

public init(
        builder: () -> Unit,
        cancel!: () -> Unit = { => },
        autoCancel!: Bool = true,
        alignment!: DialogAlignment = DialogAlignment.Default,
        offset!: Offset = Offset(0.vp, 0.vp),
        customStyle!: Bool = false,
        gridCount!: Option<Int32> = Option.None,
        maskColor!: Color = Color(0x33000000),
        maskRect!: Rectangle = Rectangle(),
        openAnimation!: Option<AnimateParam> = Option.None,
        closeAnimation!: Option<AnimateParam> = Option.None,
        showInSubWindow!: Bool = false,
        backgroundColor!: Option<Color> = Option.None,
        cornerRadius!: Length = 24.vp
    )

声明自定义弹窗相关设置的参数。

参数名参数类型必填默认值描述
builder()-> Unit{ => }自定义弹窗内容构造器。
cancel()-> Unit{ => }返回、ESC键和点击遮障层弹窗退出时的回调。
autoCancelBooltrue是否允许点击遮障层退出,true表示关闭弹窗。false表示不关闭弹窗。
alignmentDialogAlignmentDialogAlignment.Default弹窗在竖直方向上的对齐方式。
offsetOffsetOffset(0.vp, 0.vp)弹窗相对alignment所在位置的偏移量。
customStyleBoolfalse弹窗容器样式是否自定义。设置为false时,弹窗容器的宽度根据栅格系统自适应,不跟随子节点;高度自适应子节点,最大为窗口高度的90%。设置为true时,宽度跟随子节点自适应,圆角为0,弹窗背景色为透明色。
gridCountOptionOption.None弹窗宽度占栅格宽度的个数。默认为按照窗口大小自适应,异常值按默认值处理,最大栅格数为系统最大栅格数。
maskColorColorColor(0x33000000)自定义蒙层颜色。
maskRectRectangleRectangle()弹窗遮蔽层区域,在遮蔽层区域内的事件不透传,在遮蔽层区域外的事件透传。
openAnimationOptionOption.None自定义设置弹窗弹出的动画效果相关参数。iterations默认值为1,默认播放一次,设置为其他数值时按默认值处理。playMode控制动画播放模式,默认值为PlayMode.Normal,设置为其他数值时按照默认值处理。
closeAnimationOptionOption.None自定义设置弹窗关闭的动画效果相关参数。iterations默认值为1,默认播放一次,设置为其他数值时按默认值处理。playMode控制动画播放模式,默认值为PlayMode.Normal,设置为其他数值时按照默认值处理。
showInSubWindowBoolfalse某弹框需要显示在主窗口之外时,是否在子窗口显示此弹窗。showInSubWindow为true的弹窗无法触发显示另一个showInSubWindow为true的弹窗。
backgroundColorOptionOption.None设置弹窗背板填充。如果同时设置了内容构造器的背景色,则backgroundColor会被内容构造器的背景色覆盖。
cornerRadiusLength24.vp设置背板的圆角半径。

说明

参数builder并非init函数的实际参数,在@Component宏展开后会去掉该参数
并隐式地在组件初始化函数中调用 setBuilder(builder: ()-> Unit)。

示例代码

import ohos.base.*
    import ohos.component.*
    import ohos.state_manage.*
    import ohos.state_macro_manage.*
    
    @CustomDialog
    class MyDialog {
        var controller: Option<CustomDialogController> = Option.None
        func build() {
            Row(60) {
                Button("cancel").onClick { evt =>
                    controller?.close()
                }
    
                Button("confirm").onClick { evt =>
                    controller?.close()
                }
            }.height(500.px)
        }
    }
    
    @Entry
    @Component
    class MyView {
        var dialogController: CustomDialogController = CustomDialogController(CustomDialogControllerOptions(builder: MyDialog()))
        func build() {
            Column {
                Button("open dialog").onClick({evt =>
                    dialogController.`open`()
                })
            }
        }
    }

如对您有帮助,帮忙点个“在看 、关注” 让更多的人受益~!

技术交流群可加wx“LB-9191”备注cangjie