HarmonyOs透明弹窗(选择照片弹窗样式)

news2024/9/20 5:37:07

1.鸿蒙中需要实现一个如下图的弹窗

2.由上图中可以得出,只需要三个Text组件依次向下排列,弹窗背景设置透明即可,弹窗代码如下(仅展示弹窗样式):


/***
 * 自定义选择图片弹窗
 *
 * 外部定义需要导出
 */
@CustomDialog //自定义弹窗
export struct SelectImageDialog{
  viewWidth: string = '96%' // 视图宽度 便于统一调整
  viewRadius: number = 10 // 视图中可见的圆角 便于统一调整
  centerPadding: number = 10 // 按钮的上下内边距 便于统一调整按钮高度
  controller: CustomDialogController // 自定义弹窗控制器
  build() {
    Column(){
      // 拍照按钮
      Text('拍照')
        .width(this.viewWidth)
        .backgroundColor('#EFEFF1')
        .fontColor('#578CDA')
        .textAlign(TextAlign.Center)
        .padding({
          top: this.centerPadding,
          bottom: this.centerPadding
        })
        .margin({
          left: 10,
          right: 10
        })
        .borderRadius({
          topLeft: this.viewRadius,
          topRight: this.viewRadius
        })
        .onClick(()=>{
          // 跳转拍照逻辑

        })

      // 分割线
      Line()
        .width(this.viewWidth)
        .backgroundColor('#BFBFC0')
        .height(0.5)

      // 相册按钮
      Text('相册')
        .width(this.viewWidth)
        .backgroundColor('#EFEFF1')
        .fontColor('#578CDA')
        .textAlign(TextAlign.Center)
        .padding({
          top: this.centerPadding,
          bottom: this.centerPadding
        })
        .borderRadius({
          bottomLeft: this.viewRadius,
          bottomRight: this.viewRadius
        })
        .onClick(()=>{
          // 跳转到相册逻辑

        })

      // 取消按钮
      Text('取消')
        .width(this.viewWidth)
        .backgroundColor('#FFF')
        .fontColor('#3677F4')
        .textAlign(TextAlign.Center)
        .border({
          radius: this.viewRadius
        })
        .padding({
          top: this.centerPadding,
          bottom: this.centerPadding
        })
        .margin({
          top: 10
        })
        .onClick(()=>{
          // 通过弹窗控制器关闭弹窗
          this.controller.close()
        })
    }
  }
}

3.自定义弹窗的使用,代码如下(仅展示弹窗样式):

import router from '@ohos.router'
import CommonConstants from '../../constants/CommonConstants'
import { SelectImageDialog } from './dialog/SelectImageDialog'

/**
 * 显示用户信息页面
 * 
 */
@Entry
@Component
struct UserInfoPages {

  @State userName: string = "用户昵称"
  @State userHead: string = "https://img1.baidu.com/it/u=1437670132,3069407764&fm=253&fmt=auto&app=138&f=JPEG?w=516&h=500"
  // 弹窗控制器
  dialogController: CustomDialogController = new CustomDialogController({
    builder: SelectImageDialog({}), //
    alignment: DialogAlignment.Bottom, // 弹窗底部弹出
    backgroundColor: Color.Transparent, // 弹窗的背景颜色设置为透明色
    borderColor: Color.Transparent, // 弹窗的边框颜色设置为透明色
    cornerRadius: 0, // 弹窗的圆角半径
    customStyle: true, // 是否使用自定义样式?(很重要,未设置会有默认的背景色)
    width: '100%', // 弹窗宽度
    offset: { // 偏移量
      dx: 0,
      dy: -24 // 太靠近底部会有一部分遮挡
    }
  })

  build() {
    Column() {
      // 自定义标题视图
      TitleView({
        title: '个人信息',
        quitIcon: 'app.media.icon_exit_black'
      })
      // 自定义用户信息视图
      UserInfoView({
        name: '头像',
        rightIcon: this.userHead,
      })
        .onClick(()=>{
          this.dialogController.open()
        })
      // 自定义用户信息视图
      UserInfoView({
        name: '昵称',
        rightText: this.userName,
        centerPadding: 15
      })
      .onClick(() => {
        // 跳转到修改用户昵称的页面
        router.pushUrl({ url: CommonConstants.USER_EDIT_PAGES })
      })
    }
  }

}

/**
 * 标题栏
 */
@Component
struct TitleView{

  @Prop title: string// 标题栏标题
  @Prop line: boolean = true// 标题栏是否显示分割线?默认显示
  @Prop quitIcon: string// 退出图标 默认不显示
  @Prop optionIcon: string// 选项图标 默认不显示
  // 选项按钮回调
  clickOption: (() => void) | null = null
  // 退出按钮回调
  clickQuit: (() => void) | null = ()=>{
    router.back()
  }

