首页 > 其他分享 >鸿蒙(HarmonyOS)常见的三种弹窗方式

鸿蒙(HarmonyOS)常见的三种弹窗方式

时间:2024-08-31 09:14:26浏览次数:10  
标签:string 鸿蒙 color app HarmonyOS fontColor 默认值 弹窗

最近有一个想法,做一个针对鸿蒙官方API的工具箱项目,介绍常用的控件,以及在项目中如何使用,今天介绍Harmony中如何实现弹窗功能。

警告弹窗

警告弹窗是一个App中非常常用的弹窗,例如:

  • 删除一条记录,提示一下用户:您确定要删除吗?
  • 在App首页,点击返回时,提示一下用户:您确定要退出App吗?

使用AlertDialog.show方法进行弹窗,这个方法支持传入以下三个类中的任意一个对象

  • AlertDialogParamWithConfirm
  • AlertDialogParamWithButtons
  • AlertDialogParamWithOptions

以AlertDialogParamWithButtons对象进行说明,下面表格介绍常用属性:

参数名 参数类型 必填 参数描述
title ResourceStr 弹窗标题
message ResourceStr 弹窗内容
autoCancel boolean 点击遮障层时,是否关闭弹窗。默认值:true
primaryButton 按钮的文本内容、文本色、按钮背景色和点击回调
secondaryButton 按钮的文本内容、文本色、按钮背景色和点击回调
cancel () => void 点击遮障层关闭dialog时的回调
alignment DialogAlignment 弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default

接下来,我们用代码来实现一下:

AlertDialog.show({
    title:"弹窗标题",
    message:"这是弹窗内容",
    autoCancel:true,//点击遮障层时,是否关闭弹窗。默认值:true
    alignment: DialogAlignment.Center,//弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default
    primaryButton: {
        value: "取消",
        fontColor: '#181818',
        action: () => {
            AppUtil.showToast("点击了取消按钮");
        }
    },
    secondaryButton: {
        value: "确定",
        fontColor: $r('app.color.mainColor'),
        action: () => {
            AppUtil.showToast("点击了确定按钮");
        }
    },
    cornerRadius:12,//弹窗边框弧度
    width:'80%', //弹窗宽度
    cancel:()=>{
        AppUtil.showToast("点击遮障层关闭dialog时的回调");
    }
})

效果图:

参考官方链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-methods-alert-dialog-box-0000001478341185-V2

自定义弹窗

自定义弹窗相比警告弹窗更为灵活,支持自定义弹窗的样式与内容。

自定义弹窗的参数:
参数名 参数类型 必填 参数描述
builder CustomDialog 自定义弹窗内容构造器。
cancel () => void 点击遮障层退出时的回调。
autoCancel boolean 是否允许点击遮障层退出。默认值:true
alignment DialogAlignment 弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default
offset Offset 弹窗相对alignment所在位置的偏移量。
customStyle boolean 弹窗容器样式是否自定义。默认值:false,弹窗容器的宽度根据栅格系统自适应,不跟随子节点;高度自适应子节点,最大为窗口高度的90%;圆角为24vp。
gridCount8+ number 弹窗宽度占栅格宽度的个数。默认为按照窗口大小自适应,异常值按默认值处理,最大栅格数为系统最大栅格数。

代码实现

我们使用自定义弹窗实现隐私政策弹窗,新建PrivacyPolicyDialogBackUp类,也就是内容构造器,使用@CustomDialog修饰,内部有一个属性controller: CustomDialogController,这些都是常规写法,然后在build中实现界面布局。

@CustomDialog
export default struct PrivacyPolicyDialogBackUp{
    controller: CustomDialogController

    cancel!: () => void
    confirm!: () => void

