HarmonyOS 鸿蒙Next CustomDialogController支持背景Transparent吗?
HarmonyOS 鸿蒙Next CustomDialogController支持背景Transparent吗?
@Entry({
routeName: "QrScanPage"
})
@Component
export struct QrScanPage {
scannerController: ScannerController = new ScannerController()
@State actionList: ActionListDTO[] = []
actionListDialogController: CustomDialogController = new CustomDialogController({
builder: CustomContentDialog({
contentAreaPadding: {
top: 0,
right: 0,
bottom: 0,
left: 0
},
contentBuilder: () => {
this.buildContent();
},
}),
})
@Builder
buildContent(): void {
Column() {
Grid() {
ForEach(this.actionList, (item: ActionListDTO) => {
GridItem() {
this.ActionItem(item);
}
}, (item: ActionListDTO) => item.targetAddress)
}
.columnsGap(20)
.rowsGap(20)
.enableScrollInteraction(false)
.columnsTemplate('1fr 1fr 1fr')
.margin(14)
.width(CommonConstants.FULL_PERCENT)
.height(CommonConstants.FORTY_PERCENT)
}
.backgroundColor(Color.Transparent)
}
@Builder
ActionItem(item: ActionListDTO) {
Column() {
Image(item.appIcon ? item.appIcon : $r("app.media.startIcon"))
.width(36)
.height(36)
Text(item.appName).fontSize(12).margin({ top: 10 })
Text(item.actionName)
.fontSize(12)
.margin({ top: 10 })
.width(CommonConstants.FULL_PERCENT)
.backgroundColor($r("app.color.accent_color"))
.fontColor(Color.White)
.textAlign(TextAlign.Center)
}
.onClick(() => {
// SubAppManager.gotoSubApp(item as BaseApp)
})
}
build() {
Navigation() {
Column() {
Scanner({
controller: this.scannerController,
cornerLineShow: false, // 隐藏四个角
scanLineShow: false, // 隐藏扫描线
// albumsShow: false, // 隐藏图库按钮和文字
// lightShow: false, // 隐藏闪光点按钮和文字
// tipsShow: false, // 隐藏提示词
maskColor: Color.Transparent, // 蒙层透明
albumsIcon: $r('app.media.icon_select_img'),
albumsText: "选择照片",
lightCloseIcon: $r('app.media.icon_light_off'),
lightOpenIcon: $r('app.media.icon_light_on'),
lightOpenText: "开启手电",
lightCloseText: "关闭手电",
onScanResult: async (code: ResultState, value: string) => {
if (code == ResultState.Success) {
// promptAction.showToast({ message: value })
if (StrUtil.isNotEmpty(value)) {
// 首页先看是否url,如是直接打开,如否则调接口
try {
let checkUrl = url.URL.parseURL(value)
let urlModel: UrlModel = { url: checkUrl.toString() }
CommonUtils.openWebView(urlModel.url)
} catch (e) {
//解密返回
let responseEntity: ResponseEntity<Record<string, string>> = await authQrCodeDecrypt(value)
let actionModel: ActionModel = JSONUtil.jsonToBean(ActionModel, JSON.stringify(responseEntity.data))
if (StrUtil.isNotNull(actionModel.nullReason)) {
ToastUtil.showToast(actionModel.nullReason)
}
if (ArrayUtil.isNotEmpty(actionModel.actionList)) {
this.actionList = actionModel.actionList
this.scannerController.releaseScan()
this.actionListDialogController.open()
} else {
this.scannerController.startScan()
}
}
}
}
},
onCameraReject: () => {
promptAction.showToast({ message: '摄像头权限被拒绝' })
}
})
.width(CommonConstants.FULL_PERCENT)
.height(CommonConstants.NINETY_PERCENT)
}
.width(CommonConstants.FULL_PERCENT)
.height(CommonConstants.FULL_PERCENT)
}
.size({ width: CommonConstants.FULL_PERCENT, height: CommonConstants.FULL_PERCENT })
.title("扫描二维码")
.titleMode(NavigationTitleMode.Mini)
.margin({ top: CommonUtils.getStatusBarHeightMarginTop() })
}
}
在contentBuilder中最外层Column加入.backgroundColor(Color.Transparent),实际还是默认白色
2 回复
自定义弹窗想要背景透明需要外部设置参数 customStyle: true 内部弹窗颜色设置为透明backgroundColor(Color.Transparent) 即可
demo如下:
[@CustomDialog](/user/CustomDialog)
[@Component](/user/Component)
struct CustomDialogExample {
controller?: CustomDialogController
build() {
Column() {
Text("测试一下弹窗").width(100).height(100).backgroundColor(Color.Orange)
}.borderRadius(10).backgroundColor(Color.Transparent).height(300)
// 如果需要使用border属性或cornerRadius属性,请和borderRadius属性一起使用。
}
}
[@Entry](/user/Entry)
[@Component](/user/Component)
struct CustomDialogUser {
[@State](/user/State) inputValue: string = 'click me'
dialogController: CustomDialogController | null = new CustomDialogController({
builder: CustomDialogExample(),
cancel: this.exitApp,
autoCancel: true,
alignment: DialogAlignment.Bottom,
offset: { dx: 0, dy: -20 },
gridCount: 4,
customStyle: true,
cornerRadius: 10,
})
// 在自定义组件即将析构销毁时将dialogController置空
aboutToDisappear() {
this.dialogController = null // 将dialogController置空
}
onCancel() {
console.info('Callback when the first button is clicked')
}
onAccept() {
console.info('Callback when the second button is clicked')
}
exitApp() {
console.info('Click the callback in the blank area')
}
build() {
Column() {
Button(this.inputValue)
.onClick(() => {
if (this.dialogController != null) {
this.dialogController.open()
}
}).backgroundColor(0x317aff)
}.width('100%').margin({ top: 5 })
}
}
HarmonyOS 鸿蒙Next CustomDialogController支持背景Transparent。
在HarmonyOS中,CustomDialog组件允许开发者自定义弹窗的样式和行为。对于CustomDialog的背景颜色,是可以通过设置其相关属性来实现的。特别是maskColor
属性,它决定了弹窗蒙层的颜色。如果将maskColor
设置为Color.Transparent
(透明色),那么就可以达到去除蒙层颜色或使背景透明的效果。
然而,需要注意的是,这里所说的透明效果是指蒙层的透明,而不是整个弹窗背景的透明。如果希望弹窗的背景(即弹窗内容区域的背景)也透明,那么可能需要通过其他方式来实现,比如设置弹窗内容区域的背景颜色为透明,并调整其他相关属性以确保透明效果符合预期。
如果在实际操作中遇到问题,或者需要更详细的指导,建议查阅HarmonyOS的官方文档或相关开发资料。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。