【鸿蒙软件开发】自定义弹窗(CustomDialog)

简介: 【鸿蒙软件开发】自定义弹窗(CustomDialog)

前言


自定义弹窗(CustomDialog)可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。


一、创建自己第一个自定义弹窗


1.1 创建自定义弹窗

使用@CustomDialog装饰器装饰自定义弹窗。

@CustomDialog装饰器用于装饰自定义弹框,此装饰器内进行自定义内容(也就是弹框内容)。

@CustomDialog
struct CustomDialogExample {
  controller: CustomDialogController
  build() {
    Column() {
      Text('我是内容')
      .fontSize(20)
      .margin({ top: 10, bottom: 10 })
    }
  }
}


45fd8291768e4d94ae1294229306c553.png

881137e8a7ac46f4902506dcf3573b54.png

需要注意的是:我们需要把这个自定义弹窗的代码放到我们需要使用的页面里面,就像这样:

我们自定义弹窗中有两个需要我们写的:

controller:控制我们的自定义弹窗的

build函数:和我们主界面是一模一样的,没有区别,直接和主页面一样写代码即可。


1.2 创建构造器,与装饰器呼应相连

在创建好自定义弹窗之后,我们肯定要弄出他的对象来吧,他的类型是CustomDialogController

dialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogExample({}),
})


9b226564bd74412485cbe4e491b74304.png

builder: CustomDialogExample({})为指定哪个自定义窗口

CustomDialogExample的参数为自定义窗口的参数


CustomDialogController参数详解

接口函数原型:

CustomDialogController(value:{builder: CustomDialog, cancel?: () => void, autoCancel?: boolean, alignment?: DialogAlignment, offset?: Offset, customStyle?: boolean, gridCount?: number})


05bb33f9b9194fb89c8b4aeb466c79fa.png

参数如下:


下面参数分别是参数名,参数类型,是否必填,参数作用

1、builder,CustomDialog,是,自定义弹窗内容构造器。

2、cancel,() => void,否,点击遮障层退出时的回调。

3、autoCancel,boolean,否,是否允许点击遮障层退出。默认值:true

4、alignment,DialogAlignment,否,弹窗在竖直方向上的对齐方式。默认值:DialogAlignment.Default

5、offset,Offset,否,弹窗相对alignment所在位置的偏移量。

6、customStyle,boolean,否,弹窗容器样式是否自定义。默认值:false,弹窗容器的宽度根据栅格系统自适应,不跟随子节点;高度自适应子节点,最大为窗口高度的90%;圆角为24vp。

7、gridCount,number,否,弹窗宽度占栅格宽度的个数。默认为按照窗口大小自适应,异常值按默认值处理,最大栅格数为系统最大栅格数。


函数介绍

open()

函数原型如下:

open(): void


close()

函数原型如下

close(): void


关闭显示的自定义弹窗,若已关闭,则不生效。

显示自定义弹窗内容,允许多次使用,但如果弹框为SubWindow模式,则该弹框不允许再弹出SubWindow弹框。


1.3 点击与onClick事件绑定的组件使弹窗弹出

Button('click me')
  .onClick(() => {
    this.dialogController.open()
  })


49ff47b1dbc64013b8c857216cae3790.png

使用open()函数即可打开自定义窗口

如下图所示:

e996349b52f94ed686a47add2f3fa881.png


二、示例代码


// xxx.ets
@CustomDialog
struct CustomDialogExample {
  @Link textValue: string
  @Link inputValue: string
  controller: CustomDialogController
  // 若尝试在CustomDialog中传入多个其他的Controller,以实现在CustomDialog中打开另一个或另一些CustomDialog,那么此处需要将指向自己的controller放在最后
  cancel: () => void
  confirm: () => void
  build() {
    Column() {
      Text('Change text').fontSize(20).margin({ top: 10, bottom: 10 })
      TextInput({ placeholder: '', text: this.textValue }).height(60).width('90%')
        .onChange((value: string) => {
          this.textValue = value
        })
      Text('Whether to change a text?').fontSize(16).margin({ bottom: 10 })
      Flex({ justifyContent: FlexAlign.SpaceAround }) {
        Button('cancel')
          .onClick(() => {
            this.controller.close()
            this.cancel()
          }).backgroundColor(0xffffff).fontColor(Color.Black)
        Button('confirm')
          .onClick(() => {
            this.inputValue = this.textValue
            this.controller.close()
            this.confirm()
          }).backgroundColor(0xffffff).fontColor(Color.Red)
      }.margin({ bottom: 10 })
    }
    // dialog默认的borderRadius为24vp,如果需要使用border属性,请和borderRadius属性一起使用。
  }
}
@Entry
@Component
struct CustomDialogUser {
  @State textValue: string = ''
  @State inputValue: string = 'click me'
  dialogController: CustomDialogController = new CustomDialogController({
    builder: CustomDialogExample({
      cancel: this.onCancel,
      confirm: this.onAccept,
      textValue: $textValue,
      inputValue: $inputValue
    }),
    cancel: this.existApp,
    autoCancel: true,
    alignment: DialogAlignment.Bottom,
    offset: { dx: 0, dy: -20 },
    gridCount: 4,
    customStyle: false
  })
  // 在自定义组件即将析构销毁时将dialogControlle删除和置空
  aboutToDisappear() {
    delete this.dialogController, // 删除dialogController
    this.dialogController = undefined // 将dialogController置空
  }
  onCancel() {
    console.info('Callback when the first button is clicked')
  }
  onAccept() {
    console.info('Callback when the second button is clicked')
  }
  existApp() {
    console.info('Click the callback in the blank area')
  }
  build() {
    Column() {
      Button(this.inputValue)
        .onClick(() => {
          if (this.dialogController != undefined) {
            this.dialogController.open()
          }
        }).backgroundColor(0x317aff)
    }.width('100%').margin({ top: 5 })
  }
}