  build(){
    Column(){
      RelativeContainer(){
        //标题
        Text(this.title)
          .width('100%')
          .textAlign(TextAlign.Center)
          .maxLines(1)
          .id("title")
          .ellipsisMode(EllipsisMode.END)
          .margin({
            bottom: 8
          })
          .alignRules({
            bottom: {
              anchor: '__container__',
              align: VerticalAlign.Bottom
            },
            left: {
              anchor: '__container__',
              align: HorizontalAlign.Start
            },

            right: {
              anchor: '__container__',
              align: HorizontalAlign.End
            }
          })

        //退出按钮
        if (this.quitIcon){
          Image($r(this.quitIcon))
            .width(9)
            .objectFit(ImageFit.Contain)
            .id("quitIcon")
            .margin({
              left: 16,
              bottom: 12
            })
            .onClick(this.clickQuit)
            .alignRules({
              bottom: {
                anchor: '__container__',
                align: VerticalAlign.Bottom
              },
              left: {
                anchor: '__container__',
                align: HorizontalAlign.Start
              }
            })
        }

        //选项
        if (this.optionIcon){
          Image($r(this.optionIcon))
            .width(24)
            .height(24)
            .objectFit(ImageFit.Contain)
            .margin({
              right: 16,
              bottom: 8
            })
            .id("optionIcon")
            .onClick(this.clickOption)
            .alignRules({
              bottom: {
                anchor: '__container__',
                align: VerticalAlign.Bottom
              },
              right: {
                anchor: '__container__',
                align: HorizontalAlign.End
              }
            })
        }
      }
      .width('100%')
      .height(63)
      .padding({
        top: 19
      })

      //分割线
      if (this.line){
        Line()
          .height(1)
          .width("100%")
          .backgroundColor('#E8E8E8')
      }
    }
    .height(63)
    .width('100%')

  }

}

/***
 * 用户信息自定义视图
 */
@Component
struct UserInfoView{
  @Prop name: string // 功能名称
  @Prop rightIcon: string // 右边的图标
  @Prop rightText: string // 右边的文字
  @Prop centerPadding: number = 10 // 上下间距

  build() {
    Column(){
      Row() {
        Text(this.name)
          .margin({
            left: 15
          })
        // 通过 空白填充组件 将 后面的组件全部挤到最右边
        Blank()
        // 右边的图标
        if (this.rightIcon){
          Image(this.rightIcon)
            .alt($r('app.media.icon_loading_error'))
            .width(64)
            .height(64)
            .borderRadius(64)
            .margin({
              right: 5
            })
        }
        // 右边的文字
        if (this.rightText){
          Text(this.rightText)
            .fontColor('#999999')
            .margin({
              right: 5
            })
        }
        // 箭头图标
        Image($r('app.media.icon_to_right'))
          .margin({
            right: 15
          })
          .width(17)
          .height(17)
      }
      .padding({
        top: this.centerPadding,
        bottom: this.centerPadding
      })
      .width('100%')
      Line()
        .height(1)
        .width("90%")
        .backgroundColor('#E8E8E8')
    }
  }
}

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

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

相关文章

Linux驱动学习之点灯(一)

学习不同的板子我们都是从点灯开始,linux驱动也不例外 驱动开发基础知识 何为驱动? 驱使硬件正常工作的代码就叫做驱动。 在一些mcu里: 无非就是直接操作寄存器,或者用库函数初始化外设,使外设正常工作如初始化iic&…

leetcode13. 罗马数字转整数,流程图带你遍历所有情况

leetcode13. 罗马数字转整数 示例 1: 输入: s “III” 输出: 3 示例 2: 输入: s “IV” 输出: 4 示例 3: 输入: s “IX” 输出: 9 示例 4: 输入: s “LVIII” 输出: 58 解释: L 50, V 5, III 3. 示例 5: 输入: s “MCMXCIV” 输出: 1994 解释: M 1000, CM 900, XC…

一个贼好用的开源导航网站项目——pintree!【送源码】

这两天发现了一个项目,它可以快速的将收藏夹里的网址导出,然后快速生成一个在线的网站。这个项目就是 pintree。 项目简介 Pintree 是一个开源项目,旨在将浏览器书签转换为导航网站。只需几个简单的步骤,就可以将书签转变为美观…

【CAN-IDPS】汽车网关信息安全要求以及实验方法

《汽车网关信息安全技术要求及试验方法》是中国的一项国家标准,编号为GB/T 40857-2021,于2021年10月11日发布,并从2022年5月1日起开始实施 。这项标准由全国汽车标准化技术委员会(TC114)归口,智能网联汽车分会(TC114SC34)执行,主管部门为工业和信息化部。 该标准主要…

集团数字化转型方案(二)

集团数字化转型方案通过整合物联网(IoT)、大数据分析、人工智能(AI)和云计算技术,构建了一个全面智能化的业务平台,从而实现了全集团范围内的业务流程自动化、数据驱动决策优化、以及客户体验的个性化提升。…