    build() {
        Column() {
            Text($r('app.string.simple_user_policy')).fontSize(18).fontColor($r('app.color.title_color')).margin({ top: 30, bottom: 19 })

            Scroll(){
                Text(){
                    Span($r('app.string.privacy_policy_start'))
                    Span($r('app.string.user_agreement_two')).fontColor($r('app.color.mainColor')).onClick(() => {
                        this.openWebUrl("/useragreement.html");
                    })
                    Span($r('app.string.and'))
                    Span($r('app.string.privacy_policy_two')).fontColor($r('app.color.mainColor')).onClick(() => {
                        this.openWebUrl("/privacypolicy.html");
                    })
                    Span($r('app.string.simple_privacy_policy'))
                }.fontSize(16).fontColor($r('app.color.body_color')).margin({
                    left:25,
                    right:25
                })
            }.height(120)

            Column(){
                Button($r('app.string.disagree_privacy_policy')).onClick(() => {
                    this.controller.close();
                    this.cancel();
                }).fontColor($r('app.color.other_color')).fontSize(15).backgroundColor(Color.Transparent)

                Button($r('app.string.agree_privacy_policy')).onClick(() => {
                    this.controller.close();
                    this.confirm();
                }).fontColor($r('app.color.white')).fontSize(17)
                    .linearGradient({
                        direction: GradientDirection.Right, colors:[[$r('app.color.start_main_color'),0.0],[$r('app.color.end_main_color'),1.0]]
                    }).width('80%').margin({
                    top:15,bottom:21
                }).borderRadius(24)
            }
        }
    }

    openWebUrl(urlSuffix:string){
        let url= AppConstant.URL+urlSuffix;
        logger.info("url:"+url)
        router.pushUrl({
            url: Pages.WebViewPage,
            params:{
                data1: 'message',
                url: url,  // 传递的 URL 参数
            }
        }, router.RouterMode.Single)
    }
}

在组件中创建CustomDialogController实例,指定builder属性,就是上面写的内容构造器

privacyPolicyDialog: CustomDialogController = new CustomDialogController({
  builder: PrivacyPolicyDialog({
    cancel:this.onCancel.bind(this),
    confirm:this.onAgree.bind(this)
  }),
  alignment: DialogAlignment.Default,  // 可设置dialog的对齐方式,设定显示在底部或中间等,默认为底部显示
  cornerRadius:13,
  autoCancel:false
})

显示弹窗

this.privacyPolicyDialog.open();

关闭弹窗

this.privacyPolicyDialog.close();

效果图:

参考官方链接:

https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V2/ts-methods-custom-dialog-box-0000001477981237-V2

加载中弹窗

加载中弹窗弹窗其实就是自定义弹窗实现,只是内容构造器不一样而已,给Image组件设置animation动画,无限循环图片

@CustomDialog
export default struct LoadingDialog {
    controller: CustomDialogController

    private loadingText: string|Resource = "加载中..."
    @State angle:number = 10

    aboutToAppear(){
        setTimeout(()=>{
            this.angle = 1440 // 设定一个大的旋转角度,确保动画执行
        },100)
    }

    build() {
        Column(){
            Image($r('app.media.icon_loading_3'))
                .width(70)
                .height(70)
                .rotate({angle:this.angle})
                .animation({
                    duration: 5000,
                    curve: Curve.Linear,
                    delay: 0,
                    iterations: -1, // 设置-1表示动画无限循环
                    playMode: PlayMode.Normal
                })


            Text(this.loadingText).fontSize(14).fontColor(0xffffff).margin({top:10})
        }.backgroundColor(0x88000000).borderRadius(10).padding({
            left:20,right:20,top:10,bottom:10
        })
    }
}

效果图:

源码下载:

https://github.com/ansen666/harmony_tools

如果您想第一时间看我的后期文章,扫码关注公众号

      安辉编程笔记 - 开发技术分享
             扫描二维码加关注

安辉编程笔记

标签:string,鸿蒙,color,app,HarmonyOS,fontColor,默认值,弹窗
From: https://www.cnblogs.com/yishaochu/p/18389843