d9c5fada91b6458590c968fa8d9339d1.png


总结


本文介绍了CustomDialog的基础使用,这包括了API9的所有内容,这非常简单,希望大家看完之后一定要写代码!!!

相关文章
|
6月前
|
API 索引 数据处理
【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
1868 0
【鸿蒙软件开发】ArkTS基础组件之Select(下拉菜单)、Slider(滑动条)
|
6月前
|
API 前端开发 Python
【鸿蒙软件开发】ArkTS基础组件之Rating(评分组件)、RichText(富文本显示)
【鸿蒙软件开发】ArkTS基础组件之Rating(评分组件)、RichText(富文本显示)
350 0
【鸿蒙软件开发】ArkTS基础组件之Rating(评分组件)、RichText(富文本显示)
|
2天前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
鸿蒙开发:自定义一个简单的标题栏
|
14天前
|
UED 开发者 容器
Flutter&鸿蒙next 的 Sliver 实现自定义滚动效果
Flutter 提供了强大的滚动组件,如 ListView 和 GridView,但当需要更复杂的滚动效果时,Sliver 组件是一个强大的工具。本文介绍了如何使用 Sliver 实现自定义滚动效果,包括 SliverAppBar、SliverList 等常用组件的使用方法,以及通过 CustomScrollView 组合多个 Sliver 组件实现复杂布局的示例。通过具体代码示例,展示了如何实现带有可伸缩 AppBar 和可滚动列表的页面。
78 1
|
16天前
|
前端开发 开发者
深入探索 Flutter 鸿蒙版的画笔使用与高级自定义动画
本文深入探讨了 Flutter 中的绘图功能,重点介绍了 CustomPainter 和 Canvas 的使用方法。通过示例代码,详细讲解了如何绘制自定义图形、设置 Paint 对象的属性以及实现高级自定义动画。内容涵盖基本绘图、动画基础、渐变动画和路径动画,帮助读者掌握 Flutter 绘图与动画的核心技巧。
65 1
|
16天前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
67 1
|
16天前
|
Dart 搜索推荐 API
Flutter & 鸿蒙next版本:自定义对话框与表单验证的动态反馈与错误处理
在现代移动应用开发中,用户体验至关重要。本文探讨了如何在 Flutter 与鸿蒙操作系统(HarmonyOS)中创建自定义对话框,并结合表单验证实现动态反馈与错误处理,提升用户体验。通过自定义对话框和表单验证,开发者可以提供更加丰富和友好的交互体验,同时利用鸿蒙next版本拓展应用的受众范围。
68 1
|
22天前
|
编译器 API 开发工具
揭秘鸿蒙软件开发:如何构建跨设备智能生态?一场颠覆传统,引领未来的技术革命等你来探索!
【10月更文挑战第20天】华为鸿蒙系统正逐步构建全新的智能生态,打破设备间界限,实现OS与硬件解绑及跨端共享。鸿蒙提供完整开发工具链,如DevEco Studio、方舟编译器等,降低开发难度,提高效率。通过示例代码展示,鸿蒙支持跨设备协同工作,适用于智能家居、智能出行等多领域,推动智能生态发展。
39 4
|
22天前
|
Java API 开发工具
揭秘鸿蒙软件开发:如何以一己之力,开启万物互联新纪元,重塑未来科技生态版图?
【10月更文挑战第20天】鸿蒙系统,华为推出的面向全场景的分布式操作系统,打破传统OS与硬件绑定,实现多端部署、生态共享。提供完整开发工具链,支持高效开发,开启万物互联新篇章。
34 3
|
6月前
|
容器 API
【鸿蒙软件开发】ArkTS容器组件之Badge
【鸿蒙软件开发】ArkTS容器组件之Badge
224 1
【鸿蒙软件开发】ArkTS容器组件之Badge

热门文章

最新文章