windows11 安装 Rancher Desktop

从官网下载了最新版的 Rancher.Desktop.Setup.1.8.1.msi 安装包,安装很顺利。 但是安装完,启动时报错 The k3s cache is empty and there is no network connection. 不明所以,网上查了,原来是github访问不了的原因,具…

这些星座比你想象的还努力

TOP 3. 金牛座   金牛座对于操劳操心的忍受度本来就比较高,对于金牛座来说这些都是踏实的象征,金牛座比较不相信不劳而获这件事情,多少血汗多少付出,得到多少收获,这让金牛座比较踏实,不会觉得很不安&…

CE游戏教程第三关解密

游戏规则:雪人可以左右移动,跳跃,跳跃到红线上,红线变绿,所有红线变率时,门开启,雪人通过门后,游戏胜利。如果游戏中触碰到NPC,游戏失败! 经过研究&#xff…

DHCP的原理与配置

目录 DHCP的原理 DHCP是什么 DHCP的好处 DHCP的分配方式 DHCP的工作原理 DHCP的配置 环境设置 DHCP配置 验证配置是否成功 DHCP的原理 DHCP是什么 DHCP:Dynamic Host Configuration Protocol,动态主机配置协议。由Internet工作小组开发,专门用…

自然语言处理NLP四范式

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhlNLP四范式概述 自然语言处理(NLP)的四范式是NLP领域发展历程中的重要里程碑,它们代表了NLP技术从传统方法到现代深度学习技术的转变。第一范式是非神经网络时代的完全监督学习,它依赖于人工设…

Python基础知识学习总结(五)

一. 字典 字典是另一种可变容器模型,且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割,每个对之间用逗号( , )分割,整个字典包括在花括号 {} 中 。 dict 作为 Python 的关键字和内置函数,变量名不建议命名…

CompletableFuture-应用

可以看到CompletableFuture实现了CompletionStage 和Future的两个接口。CompletionStage提供了任务之间的衔接能力,而Future则是经常用于阻塞获取结果。 CompletableFuture 的内部使用了基于 ForkJoinPool 的线程池,这种线程池可以高效地调度和执行任务…

数据结构与算法--交换排序与归并排序

文章目录 回顾提要冒泡排序冒泡排序的过程冒泡排序的实现冒泡排序算法评价 快速排序快速排序的划分方法快速排序的过程快速排序的实现快速排序算法性能分析快速排序的改进 归并排序二路归并排序合并两个有序表归并排序示例归并排序算法性能分析 各种内排序方法的比较各种内排序…

SOCKS5代理UDP转发:探秘网络世界的隐形传送带

在这个信息爆炸的时代,网络已经成为我们生活中不可或缺的一部分。然而,网络世界中也充满了各种问题和挑战,比如隐私保护、数据传输的安全性等。今天,我们就来聊聊一种神奇的网络工具——SOCKS5代理,特别是它在UDP转发中…

在撰写跨学科论文时,如何平衡不同研究领域的篇幅和深度?

在学术界,跨学科研究因其能够综合不同领域的知识和方法而受到重视。然而,如何在一篇论文中平衡不同学科的篇幅和深度,是一个常见的挑战。本文将探讨一些有效的策略,帮助你在撰写跨学科论文时,既能展现每个领域的深度&a…

数字产业生态圈如何推动产业加速升级?

在数字化浪潮的推动下,数字产业生态圈逐渐成为产业升级的重要载体。它不仅汇聚了技术创新的源头活水,更通过以下几大途径,为产业注入强劲动力: 1、资源整合:数字产业生态圈将政府、企业、科研机构和高校等多方资源整合…

一个案例讲清5Why分析法,分分钟Get!

探究问题深处的“ 5 why究竟法”,这可不是普通的连连问,而是由丰田创始人丰田佐吉精心锻造的问题挖掘秘籍。简而言之,就是当你遇到一个谜题,连环出击五个“为啥呢?”,一步步揭秘真相的核心。想象一下&#…

C++策略模式Strategy

组件协作– —策略模式strategy (运行时可以切换, 运行时多态调用, 不同于if else,(bad smell、还占用缓存) 只要有if else就应该要想strategy重构 但是如果if else绝对不变的情况,也可以用 原本…

Opencv学习-直方图比较

由于图像的直方图表示图像像素灰度值的统计特性,因此可以通过两幅图像的直方图特性比较 两幅图像的相似程度。从一定程度上来讲,虽然两幅图像的直方图分布相似不代表两幅图像相似,但是两幅图像相似则两幅图像的直方图分布一定相似。例如&…

Openlayer - vue中加载天地图(入门篇)

在vue中安装openlayers npm i --save ol这里说的vue是基于脚手架构建的。 新建个页面&#xff0c;也就是vue文件&#xff0c;配置好路由。接着 就是可以直接放入我的代码运行显示了。 vue利用openlayers加载天地图和高德地图 <template><div class"wrapper&quo…