鸿蒙 自定义弹窗对CustomDialogController二次封装

news2025/3/3 18:34:23

前言:

鸿蒙官方提供了自定义customdialog,调用代码很臃肿,必须在当前页面创建customDialogController,否则无法正常弹窗dialog

解决方案:目前就定义了两种类型的dialog

具体代码如下:

1. 用于代理dialog的打开和关闭

export interface MyCustomDialogController {
  open: () => void
  close: () => void
}

2. 作为全局弹窗组件封装 内容完全由外部dialogContent定义

@CustomDialog
export default struct MyCustomDialog {
  controller: CustomDialogController
  @BuilderParam dialogContent: () => void

  build() {
    this.dialogContent()
  }
}

3.1. 具体实现,这里是ConfirmPop(对话框弹窗)

import MyCustomDialog from './core/MyCustomDialog';
import { MyCustomDialogController } from './core/MyCustomDialogController';
/**
 * @author: hwk
 * @description: 确认取消对话框弹窗
 * @date: 2024/3/7 10:33
 */
@Component
export default struct ConfirmPop {
  controller: MyCustomDialogController = null;
  alignment: DialogAlignment = DialogAlignment.Center; //弹窗位置
  offsetX: number = 0; //上下 偏移量 负数则往上
  offsetY: number = 0; //上下 偏移量 负数则往上
  autoCancel: boolean = false; //点击遮罩层是否关闭弹窗
  //api9不支持 maskColor: ResourceColor = "rgba(0,0,0,0.1)";
  customStyle: true;
  title: Resource;
  content: Resource;
  leftText: Resource = $r('app.string.quxiao');
  rightText: Resource = $r('app.string.queding');
  isHideRight: boolean = false; //是否隐藏右边按钮
  leftClick: () => void
  rightClick: () => void

  //下面两个是私有的
  @State leftDown: boolean = false; //左边按钮是否按下
  @State rightDown: boolean = false; //右边按钮是否按下


  build() {
  }

  @Builder buildContent() {
    Column() {
      Text(this.title)
        .fontSize(15)
        .fontColor($r('app.color.black3'))
        .maxLines(1)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
      Text(this.content)
        .fontSize(13)
        .fontColor($r('app.color.black6'))
        .maxLines(3)
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .margin({ top: 13, bottom: 30 })
      Row() {
        Text(this.leftText)
          .height('100%')
          .width(86)
          .textAlign(TextAlign.Center)
          .fontSize(13)
          .backgroundColor(this.leftDown ? $r('app.color.theme') : $r('app.color.white'))
          .fontColor(this.leftDown ? $r('app.color.white') : $r('app.color.theme'))
          .border({ width: 1, color: $r('app.color.theme'), radius: 5, style: BorderStyle.Solid })
          .onTouch((event: TouchEvent) => {
            this.leftDown = (event.type != TouchType.Up);
          })
          .onClick(() => {
            this.controller.close()
            if (this.leftClick)
              this.leftClick()
          })

        Blank()
          .visibility(this.isHideRight ? Visibility.None : Visibility.Visible)
          .width(20)
          .height('100%')

        Text(this.rightText)
          .visibility(this.isHideRight ? Visibility.None : Visibility.Visible)
          .height('100%')
          .width(86)
          .textAlign(TextAlign.Center)
          .fontSize(13)
          .backgroundColor(this.rightDown ? $r('app.color.theme') : $r('app.color.white'))
          .fontColor(this.rightDown ? $r('app.color.white') : $r('app.color.theme'))
          .border({ width: 1, color: $r('app.color.theme'), radius: 5, style: BorderStyle.Solid })
          .onTouch((event: TouchEvent) => {
            this.rightDown = (event.type != TouchType.Up);
          })
          .onClick(() => {
            this.controller.close()
            if (this.rightClick)
              this.rightClick()
          })
      }
      .width('100%')
      .height(34)
      .padding({ left: 12, right: 12 })
      .justifyContent(FlexAlign.Center)
    }
    .width(250)
    .backgroundColor($r('app.color.white'))
    .borderRadius(5)
    .padding({ left: 17, right: 17, top: 12, bottom: 22 })
  }

  aboutToAppear() {
    //修正,这里要在这里初始化,否则 this.clickMaskClose 不能响应外部变更
    let dialogController = new CustomDialogController({
      builder: MyCustomDialog({
        dialogContent: () => {
          this.buildContent();
        }
      }),
      alignment: this.alignment,
      offset: { dx: 0, dy: this.offsetY },
      // maskColor: this.maskColor,
      autoCancel: this.autoCancel,
      //完全依靠外部样式控制,否则会有宽度限制和默认圆角, 这里需要的就是要自己控制样式
      customStyle: true
    });
    if (this.controller) {
      this.controller.open = () => {
        dialogController.open();
      }
      this.controller.close = () => {
        dialogController.close();
      }
    }
  }
}

3.2. 具体实现,这里是LoadingPop(加载中弹窗)

