【HarmonyOS】鸿蒙多Toast显示工具类

【HarmonyOS】封装可以同时显示多个toast的工具类

src/main/ets/common/MyPromptActionUtil.ets

import { ComponentContent, PromptAction, window } from '@kit.ArkUI';
import { BusinessError } from '@kit.BasicServicesKit';// MyPromptInfo 类用于生成唯一的 dialogID
export class MyPromptInfo {public dialogID: stringconstructor() {this.dialogID = this.generateRandomString(10)}// 生成指定长度的随机字符串generateRandomString(length: number): string {const characters = 'abcdefghijklmnopqrstuvwxyz0123456789';let result = '';for (let i = 0; i < length; i++) {const randomIndex = Math.floor(Math.random() * characters.length);result += characters.charAt(randomIndex);}return result;}
}// MyPromptActionUtil 类用于封装弹窗操作
export class MyPromptActionUtil<T extends MyPromptInfo> {static myDialogPromptActionUtil: MyPromptActionUtil<MyToastInfo> | undefined = undefinedpublic static showToast(message: string) {if (!MyPromptActionUtil.myDialogPromptActionUtil) { //当前页面没显示toast// getContext().eventHub.off(MyPromptActionUtil.myDialogPromptActionUtil?.dialogID)// MyPromptActionUtil.myDialogPromptActionUtil?.closeCustomDialog() //如果之前有的toast对话框,并且正在显示,则先关闭toast提示window.getLastWindow(getContext()).then((windowClass) => {const uiContext = windowClass.getUIContext()MyPromptActionUtil.myDialogPromptActionUtil =new MyPromptActionUtil<MyToastInfo>(uiContext, wrapBuilder(myToastView), new MyToastInfo(message)).setModal(false)//true:存在黑色半透明蒙层,false:没有蒙层.setSwipeBackEnabled(false)//true:侧滑允许关闭弹窗.setMaskTapToCloseEnabled(true)//true:点击半透明蒙层可关闭弹窗【注:如果setModal(false),那么就没有蒙层,所以点击对话框外也没有响应事件,也就是这里设置了也没效果,并且事件会穿透】.setAlignment(DialogAlignment.Center).onWillAppear(() => {console.info('在对话框的打开动画开始之前调用的回调函数')getContext().eventHub.on(MyPromptActionUtil.myDialogPromptActionUtil?.dialogID, (data: string) => {//监听结果if (data == '关闭弹窗') {MyPromptActionUtil.myDialogPromptActionUtil?.closeCustomDialog()}})}).onWillDisappear(() => {console.info('在对话框的关闭动画开始之前调用的回调函数')getContext().eventHub.off(MyPromptActionUtil.myDialogPromptActionUtil?.dialogID)MyPromptActionUtil.myDialogPromptActionUtil = undefined}).showCustomDialog()})} else { //当前正在显示toastgetContext().eventHub.emit(MyPromptActionUtil.myDialogPromptActionUtil.dialogID, { msg: message })}}private uiContext: UIContext;private promptAction: PromptAction;private contentNode: ComponentContent<T> | undefined;private wrapBuilder: WrappedBuilder<[T]>;private t: T;private isModal: boolean = true;private alignment: DialogAlignment = DialogAlignment.Center;private isSwipeBackEnabled: boolean = true;private isMaskTapToCloseEnabled: boolean = true;public dialogID: stringconstructor(uiContext: UIContext, wrapBuilder: WrappedBuilder<[T]>, t: T) {this.uiContext = uiContext;this.promptAction = uiContext.getPromptAction();this.wrapBuilder = wrapBuilder;this.t = t;this.dialogID = t.dialogID}setSwipeBackEnabled(isSwipeBackEnabled: boolean) {this.isSwipeBackEnabled = isSwipeBackEnabled;return this;}setMaskTapToCloseEnabled(isMaskTapToCloseEnabled: boolean) {this.isMaskTapToCloseEnabled = isMaskTapToCloseEnabledreturn this;}setAlignment(alignment: DialogAlignment) {this.alignment = alignment;return this;}setModal(isModal: boolean) {this.isModal = isModal;return this;}onDidAppear(callback: () => void) {this.onDidAppearCallback = callback;return this;}onDidDisappear(callback: () => void) {this.onDidDisappearCallback = callback;return this;}onWillAppear(callback: () => void) {this.onWillAppearCallback = callback;return this;}onWillDisappear(callback: () => void) {this.onWillDisappearCallback = callback;return this;}private onDidAppearCallback?: () => void;private onDidDisappearCallback?: () => void;private onWillAppearCallback?: () => void;private onWillDisappearCallback?: () => void;closeCustomDialog() {if (this.contentNode) {this.promptAction.closeCustomDialog(this.contentNode);}return this;}// 显示自定义弹窗showCustomDialog() {try {if (!this.contentNode) {this.contentNode = new ComponentContent(this.uiContext, this.wrapBuilder, this.t);}this.promptAction.openCustomDialog(this.contentNode, {// 打开自定义弹窗alignment: this.alignment,isModal: this.isModal,showInSubWindow: false,maskRect: {x: 0,y: 0,width: '100%',height: '100%'},onWillDismiss: (dismissDialogAction: DismissDialogAction) => { //弹窗响应console.info("reason" + JSON.stringify(dismissDialogAction.reason))console.log("dialog onWillDismiss")if (dismissDialogAction.reason == 0 && this.isSwipeBackEnabled) { //手势返回时,关闭弹窗。this.promptAction.closeCustomDialog(this.contentNode)}if (dismissDialogAction.reason == 1 && this.isMaskTapToCloseEnabled) {this.promptAction.closeCustomDialog(this.contentNode)}},onDidAppear: this.onDidAppearCallback ? this.onDidAppearCallback : () => {},onDidDisappear: this.onDidDisappearCallback ? this.onDidDisappearCallback : () => {},onWillAppear: this.onWillAppearCallback ? this.onWillAppearCallback : () => {},onWillDisappear: this.onWillDisappearCallback ? this.onWillDisappearCallback : () => {},});} catch (error) { // 错误处理let message = (error as BusinessError).message;let code = (error as BusinessError).code;console.error(`OpenCustomDialog args error code is ${code}, message is ${message}`);}return this;}
}class MyToastInfo extends MyPromptInfo {public message: string = ""constructor(message: string) {super()this.message = message}
}@Builder
function myToastView(data: MyToastInfo) {MyToastView({ dialogID: data.dialogID, message: data.message })
}@ObservedV2
class ToastBean {message: string = ""@Trace isShow: boolean = trueconstructor(message: string) {this.message = message}
}@Component
struct MyToastView {@State toast_info_list: ToastBean[] = []@Prop dialogID: string@Prop message: stringaboutToAppear(): void {this.toast_info_list.push(new ToastBean(this.message))getContext().eventHub.on(this.dialogID, (data: object) => {if (data['msg']) {this.toast_info_list.push(new ToastBean(data['msg']))}})}build() {Column() {ForEach(this.toast_info_list, (item: ToastBean) => {Text(item.message).fontSize('36lpx').fontColor(Color.White).backgroundColor("#B2ff0000").borderRadius(8).constraintSize({ maxWidth: '80%' }).padding({bottom: '28lpx',left: '60lpx',right: '60lpx',top: '28lpx'}).margin(5).visibility(item.isShow ? Visibility.Visible : Visibility.None).onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {console.info('Test Text isVisible: ' + isVisible + ', currentRatio:' + currentRatio)if (isVisible && currentRatio >= 1.0) {setTimeout(() => {item.isShow = false}, 2000)}}).animation({duration: 200, onFinish: () => {console.info('==== onFinish')//动画结束后,判断数组是否已全部为隐藏状态,是的话证明所有toast内容都展示完成,可以释放全局弹窗了let isAnimAll = truefor (let i = 0; i < this.toast_info_list.length; i++) {if (this.toast_info_list[i].isShow == true) { //至少有一个正在显示isAnimAll = falsebreak;}}if (isAnimAll) {console.info('已展示完全部toast,为了性能,关闭弹窗释放view')getContext(this).eventHub.emit(this.dialogID, "关闭弹窗")}}}).transition(TransitionEffect.OPACITY.animation({ duration: 200 }))})}}
}

src/main/ets/pages/Page01.ets

import { MyPromptActionUtil } from '../common/MyPromptActionUtil'@Entry
@Component
struct Page01 {build() {Column() {Button('显示Toast').onClick(() => {MyPromptActionUtil.showToast(`随机数:${this.getRandomInt(1, 100)}`)})}.width('100%').height('100%')}getRandomInt(min: number, max: number): number {min = Math.ceil(min);max = Math.floor(max);return Math.floor(Math.random() * (max - min + 1)) + min;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/433018.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程&#xff0c;从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的&#xff0c;例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

OceanBase技术解析: 执行器中的自适应技术

在《OceanBase 数据库源码解析》这本书中&#xff0c;对于执行器的探讨还不够深入&#xff0c;它更多地聚焦于执行器的并行处理机制。因此&#xff0c;通过本文与大家分享OceanBase执行器中几种典型的自适应技术&#xff0c;作为对书中执行器部分的一个补充。 提升数据库分析性…

【开源免费】基于SpringBoot+Vue.JS技术交流分享平台(JAVA毕业设计)

博主说明&#xff1a;本文项目编号 T 053 &#xff0c;文末自助获取源码 \color{red}{T053&#xff0c;文末自助获取源码} T053&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI DSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI&#xff08;Display Serial Interface&#x…

Apache Iceberg 概述

Apache Iceberg概述 一、what is Apache Iceberg&#xff1f; 为了解决数据存储和计算引擎之间的适配的问题&#xff0c;Netflix开发了Iceberg&#xff0c;2018年11月16日进入Apache孵化器&#xff0c;2020 年5月19日从孵化器毕业&#xff0c;成为Apache的顶级项目。 Apache…

java通过webhook给飞书发送群消息

现在使用飞书的人越来越多了&#xff0c;飞书有一个最大的好处&#xff0c;可以使用webhook简便的发送群消息。而在工作中&#xff0c;也经常会因为一些运维方面的工作&#xff0c;需要给飞书发送群消息&#xff0c;来实时提醒相关负责人,及时处理工作。 一、先看一下效果吧&a…

OpenCV图像文件读写(5)从文件系统中读取图像的标准函数imread()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从文件加载图像。 imread 函数从指定的文件加载图像并返回它。如果图像无法读取&#xff08;因为文件缺失、权限不当、格式不受支持或无效&…

精简解析:二叉树的遍历方法及其应用场景

目录标题 二叉树的遍历方法及其应用场景摘要 1. 前序遍历 (Preorder Traversal)1.1 定义1.2 代码实现1.3 应用场景 2. 中序遍历 (Inorder Traversal)2.1 定义2.2 代码实现2.3 应用场景 3. 后序遍历 (Postorder Traversal)3.1 定义3.2 代码实现3.3 应用场景 4. 层次遍历 (Level …

Linux 文件 IO 管理(第三讲:文件系统)

Linux 文件 IO 管理&#xff08;第三讲&#xff1a;文件系统&#xff09; 进程为什么默认要打开文件描述符为 0&#xff0c;1 和 2 的文件呢&#xff1f;文件系统物理磁盘简单认识存储结构对磁盘存储进行逻辑抽象分组 —— 文件系统Block Bitmapinode Tableinode BitmapGDT(Gro…

C语言实现归并排序(Merge Sort)

目录 一、递归实现归并排序 1. 归并排序的基本步骤 2.动图演示 3.基本思路 4.代码 二、非递归实现 1.部分代码 2.代码分析 修正后代码&#xff1a; 归并过程打印 性能分析 复杂度分析 归并排序是一种高效的排序算法&#xff0c;采用分治法&#xff08;Divide and Con…

【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)

后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09; 后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09; 后台管理快速开发框架使用笔记&#xff08;微服务版之本地开发环境篇&#xff09;前言一、如何获取项目&#…

计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

目录 1.课题背景 2.课题意义 ‌ 3.技术介绍 4.技术性需求 4.1后端服务‌&#xff1a; 4.2 前端展示‌ 5.数据库设计‌&#xff1a; 6.系统性能‌&#xff1a; 7.安全性‌&#xff1a; 8. 功能介绍&#xff1a; 9. 部分代码 1.课题背景 近年来&#xff0c;随着宠物饲养数量…

2024年9月25日--- Spring-IOC 1

一 Spring的概要 1.1 简介 Spring&#xff0c;春天的意思&#xff0c;意指给软件行业带来春天。2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发…

《深度学习》—— ResNet 残差神经网络

文章目录 一、什么是ResNet&#xff1f;二、残差结构&#xff08;Residual Structure&#xff09;三、Batch Normalization&#xff08;BN----批归一化&#xff09; 一、什么是ResNet&#xff1f; ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获…

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言&#xff1a;本节内容是信号&#xff0c; 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识&#xff08;没有学过的友友可以查看我的前一篇文章&#xff09;。 以及我们还没有学习信号的第三个阶段——信…

89个H5小游戏源码

下载地址&#xff1a;https://download.csdn.net/download/w2sft/89791650 亲测可用&#xff0c;代码完整&#xff0c;都是htmljs&#xff0c;保存到本地即可。 游戏截图&#xff1a;

Universal Link配置不再困扰,Xinstall来帮忙

在移动互联网时代&#xff0c;App的推广和运营至关重要。而Universal Link作为一种能够实现网页与App间无缝跳转的技术&#xff0c;对于提升用户体验、引流至App具有显著效果。今天&#xff0c;我们就来科普一下Universal Link的配置方法&#xff0c;并介绍如何通过Xinstall这款…

TypeScript 设计模式之【备忘录模式】

文章目录 备忘录模式&#xff1a;时光机器的魔法备忘录模式的奥秘备忘录模式有什么利与弊?如何使用备忘录模式来优化你的系统代码实现案例备忘录模式的主要优点备忘录模式的主要缺点备忘录模式的适用场景总结 备忘录模式&#xff1a;时光机器的魔法 想象一下&#xff0c;如果…

25 基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过DS18B20检测温度&#xff0c;滑动变阻器连接数模转换器模拟电流、电压&#xff0c;通过LCD1602显示&#xff0c;程序里设置温度阈值为40&#xff0c;电流阈值为60&am…

万博智云CEO王嘉在华为全联接大会:以创新云应用场景,把握增长机遇

一、大会背景 2024年9月19-21日&#xff0c;第九届华为全联接大会将在上海世博展览馆和上海世博中心举办。作为华为的旗舰盛会&#xff0c;本次大会以“共赢行业智能化”为主题邀请了众多思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁&#xff0c;从战略、产业、…