鸿蒙loading

264 阅读2分钟
// 定义一个名为 LoadingDialog 的自定义组件,用于显示加载对话框
@Component
struct LoadingDialog {
  // 定义一个名为 title 的 Prop 属性,用于传递显示在对话框中的标题文字
  @Prop title: string

  // 组件构建方法,负责生成 LoadingDialog 的 UI 结构
  build() {
    // 使用 Stack 布局容器包裹内部元素,便于堆叠和定位
    Stack() {
      // 使用 Column 布局容器垂直排列内部元素
      Column() {
        // 添加一个 LoadingProgress 组件,作为加载动画,设置颜色、宽高
        LoadingProgress()
          .color(Color.White).width(100).height(100)

        // 添加一个 Text 组件,显示标题文字,设置字体大小、颜色、顶部外边距
        // 根据传入的 title 属性值决定其可见性
        Text(this.title)
          .fontSize(18).fontColor(0xffffff).margin({ top: 8 })
          .visibility(this.title ? Visibility.Visible : Visibility.None)
      }
    }
    // 设置 LoadingDialog 组件的整体宽度和高度
    .width(180)
    .height(180)

    // 设置对话框的背景色为半透明深灰色
    .backgroundColor(0x88000000)

    // 设置对话框的圆角边框,增强视觉效果
    .borderRadius(10)

    // 添加阴影效果,增加立体感
    .shadow({
      radius: 10,
      color: Color.Gray,
      offsetX: 3, // 水平偏移量
      offsetY: 3 // 垂直偏移量
    })
  }
}

// 主要应用程序入口,定义一个名为 demo 的自定义组件
@Entry
@Component
struct demo {
  // 定义一个名为 title 的 State 变量,用于存储加载对话框的标题文字
  @State title: string = '加载中...'

  // 定义一个名为 isShowLoading 的 State 变量,用于控制 LoadingDialog 是否显示
  @State isShowLoading: boolean = false

  // 组件构建方法,负责生成 demo 应用的 UI 结构
  build() {
    // 使用 Stack 布局容器包裹内部元素,便于堆叠和定位
    Stack() {
      // 使用 Column 布局容器垂直排列主要操作按钮
      Column() {
        // 添加一个按钮,点击后显示带有默认标题的 LoadingDialog
        Button('点击显示loading,带文字')
          .onClick(() => {
            this.isShowLoading = true
            this.title = '加载中...'
          })

        // 添加一个按钮,点击后显示无标题的 LoadingDialog
        Button('点击显示loading,不带文字')
          .onClick(() => {
            this.isShowLoading = true
            this.title = ''
          })

        // 添加一个按钮,点击后隐藏 LoadingDialog
        Button('点击隐藏loading')
          .onClick(() => {
            this.isShowLoading = false
          })
      }
      // 设置 Column 的宽度和高度为 100%,填满父容器
      .width('100%').height('100%')

      // 添加一个重复的“点击隐藏loading”按钮,测试事件是否会穿透
      Button('点击隐藏loading')
        .onClick(() => {
          this.isShowLoading = false
        })

      // 实例化 LoadingDialog 组件,传递当前的 title 状态作为标题文字
      // 根据 isShowLoading 状态控制其可见性
      LoadingDialog({ title: this.title })
        .visibility(this.isShowLoading ? Visibility.Visible : Visibility.None).backgroundColor(Color.Red)
    }
    // 设置 Stack 的宽度和高度为 100%,填满屏幕
    .width('100%').height('100%')
  }
}