import MyCustomDialog from './core/MyCustomDialog';
import { MyCustomDialogController } from './core/MyCustomDialogController';
/**
 * @author: hwk
 * @description: 加载动画loading
 * @date: 2024/3/7 14:12
 */
@Component
export default struct LoadingPop {
  controller: MyCustomDialogController = null;
  alignment: DialogAlignment = DialogAlignment.Center; //弹窗位置
  offsetX: number = 0; //上下 偏移量 负数则往上
  offsetY: number = 0; //上下 偏移量 负数则往上
  autoCancel: boolean = false; //点击遮罩层是否关闭弹窗
  //api9不支持 maskColor: ResourceColor = "rgba(0,0,0,0.1)";
  customStyle: true;
  @State angle: number = 0

  build() {
  }

  @Builder buildContent() {
    Column() {
      ImageAnimator()
      Image($r('app.media.loading'))
        .width(50)
        .margin({ top: 16 })
        .rotate({ angle: this.angle })
        .animation({
          duration: 1500,
          curve: Curve.Linear,
          iterations: -1, // 设置-1表示动画无限循环
          playMode: PlayMode.Normal
        })
      Text('加载中...')
        .margin({ top: 16 })
        .fontColor($r('app.color.white'))
        .fontSize(12)
    }
    .width(111)
    .height(111)
    .borderRadius(5)
    .backgroundColor($r('app.color.transparent50'))
  }

  aboutToAppear() {

    //修正,这里要在这里初始化,否则 this.clickMaskClose 不能响应外部变更
    let dialogController = new CustomDialogController({
      builder: MyCustomDialog({
        dialogContent: () => {
          this.buildContent();
        }
      }),
      alignment: this.alignment,
      offset: { dx: 0, dy: this.offsetY },
      autoCancel: this.autoCancel,
      //完全依靠外部样式控制,否则会有宽度限制和默认圆角, 这里需要的就是要自己控制样式
      customStyle: true
    });
    if (this.controller) {
      this.controller.open = () => {
        dialogController.open();

        this.timeoutId = setTimeout(() => {
          this.angle = 360;
        }, 10)
      }
      this.controller.close = () => {
        clearTimeout(this.timeoutId);
        dialogController.close();
      }
    }
  }

  timeoutId: number;
}

4. 调用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024内衣洗衣机测评推荐:希亦、小吉、鲸立综合对比哪个牌子好?

对于那些追求品质生活、分类洗涤的用户而言,小型洗衣机可以满足我们对不同类型衣物分开洗涤的需求,例如将内衣、袜子等小件衣物与外套等分开洗涤,以保持衣物的清洁和卫生。并且如果您家中有宝宝,或者您对个人卫生和健康有较高要求…

中国制造赢得世界 外贸独立站wordpress建站案例

孵化器wordpress外贸主题 孵化器、孵化设备wordpress企业主题,适合做孵化器 、孵化设备的企业使用。 https://www.jianzhanpress.com/?p3478 橡胶制品wordpress外贸主题 橡胶制品wordpress外贸主题,橡塑产品对外贸易公司官方网站wordpress模板。 ht…

论文解读:Channel Importance Matters in Few-Shot Image Classification

文章汇总 参考文章ICML2022|Channel Importance Matters in Few-Shot Image Classification - 知乎 一句话总结 Channel bias问题,使模型在迁移到下游小样本分类任务时泛化能力较差,本文在测试阶段仅用一行代码就减弱这个问题的影响。 Ch…

3.7作业

网络聊天室&#xff1a; 程序代码&#xff1a; ser.c #include <myhead.h> //定义消息类型结构体 struct xiaoxi {char type;char name[20];char text[100]; };int main(int argc, const char* argv[]) {// 创建套接字int sfd socket(AF_INET, SOCK_STREAM, 0);if (s…

flutter编译后的windows程序缺少msvcp140.dllvcruntime140.dllvcruntime140_1.dll解决办法

//就是很多博文中提到了三剑客 msvcp140.dll vcruntime140.dll vcruntime140_1.dll 1.没有vs环境的不要把生成的debug下的exe发给别人&#xff0c;会出现莫名其妙的问题。缺少各种DLL文件&#xff0c;我这边收集了上面三个的dll下载链接&#xff1a;flutterdll.rar - 蓝奏云 2…

【动态规划】【数论】【区间合并】3041. 修改数组后最大化数组中的连续元素数目

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 数论 区间合并 LeetCode3041. 修改数组后最大化数组中的连续元素数目 给你一个下标从 0 开始只包含 正 整数的数组 nums 。 一开始&#xff0c;你可以将数组中 任意数量 元素增加 至多 1 。 修改后&#xff0c;你可以从…

java网络编程 02 socket

