鸿蒙(HarmonyOS)常见的三种弹窗方式
最近有一个想法,做一个针对鸿蒙官方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时的回调");
}
})
效果图:
参考官方链接:
自定义弹窗
自定义弹窗相比警告弹窗更为灵活,支持自定义弹窗的样式与内容。
自定义弹窗的参数:
参数名 | 参数类型 | 必填 | 参数描述 |
---|---|---|---|
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();
效果图:
参考官方链接:
加载中弹窗
加载中弹窗弹窗其实就是自定义弹窗实现,只是内容构造器不一样而已,给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
})
}
}
效果图:
源码下载:
如果您想第一时间看我的后期文章,扫码关注公众号
安辉编程笔记 - 开发技术分享
扫描二维码加关注
鸿蒙(HarmonyOS)常见的三种弹窗方式的更多相关文章
- JavaScript-浏览器的三种弹窗方式
//BOM 弹窗 //同步 阻断 alert("alert弹窗"); //返回布尔值 (是/否) var bcf = confirm("confirm弹窗"); ...
- 数据库常见的三种join方式
数据库常见的join方式有三种:inner join, left outter join, right outter join(还有一种full join,因不常用,本文不讨论).这三种连接方式都是将 ...
- js里常见的三种请求方式$.ajax、$.post、$.get分析
$.post和$.get是$.ajax的一种特殊情况: $.post和$.get请求都是异步请求,回调函数里写return来返回值是无意义的, 回调函数里对外部变量进行赋值也是无意义的. 即使是$.a ...
- 常见的三种Web服务架构
常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...
- Service组件 总结 + 绑定理Service三种实现方式 Messager + Binder + AIDL
在Android中进程按优先级可以分为五类,优先级从高到低排列: - 前台进程 该进程包含正在与用户进行交互的界面组件,比如一个Activity - 可视进程 该进程中的组件虽然没有和用户交互,但是仍 ...
- Android平台中实现对XML的三种解析方式
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- python对mysql数据库操作的三种不同方式
首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
- [转]Apache HTTP Server 与 Tomcat 的三种连接方式介绍
首先我们先介绍一下为什么要让 Apache 与 Tomcat 之间进行连接.事实上 Tomcat 本身已经提供了 HTTP 服务,该服务默认的端口是 8080,装好 tomcat 后通过 8080 端 ...
随机推荐
- 推荐一款Python接口自动化测试数据提取分析神器!
1.引言 在处理JSON数据时,我们常常需要提取.筛选或者变换数据.手动编写这些操作的代码不仅繁琐,而且容易出错.Python作为一个功能强大的编程语言,拥有丰富的库和工具来处理这些数据.今天,将介绍 ...
- django信号中的条件判断不符合时如何提示错误并返回
在Django中,如果你在信号(Signal)处理函数中需要进行条件判断,如果条件不符合,你可以触发一个异常,并在视图或其他地方捕获这个异常,然后返回相应的错误提示. 以下是一个简单的例子,演示如何在 ...
- [oeasy]python0091_仙童公司_八叛逆_intel_8080_altair8800_牛郎星
编码进化 个人电脑 计算机 通过电话网络 进行连接 极客 利用技术 做一些有趣的尝试 极客文化 是 认真研究技术的 文化 计算机 不再是 高校和研究机构高墙里面的 神秘事物 而是 生活中常见的 家用电 ...
- [oeasy]python0012_字符_character_chr函数_根据序号得到字符
字符(character) 回忆上次内容 上次了解了ord函数 这个函数可以通过字符得到序号 那么可以反过来吗? 通过序号得到字符可以吗? 编辑 ord的逆运算chr 有来就有回 编辑 好 ...
- [oeasy]python0010 - python虚拟机解释执行py文件的原理
解释运行程序 回忆上次内容 我们这次设置了断点 设置断点的目的是更快地调试 调试的目的是去除bug 别害怕bug 一步步地总能找到bug 这就是程序员基本功 调试deb ...
- oeasy教您玩转python - 003 - # - 继续运行
继续运行 回忆上次内容 在解释器里玩耍 print("Hello World") 1+1 编写了 py 文件 运行了 py 文件 这次我们继续丰富这个文件 分析 py 文件 我 ...
- C# ClassHelper动态创建程序集和类, 添加/删除类属性
using System; using System.Collections.Generic; using System.Reflection; using System.Reflection.Emi ...
- 2023/4/21 SCRUM个人博客
1.我昨天的任务 学习信号和槽的定义并完善UI界面的基础知识 2.遇到了什么困难 难以理解design的设计理念 3.我今天的任务 学习如何使用QTdesign,并完善UI
- 【Java】使用Druid连接池的监控面板排查慢SQL
默认在后台服务的地址: http://localhost:8078/druid/login.html 账号信息放在配置文件中获取: server: port: 8078 spring: datasou ...
- 使用 C# 和 ONNX 來玩转Phi-3 SLM
LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电 ...