相关文章

  • HarmonyOS开发指南:ArkUI自定义Toast弹窗样式规范
     可以通过使用自定义弹窗和定时器达到类似Toast的效果。场景一:自定义弹窗实现弹窗中加入icon和文字,支持Button。方案:⦁   使用@CustomDialog装饰器装饰自定义弹窗,在此装饰器内进行自定义内容(也就是弹框内容)、并创建构造器,与装饰器呼应相连。⦁   使用定时器,在页面......
  • 【鸿蒙学习】HarmonyOS应用开发者高级认证 - 认证通过(附题目)
    学完时间:2024年8月29日学完排名:第192546名一、前言叨叨经过几日的休整,我终于再次挑战高级认证,并以82分的成绩堪堪越过了及格线。然而,通过考试后我惊讶地发现,原来顺利过关的人数如此众多。我逐一攻克了所有基础题目,却发现随着基础题的刷过,同行的考生越来越少,而开发者认证......
  • HarmonyOS开发实战5.0【地址交换动画案例】
    介绍本示例介绍使用显式动画 animateTo 实现左右地址交换动画。该场景多用于机票、火车票购买等出行类订票软件中。效果预览图使用说明加载完成后显示地址交换动画页面,点击中间的图标,左右两边地址交换。实现思路创建左右两边Text组件显示地址。设置初始偏移量以及文......
  • 全栈程序员 | 精通安卓、鸿蒙,小程序,Java、Vue.js、SpringBoot及更多技术
    我是一个全栈程序员,擅长多种开发技术,包括安卓开发、Java编程、Vue.js、SpringBoot以及小程序开发等。我在技术上有广泛的涉猎,并致力于将创新解决方案应用于实际项目中。无论是开发高性能的安卓应用,还是构建响应式网页、实现复杂的后端功能,我都能提供专业的技术支持和高质量的代......
  • 鸿蒙HarmonyOS自定义组件开发和使用_鸿蒙自定义组件
    自定义组件的介绍在开发和使用自定义组件直接,我们需要了解什么是自定义组件?在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行UI界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离,后......
  • HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容
    背景随着消费电子产品和移动互联网的普及,未成年人互联网普及率96.8%,超过80%的未成年人都拥有自己的上网设备,而如何引导孩子正确上网一直是家长们的担忧。市场上很多电子设备、系统推出了一些未成年人管控能力,却需要家长到各个应用去开启青少年模式,如哔哩哔哩、芒果TV、豆瓣等不同......
  • HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容
    背景随着消费电子产品和移动互联网的普及,未成年人互联网普及率96.8%,超过80%的未成年人都拥有自己的上网设备,而如何引导孩子正确上网一直是家长们的担忧。市场上很多电子设备、系统推出了一些未成年人管控能力,却需要家长到各个应用去开启青少年模式,如哔哩哔哩、芒果TV、豆瓣等不同类......
  • 鸿蒙开发实战:Column和Row容器组件的使用规范
    Column与Row由之前的介绍可知,我们可以通过Column和Row容器来对页面进行以一个简单的布局,划分不同的功能分区,以搭建一个完整的页面,接下来我将介绍它更多的属性,使其在使用中更好的对页面进行排布划分。首先如图我们可以看到,Column和Row都有一个可选参数“space”,space的类型......
  • 鸿蒙开发实战:声明静态订阅应用规范
    静态订阅者在未接收订阅的目标事件时,处于未拉起状态,当系统或应用发布了指定的公共事件后,静态订阅者将被拉起,并执行onReceiveEvent回调。开发者可通过在onReceiveEvent回调中执行业务逻辑,实现当应用接收到特定公共事件时执行业务逻辑的目的。例如,某应用希望在设备开机的时......
  • HarmonyOS SDK实况窗服务
    HarmonyOSSDK实况窗服务(LiveViewKit)作为一个实时呈现应用服务信息变化的小窗口,遍布于设备的各个使用界面,它的魅力在于将复杂的应用场景信息简洁提炼并实时刷新,在不影响当前其他应用操作的情况下,时刻向用户展示最新的信息动态,用户也可以点击实况窗卡片或胶囊进入应用落地页查看......