01.socket定义 02.TCP编程 import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket;public class clientSocket {public static void main(String[] args) throws IOException {//创建客户端socket&#xff0c;…

Get了!原来朋友圈定时发布如此简单!

你是不是也有这样的烦恼&#xff1f;微信号太多&#xff0c;有时候会顾不上发朋友圈&#xff1f; 别担心&#xff01;微信管理系统来帮你解决这个问题&#xff0c;实现朋友圈定时发布&#xff01;让我们一起来看看如何利用微信管理系统的强大功能来提升我们的社交媒体效率吧。…

请说明Vue中的解耦能力

Vue中的解耦能力是指在Vue框架中&#xff0c;我们能够有效地将代码分离成独立的组件或模块&#xff0c;使得这些组件之间的依赖关系减少&#xff0c;实现高内聚、低耦合的设计目标。利用Vue中的组件化开发&#xff0c;可以让不同的模块之间更容易地通信和协作&#xff0c;提高代…

echarts中toolbox 中文乱码问题

问题描述 本地引用的echarts源文件&#xff0c;页面其他部分编码显示正常&#xff0c;唯独toolbox鼠标悬停在上面时提示信息显示乱码。 如图所示&#xff1a; 尝试过的方法 使用sublime text 3&#xff0c;notepad&#xff0c;记事本更改文件编码为utf-8引入时&#xff0c;在sc…

短剧小程序:掌中剧院,随时演绎精彩

在快节奏的现代生活中&#xff0c;人们越来越追求高效与便捷。为了满足广大用户对短剧内容的热爱和追求&#xff0c;我们推出了全新的短剧小程序&#xff0c;让精彩剧情触手可及&#xff0c;随时随地为您带来欢乐与感动。 一、轻松点播&#xff0c;随享短剧魅力 通过短剧小程…

软件系统开发安全指南-word

应用系统设计安全主要涵盖以下几点&#xff1a; 1、应用系统架构安全设计 2、应用系统软件功能安全设计 3、应用系统存储安全设计 4、应用系统通讯安全设计 5、应用系统数据库安全设计 应用系统测试安全包含&#xff1a; 1、测试前置要求 2、测试方法及测试内容 3、测试环境及人…

10大AI工具

ChatGPT ChatGPT是由OpenAI开发的人工智能聊天机器人程序&#xff0c;全称为Chat Generative Pre-trained Transformer。它基于GPT-3.5架构&#xff0c;能够生成回答并根据聊天上下文进行互动。ChatGPT具备强大的对话能力&#xff0c;能在同一会话中回答上下文相关的问题&…

安卓简单登录

注意 有的朋友不知道登录咋写&#xff0c;这里我就简单给出相应代码&#xff0c;用的本地存储&#xff0c;没用网络请求&#xff0c;有需要可以替换成想要的&#xff0c;废话不多上代码 登录 import androidx.appcompat.app.AppCompatActivity;import android.content.Context…

JavaWeb----MySQL

一&#xff1a;JavaWeb相关介绍 Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;www&#xff09;&#xff0c;能够通过浏览器访问的网站 JavaWeb&#xff1a;是用Java技术来解决相关Web互联网领域的技术栈 JavaWeb流程 1.网页&#xff1a;展现数据 2.数据…

postman只读模式的解决办法

我大概是多次复制参数&#xff08;或是别的操作&#xff09;&#xff0c;进入了postman的只读模式。这时无法修改页面的传参&#xff0c;而且右上角的save按钮是灰色&#xff08;不可选&#xff09; 下面分享我的2种解决办法 第一种方法 在任务栏右键选中接口&#xff0c;选…

RUST 每日一省:发布到crates.io

github是开源代码分享的地方&#xff0c;rust的开源项目除了github&#xff0c;我们还可以将其发布到 crates.io 上&#xff0c;然后其它用户就可以使用cargo进行安装使用了。其实步骤很简单&#xff0c;只有三条命令了&#xff0c;我们一次来看一下。 1、cargo package 首先&a…

使用Navicat连接阿里云服务器上的MySQL数据库

打开navicat&#xff0c;连接如下&#xff1a; 服务器的默认密码是 root 连接时出现 使用 ls 查找 /etc/my.cnf ls /etc/my.cnf 用vi打开my.cnf&#xff1a; vi /etc/my.cnf看看是否有绑定本地回环地址的配置&#xff0c;如果有&#xff0c;注释掉下面这段文字&#xff1a;…

GitHub Desktop的常用操作【图形化】

文章目录 【1】仓库的创建和删除【2】文件操作【3】分支原理与分支操作1.分支创建2.分支合并 【4】标签 【1】仓库的创建和删除 在本地创建一个新的仓库&#xff1a; 然后输入仓库的名称&#xff0c;描述&#xff0c;并选择路径&#xff1a; 点击完后就发现我们的仓库创建好…

Anaconda的使用及spyder相关设置

Anaconda Anaconda是一个Python发行版&#xff0c;主要用于数据科学和机器学习领域。Anaconda集成了许多常用的数据科学工具和库&#xff0c;如NumPy、Pandas、Scikit-learn等&#xff0c;同时还包含了一个强大的包管理器conda和一个集成开发环境Spyder。Anaconda的目标是提供一…