Bottom Sheet 操作菜单:@Builder + 遮罩 + 动画实现

发布时间:2026/7/19 1:13:51

Bottom Sheet 操作菜单:@Builder + 遮罩 + 动画实现
前言Bottom Sheet底部操作菜单是移动应用中常见的交互模式用于显示一组操作选项。“海风日记“的日记详情页通过 Bottom Sheet 提供了编辑、分享、设为私密、复制文本和删除等操作。本文将从DiaryDetailPage.ets源码出发深入讲解 Bottom Sheet 的实现包括遮罩层、操作列表、取消按钮和动画效果。一、Bottom Sheet 的完整实现1.1 状态控制Entry Component struct DiaryDetailPage { State showActionSheet: boolean false // 控制显示/隐藏 }1.2 遮罩层Builder actionSheetOverlay() { Stack() { // 遮罩层 Column() .width(100%).height(100%) .backgroundColor(rgba(0,0,0,0.45)) // 半透明黑色 .onClick(() { this.showActionSheet false }) // Bottom Sheet 内容 Column({ space: 8 }) { // 操作列表 Column() { this.actionItem(✏️, #FFF3E0, 编辑日记, false, () { this.showActionSheet false router.pushUrl({ url: pages/diary/EditDiaryPage }) }) Divider().color(#F5F5F5).margin({ left: 54 }) this.actionItem(, #E8F4FF, 分享日记, false, () { this.showActionSheet false }) Divider().color(#F5F5F5).margin({ left: 54 }) this.actionItem(, #F0F0F5, 设为私密, false, () { this.showActionSheet false }) Divider().color(#F5F5F5).margin({ left: 54 }) this.actionItem(, #F5FFF0, 复制文本, false, () { this.showActionSheet false }) this.actionItem(️, #FFF0F0, 删除日记, true, () { this.showActionSheet false router.back() }) } .backgroundColor(#FFFFFF).borderRadius(14) // 取消按钮 Text(取消) .width(100%).fontSize(17).fontColor(COLOR_PRIMARY) .fontWeight(FontWeight.Bold).textAlign(TextAlign.Center) .padding(16).backgroundColor(#FFFFFF).borderRadius(14) .onClick(() { this.showActionSheet false }) } .width(100%).padding({ left: 12, right: 12, bottom: 34 }) } .width(100%).height(100%) }二、操作项构建器Builder actionItem(icon: string, iconBg: string, label: string, isDanger: boolean, onTap: () void) { Row({ space: 14 }) { Text(icon).fontSize(18) .width(36).height(36).textAlign(TextAlign.Center) .backgroundColor(iconBg).borderRadius(9) Text(label) .fontSize(16) .fontColor(isDanger ? #FF3B30 : #222222) .layoutWeight(1) SymbolGlyph($r(sys.symbol.chevron_right)) .fontSize(14).fontColor([#CCCCCC]) } .width(100%).padding({ left: 18, right: 18, top: 16, bottom: 16 }) .onClick(() onTap()) }三、交互逻辑3.1 三种关闭方式// 1. 点击遮罩关闭 Column() .onClick(() { this.showActionSheet false }) // 2. 操作项关闭 this.actionItem(✏️, #FFF3E0, 编辑日记, false, () { this.showActionSheet false // 执行操作 }) // 3. 取消按钮关闭 Text(取消) .onClick(() { this.showActionSheet false })3.2 条件渲染build() { Stack() { // 主内容 Column() { ... } // Bottom Sheet if (this.showActionSheet) { this.actionSheetOverlay() } } }四、常见问题4.1 Bottom Sheet 位置不对问题Bottom Sheet 没有在底部显示。原因缺少padding({ bottom: 34 })适配安全区域。解决方案添加底部安全区域 padding。总结本文通过“海风日记“的 Bottom Sheet深入讲解了操作菜单的实现State 控制显示/隐藏状态遮罩层半透明黑色操作项构建器复用操作项三种关闭方式遮罩、操作、取消下一篇文章将深入讲解actionItem 可复用构建器敬请期待。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源Builder 装饰器文档Stack 容器文档Router 路由文档海风日记项目源码[HarmonyOS 开发者官网](https://atomgit.com/openharmony/docs开源鸿蒙跨平台社区

相关新闻

EventBus原理与应用:Android高效通信解决方案

EventBus原理与应用:Android高效通信解决方案

2026/7/19 1:13:51

1. 什么是EventBus及其核心价值EventBus是Android和Java平台上的一款开源事件总线库,由greenrobot团队开发维护。它的核心设计理念是简化组件间的通信,特别是在Android开发中Activity、Fragment、Service等组件之间的消息传递。我第一次接触EventBus是在…

Linux Shell编程实战:需求驱动与自动化测试

Linux Shell编程实战:需求驱动与自动化测试

2026/7/19 1:03:51

1. 需求驱动的Linux Shell编程概述在Linux系统管理和自动化任务处理中,Shell脚本是最直接有效的工具之一。不同于传统的教程式学习,需求驱动(Requirement-Driven)的Shell编程方法更注重从实际项目需求出发,通过解决具体问题来掌握核心技能。这…

Vercel 绑定自定义域名极简配置指南

Vercel 绑定自定义域名极简配置指南

2026/7/19 1:03:51

Vercel 绑定自定义域名极简配置指南 将自定义域名绑定到 Vercel 部署的项目中,核心逻辑仅需两步:在 Vercel 声明域名,在域名服务商处指向 Vercel。以下是具体配置流程及常见避坑指南。 1. 在 Vercel 面板添加域名 进入 Vercel 项目管理后台&a…

Android多线程编程:Thread与Handler的协同机制

Android多线程编程:Thread与Handler的协同机制

2026/7/19 3:54:07

1. 为什么需要Thread和Handler的配合?在Android开发中,UI线程(主线程)负责处理用户交互和界面更新,但所有耗时操作(如网络请求、文件读写、复杂计算等)都不应该在主线程执行,否则会导…

相关性分析实战:协方差、Pearson与Spearman的工程化选择

相关性分析实战:协方差、Pearson与Spearman的工程化选择

2026/7/19 3:54:07

1. 这不是数学课,是数据人每天要打交道的“关系语言”你刚拿到一份销售数据表,想快速判断“广告投放金额”和“当月成交单数”之间到底有没有靠谱的联系——是真有效果,还是纯属巧合?你打开Excel画了个散点图,发现点大…

Java Handler设计模式解析与实战应用

Java Handler设计模式解析与实战应用

2026/7/19 3:54:07

1. Handler 概念解析与核心应用场景Handler 在计算机科学领域是一个基础但强大的抽象概念,它本质上是一种用于管理和响应特定事件或请求的机制。就像机场的行李转运系统,handler 负责将不同类型的"包裹"(请求/事件)准确…

多维聚合变形术:从GROUP BY到结构化洞察的四层跃迁

多维聚合变形术:从GROUP BY到结构化洞察的四层跃迁

2026/7/19 3:54:07

1. 这不是简单的“GROUP BY”——多维聚合中的数据变形术到底在解决什么问题?如果你正在处理销售报表、用户行为分析、IoT设备时序统计,或者哪怕只是整理一份带地区、季度、产品线、渠道四个维度的Excel汇总表,却还在用嵌套SUMIFS、手动切片透…

多维聚合本质:超越GROUP BY的OLAP操作框架

多维聚合本质:超越GROUP BY的OLAP操作框架

2026/7/19 3:54:06

1. 项目概述:多维聚合中的数据操作,远不止GROUP BY那么简单“Part 20: Data Manipulation in Multi-Dimensional Aggregation”这个标题乍看像教科书某章编号,但实际踩中了数据分析和商业智能工程中最常被低估、最易出错、也最具业务价值的一…

2026小批量拿竹笋货怎么选供应商:首单别只问起订量,还要看验收链路

2026小批量拿竹笋货怎么选供应商:首单别只问起订量,还要看验收链路

2026/7/19 3:44:06

2026小批量拿竹笋货怎么选供应商:首单别只问起订量,还要看验收链路> 小餐饮、新开门店或区域经销商第一次小批量拿竹笋货,最容易忽略的不是价格,而是样品与正货是否一致、到货信息能否核对、问题货如何反馈,以及后续…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/19 0:03:49

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/19 0:03:49

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/19 0:03:49

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/19 0:03:49

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/19 0:03:49

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/19 0:03:49

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…