HarmonyOS布局艺术:Flex、Stack、Grid等容器组件的使用技巧

news/2025/10/30 10:58:27/文章来源:https://www.cnblogs.com/ifeng0918/p/19176242

布局是UI设计的核心,HarmonyOS提供了强大的容器组件系统。本文将深入讲解Flex、Stack、Grid等核心布局组件的使用技巧和最佳实践。

一、Flex弹性布局详解

1.1 Flex基础布局

@Component
struct FlexBasicExample {@State direction: FlexDirection = FlexDirection.Row@State justifyContent: FlexAlign = FlexAlign.Start@State alignItems: ItemAlign = ItemAlign.Start@State wrap: FlexWrap = FlexWrap.NoWrapbuild() {Column({ space: 20 }) {// 控制面板this.buildControlPanel()// Flex布局演示区域Text('Flex布局演示').fontSize(18).fontWeight(FontWeight.Bold)Flex({direction: this.direction,justifyContent: this.justifyContent,alignItems: this.alignItems,wrap: this.wrap}) {ForEach([1, 2, 3, 4, 5, 6], (item: number) => {Text(`Item ${item}`).width(60).height(60).backgroundColor(this.getItemColor(item)).fontColor(Color.White).textAlign(TextAlign.Center).fontSize(14)})}.width('100%').height(200).padding(10).backgroundColor('#F8F9FA').border({ width: 1, color: '#E0E0E0' })}.width('100%').padding(20)}@BuilderbuildControlPanel() {Column({ space: 10 }) {Text('Flex布局控制').fontSize(16).fontWeight(FontWeight.Bold)// 方向控制Row({ space: 5 }) {Text('方向:').fontSize(14).width(60)Button('Row').onClick(() => this.direction = FlexDirection.Row).stateEffect(this.direction === FlexDirection.Row)Button('Column').onClick(() => this.direction = FlexDirection.Column).stateEffect(this.direction === FlexDirection.Column)Button('RowReverse').onClick(() => this.direction = FlexDirection.RowReverse).stateEffect(this.direction === FlexDirection.RowReverse)Button('ColumnReverse').onClick(() => this.direction = FlexDirection.ColumnReverse).stateEffect(this.direction === FlexDirection.ColumnReverse)}// 主轴对齐Row({ space: 5 }) {Text('主轴:').fontSize(14).width(60)Button('Start').onClick(() => this.justifyContent = FlexAlign.Start).stateEffect(this.justifyContent === FlexAlign.Start)Button('Center').onClick(() => this.justifyContent = FlexAlign.Center).stateEffect(this.justifyContent === FlexAlign.Center)Button('End').onClick(() => this.justifyContent = FlexAlign.End).stateEffect(this.justifyContent === FlexAlign.End)Button('SpaceBetween').onClick(() => this.justifyContent = FlexAlign.SpaceBetween).stateEffect(this.justifyContent === FlexAlign.SpaceBetween)}// 交叉轴对齐Row({ space: 5 }) {Text('交叉轴:').fontSize(14).width(60)Button('Start').onClick(() => this.alignItems = ItemAlign.Start).stateEffect(this.alignItems === ItemAlign.Start)Button('Center').onClick(() => this.alignItems = ItemAlign.Center).stateEffect(this.alignItems === ItemAlign.Center)Button('End').onClick(() => this.alignItems = ItemAlign.End).stateEffect(this.alignItems === ItemAlign.End)Button('Stretch').onClick(() => this.alignItems = ItemAlign.Stretch).stateEffect(this.alignItems === ItemAlign.Stretch)}}.width('100%').padding(15).backgroundColor('#FFFFFF').borderRadius(8)}getItemColor(index: number): string {const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FECA57', '#FF9FF3']return colors[index % colors.length]}
}

1.2 Flex高级特性

@Component
struct FlexAdvancedExample {@State items: any[] = [{ id: 1, name: 'Item1', flexGrow: 1, flexShrink: 1, alignSelf: ItemAlign.Auto },{ id: 2, name: 'Item2', flexGrow: 2, flexShrink: 1, alignSelf: ItemAlign.Center },{ id: 3, name: 'Item3', flexGrow: 1, flexShrink: 2, alignSelf: ItemAlign.End }]build() {Column({ space: 20 }) {Text('Flex高级特性').fontSize(20).fontWeight(FontWeight.Bold)// Flex容器Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround }) {ForEach(this.items, (item: any) => {Text(item.name).flexGrow(item.flexGrow).flexShrink(item.flexShrink).alignSelf(item.alignSelf).minWidth(60).height(80).backgroundColor(this.getItemColor(item.id)).fontColor(Color.White).textAlign(TextAlign.Center).padding(10)})}.width('100%').height(120).padding(10).backgroundColor('#F5F5F5')// 控制面板this.buildItemControls()}.width('100%').padding(20)}@BuilderbuildItemControls() {Column({ space: 15 }) {ForEach(this.items, (item: any, index: number) => {Column({ space: 8 }) {Text(`${item.name} 控制`).fontSize(14).fontWeight(FontWeight.Medium)Row({ space: 10 }) {Text(`flexGrow: ${item.flexGrow}`).fontSize(12).width(80)Slider({value: item.flexGrow,min: 0,max: 3,step: 1}).onChange((value: number) => {item.flexGrow = value}).layoutWeight(1)}Row({ space: 10 }) {Text(`flexShrink: ${item.flexShrink}`).fontSize(12).width(80)Slider({value: item.flexShrink,min: 0,max: 3,step: 1}).onChange((value: number) => {item.flexShrink = value}).layoutWeight(1)}Row({ space: 5 }) {Text('alignSelf:').fontSize(12).width(80)Button('Auto').onClick(() => item.alignSelf = ItemAlign.Auto).stateEffect(item.alignSelf === ItemAlign.Auto)Button('Start').onClick(() => item.alignSelf = ItemAlign.Start).stateEffect(item.alignSelf === ItemAlign.Start)Button('Center').onClick(() => item.alignSelf = ItemAlign.Center).stateEffect(item.alignSelf === ItemAlign.Center)Button('End').onClick(() => item.alignSelf = ItemAlign.End).stateEffect(item.alignSelf === ItemAlign.End)}}.width('100%').padding(10).backgroundColor('#FFFFFF').borderRadius(6)})}}getItemColor(id: number): string {const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1']return colors[(id - 1) % colors.length]}
}

二、Stack层叠布局

2.1 Stack基础应用

@Component
struct StackBasicExample {@State alignment: Alignment = Alignment.Center@State stackItems: any[] = [{ id: 1, content: '底层', width: 200, height: 150, color: '#FF6B6B', zIndex: 1 },{ id: 2, content: '中层', width: 160, height: 120, color: '#4ECDC4', zIndex: 2 },{ id: 3, content: '顶层', width: 120, height: 90, color: '#45B7D1', zIndex: 3 }]build() {Column({ space: 20 }) {Text('Stack层叠布局').fontSize(20).fontWeight(FontWeight.Bold)// Stack容器Stack({ alignContent: this.alignment }) {ForEach(this.stackItems, (item: any) => {Text(item.content).width(item.width).height(item.height).backgroundColor(item.color).fontColor(Color.White).textAlign(TextAlign.Center).fontSize(16).zIndex(item.zIndex)})}.width(300).height(250).backgroundColor('#F8F9FA').padding(10)// 控制面板this.buildStackControls()}.width('100%').padding(20).alignItems(HorizontalAlign.Center)}@BuilderbuildStackControls() {Column({ space: 15 }) {Text('对齐方式控制').fontSize(16).fontWeight(FontWeight.Medium)// 对齐方式按钮组Grid() {GridItem() {Button('TopStart').onClick(() => this.alignment = Alignment.TopStart).stateEffect(this.alignment === Alignment.TopStart)}GridItem() {Button('Top').onClick(() => this.alignment = Alignment.Top).stateEffect(this.alignment === Alignment.Top)}GridItem() {Button('TopEnd').onClick(() => this.alignment = Alignment.TopEnd).stateEffect(this.alignment === Alignment.TopEnd)}GridItem() {Button('Start').onClick(() => this.alignment = Alignment.Start).stateEffect(this.alignment === Alignment.Start)}GridItem() {Button('Center').onClick(() => this.alignment = Alignment.Center).stateEffect(this.alignment === Alignment.Center)}GridItem() {Button('End').onClick(() => this.alignment = Alignment.End).stateEffect(this.alignment === Alignment.End)}GridItem() {Button('BottomStart').onClick(() => this.alignment = Alignment.BottomStart).stateEffect(this.alignment === Alignment.BottomStart)}GridItem() {Button('Bottom').onClick(() => this.alignment = Alignment.Bottom).stateEffect(this.alignment === Alignment.Bottom)}GridItem() {Button('BottomEnd').onClick(() => this.alignment = Alignment.BottomEnd).stateEffect(this.alignment === Alignment.BottomEnd)}}.columnsTemplate('1fr 1fr 1fr').rowsTemplate('1fr 1fr 1fr').columnsGap(5).rowsGap(5).height(120)// zIndex控制Text('层级控制').fontSize(16).fontWeight(FontWeight.Medium)ForEach(this.stackItems, (item: any) => {Row({ space: 10 }) {Text(`${item.content} zIndex:`).fontSize(14).width(100)Slider({value: item.zIndex,min: 1,max: 5,step: 1}).onChange((value: number) => {item.zIndex = value}).layoutWeight(1)Text(item.zIndex.toString()).fontSize(14).width(30)}})}.width('100%').maxWidth(400).padding(15).backgroundColor('#FFFFFF').borderRadius(8)}
}

2.2 Stack实战案例

@Component
struct StackPracticalExample {@State progress: number = 60@State badgeCount: number = 3@State isOnline: boolean = truebuild() {Column({ space: 30 }) {Text('Stack实战案例').fontSize(20).fontWeight(FontWeight.Bold)// 案例1:用户头像带状态this.buildUserAvatar()// 案例2:进度条叠加this.buildProgressStack()// 案例3:卡片叠加效果this.buildCardStack()}.width('100%').padding(20)}@BuilderbuildUserAvatar() {Column({ space: 10 }) {Text('1. 用户头像带状态').fontSize(16).fontWeight(FontWeight.Medium)Stack({ alignContent: Alignment.BottomEnd }) {// 头像Image($r('app.media.user_avatar')).width(80).height(80).borderRadius(40).border({ width: 3, color: Color.White })// 在线状态Circle({ width: 16, height: 16 }).fill(this.isOnline ? '#34C759' : '#FF3B30').stroke({ width: 2, color: Color.White }).offset({ x: -5, y: -5 })}.onClick(() => {this.isOnline = !this.isOnline})}.alignItems(HorizontalAlign.Center)}@BuilderbuildProgressStack() {Column({ space: 10 }) {Text('2. 进度条叠加效果').fontSize(16).fontWeight(FontWeight.Medium)Stack() {// 背景条Row().width(200).height(12).backgroundColor('#E5E5EA').borderRadius(6)// 进度条Row().width(`${this.progress}%`).height(12).backgroundColor('#007DFF').borderRadius(6)// 进度文本Text(`${this.progress}%`).fontSize(10).fontColor(Color.White).fontWeight(FontWeight.Bold).offset({ x: this.progress * 2 - 10, y: 0 })}.width(200).height(20)Slider({value: this.progress,min: 0,max: 100,step: 1}).width(200).onChange((value: number) => {this.progress = value})}.alignItems(HorizontalAlign.Center)}@BuilderbuildCardStack() {Column({ space: 10 }) {Text('3. 卡片叠加效果').fontSize(16).fontWeight(FontWeight.Medium)Stack({ alignContent: Alignment.Center }) {// 底层卡片Column({ space: 10 }) {Text('卡片标题').fontSize(16).fontWeight(FontWeight.Bold)Text('这是卡片内容描述信息').fontSize(12).fontColor('#666')}.width(180).height(120).padding(15).backgroundColor('#FFECB3').borderRadius(12).shadow({ radius: 8, color: '#40000000', offsetX: 0, offsetY: 4 }).offset({ x: -5, y: -5 }).zIndex(1)// 中层卡片Column({ space: 10 }) {Text('卡片标题').fontSize(16).fontWeight(FontWeight.Bold)Text('这是卡片内容描述信息').fontSize(12).fontColor('#666')}.width(180).height(120).padding(15).backgroundColor('#C8E6C9').borderRadius(12).shadow({ radius: 8, color: '#40000000', offsetX: 0, offsetY: 4 }).offset({ x: 0, y: 0 }).zIndex(2)// 顶层卡片Column({ space: 10 }) {Text('卡片标题').fontSize(16).fontWeight(FontWeight.Bold)Text('这是卡片内容描述信息').fontSize(12).fontColor('#666')}.width(180).height(120).padding(15).backgroundColor('#BBDEFB').borderRadius(12).shadow({ radius: 12, color: '#40000000', offsetX: 0, offsetY: 6 }).offset({ x: 5, y: 5 }).zIndex(3)}.height(140)}.alignItems(HorizontalAlign.Center)}
}

三、Grid网格布局

3.1 Grid基础布局

@Component
struct GridBasicExample {@State columnsTemplate: string = '1fr 1fr 1fr'@State rowsTemplate: string = '1fr 1fr'@State columnsGap: number = 10@State rowsGap: number = 10@State gridItems: number[] = [1, 2, 3, 4, 5, 6]build() {Column({ space: 20 }) {Text('Grid网格布局').fontSize(20).fontWeight(FontWeight.Bold)// Grid容器Grid() {ForEach(this.gridItems, (item: number) => {GridItem() {Text(`Item ${item}`).width('100%').height('100%').backgroundColor(this.getItemColor(item)).fontColor(Color.White).textAlign(TextAlign.Center).fontSize(14)}})}.columnsTemplate(this.columnsTemplate).rowsTemplate(this.rowsTemplate).columnsGap(this.columnsGap).rowsGap(this.rowsGap).width('100%').height(200).padding(10).backgroundColor('#F8F9FA')// 控制面板this.buildGridControls()}.width('100%').padding(20)}@BuilderbuildGridControls() {Column({ space: 15 }) {Text('Grid布局控制').fontSize(16).fontWeight(FontWeight.Medium)// 列模板控制Row({ space: 10 }) {Text('列模板:').fontSize(14).width(80)TextInput({ placeholder: '例如: 1fr 1fr 1fr' }).onChange((value: string) => {this.columnsTemplate = value}).layoutWeight(1)}// 行模板控制Row({ space: 10 }) {Text('行模板:').fontSize(14).width(80)TextInput({ placeholder: '例如: 1fr 1fr' }).onChange((value: string) => {this.rowsTemplate = value}).layoutWeight(1)}// 间距控制Row({ space: 10 }) {Text('列间距:').fontSize(14).width(80)Slider({value: this.columnsGap,min: 0,max: 30,step: 1}).onChange((value: number) => {this.columnsGap = value}).layoutWeight(1)Text(this.columnsGap.toString()).fontSize(14).width(30)}Row({ space: 10 }) {Text('行间距:').fontSize(14).width(80)Slider({value: this.rowsGap,min: 0,max: 30,step: 1}).onChange((value: number) => {this.rowsGap = value}).layoutWeight(1)Text(this.rowsGap.toString()).fontSize(14).width(30)}// 预设模板Text('预设模板:').fontSize(14)Row({ space: 5 }) {Button('2x2').onClick(() => {this.columnsTemplate = '1fr 1fr'this.rowsTemplate = '1fr 1fr'})Button('3x2').onClick(() => {this.columnsTemplate = '1fr 1fr 1fr'this.rowsTemplate = '1fr 1fr'})Button('4x3').onClick(() => {this.columnsTemplate = '1fr 1fr 1fr 1fr'this.rowsTemplate = '1fr 1fr 1fr'})Button('不规则').onClick(() => {this.columnsTemplate = '2fr 1fr 1fr'this.rowsTemplate = '100px 1fr'})}}.width('100%').padding(15).backgroundColor('#FFFFFF').borderRadius(8)}getItemColor(index: number): string {const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FECA57', '#FF9FF3']return colors[index % colors.length]}
}

3.2 Grid高级应用

@Component
struct GridAdvancedExample {@State gridData: any[] = [{ id: 1, name: '音乐', icon: '🎵', span: { column: 1, row: 1 } },{ id: 2, name: '视频', icon: '🎬', span: { column: 1, row: 1 } },{ id: 3, name: '游戏', icon: '🎮', span: { column: 2, row: 1 } },{ id: 4, name: '阅读', icon: '📚', span: { column: 1, row: 2 } },{ id: 5, name: '社交', icon: '👥', span: { column: 1, row: 1 } },{ id: 6, name: '工具', icon: '🛠️', span: { column: 1, row: 1 } }]build() {Column({ space: 20 }) {Text('Grid高级应用 - 不规则网格').fontSize(20).fontWeight(FontWeight.Bold)// 不规则Grid布局Grid() {ForEach(this.gridData, (item: any) => {GridItem(item.span) {Column({ space: 8 }) {Text(item.icon).fontSize(24)Text(item.name).fontSize(12).fontColor(Color.White)}.width('100%').height('100%').justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).backgroundColor(this.getCategoryColor(item.id)).borderRadius(8).onClick(() => {console.log(`点击了: ${item.name}`)})}})}.columnsTemplate('1fr 1fr 1fr').rowsTemplate('80px 80px 80px').columnsGap(10).rowsGap(10).width('100%').height(280).padding(10).backgroundColor('#F8F9FA')// 网格项详细信息this.buildGridInfo()}.width('100%').padding(20)}@BuilderbuildGridInfo() {Column({ space: 10 }) {Text('网格项详细信息').fontSize(16).fontWeight(FontWeight.Medium)Grid() {ForEach(this.gridData, (item: any) => {GridItem() {Row({ space: 8 }) {Text(item.icon).fontSize(16)Column({ space: 2 }) {Text(item.name).fontSize(12).fontWeight(FontWeight.Medium)Text(`跨${item.span.column}列${item.span.row}行`).fontSize(10).fontColor('#666')}}.width('100%').padding(8).backgroundColor('#FFFFFF').borderRadius(6)}})}.columnsTemplate('1fr 1fr').rowsTemplate('1fr 1fr 1fr').columnsGap(8).rowsGap(8).width('100%').height(120)}}getCategoryColor(id: number): string {const colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FECA57', '#FF9FF3']return colors[(id - 1) % colors.length]}
}

需要参加鸿蒙认证的请点击 鸿蒙认证链接

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

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

相关文章

2025 年污水深度处理厂家最新推荐榜,技术实力与市场口碑深度解析,聚焦企业核心竞争力工业污水深度处理,城市污水深度处理,市政污水深度处理公司推荐

引言 随着我国水环境治理要求不断提高,污水深度处理行业迎来快速发展期。为精准推荐优质供应商,本次榜单由环境保护产业协会联合行业专家团队共同测评打造,测评覆盖全国 200 余家污水深度处理企业,从技术创新性、案…

有什么简单好用的开源 AI 智能体平台?试了 5 个主流项目,聊聊真实体验

我前后测了 LangChain、Dify、AutoGPT、Microsoft Semantic Kernel,还有 BuildingAI,都是从程序员视角实打实操作的,记了些关键数据和使用细节,今天客观聊聊感受,尽量不掺主观偏好。有什么简单好用的开源AI智能体…

RecyclerView使用-涂鸦智能App的首页和添加效果-从0到1详细过程

本周作业 三选一,选个最bt的,开始 由于压根没做过,绝对大量踩坑 边写边更新 参考资料 绘图网址: draw.io 图标网站: https://www.iconfont.cn/ 参考资料: https://blog.csdn.net/weixin_31163455/article/details/1…

ArkUI声明式开发范式:构建响应式用户界面

ArkUI是HarmonyOS的现代化UI开发框架,采用声明式编程范式。本文将深入讲解ArkUI的核心概念、语法特性和最佳实践,帮助你构建高性能的响应式用户界面。一、声明式UI与命令式UI对比 1.1 传统命令式UI开发 // 命令式编程…

AI模型介绍

自Chat GPT的发布以来,国内各大厂商也相继推出了AI产品,例如DeepSeek、元宝、豆包、KiMi等。AI可以根据提出的问题给出一个结论,那么就无法忽视一个定义——AI模型,因为AI往往是通过模型来得出结论的。 什么是AI模…

2025年靠谱的珍珠棉TOP实力厂家推荐榜

2025年靠谱的珍珠棉TOP实力厂家推荐榜 珍珠棉(EPE)作为一种轻质、环保、抗震性能优异的包装材料,广泛应用于电子、光伏、医疗器械、家具等领域。随着市场需求的增长,选择一家技术实力强、服务优质的珍珠棉生产厂家…

jmeter 创建100个现场组,每个线程组里面有1个http请求,并针对每个http请求响应头进行断言

View Postjmeter 创建100个现场组,每个线程组里面有1个http请求,并针对每个http请求响应头进行断言 import org.apache.jmeter.control.LoopController import org.apache.jmeter.protocol.http.sampler.HTTPSampler…

3步法让小程序体验更高级:兰亭妙微分享小团队也能做到的设计优化技巧

3步法让小程序体验更高级:兰亭妙微分享小团队也能做到的设计优化技巧第一步:信息架构重塑,搭建清晰 “导航图” 信息架构就像是小程序的 “隐形骨架”,支撑着整个用户体验的大厦。兰亭妙微团队深知,一个混乱无序的…

Redis key 消失之谜

本文从一次生产环境业务服务报错,逐步对问题进行定位,深入分析之后发现导致问题的原因,给出相应的优化方法,提升业务可用性。作者:vivo 互联网存储团队 - Lin Haiwen、Xu Xingbao 本文从一次生产环境业务服务报错…

Blazor 感觉回到了ASP时代?

大家好,我是码农刚子。前几天分享的文章:《ASP.NET Core Blazor简介和快速入门三(布局和路由)》下面,有朋友评论说:这blazor 感觉回到了asp 时代。回想一下ASP时代是什么时候,大家还有没有印象。我2019年出来工…

2025年靠谱的FFU龙骨优质厂家推荐榜单

2025年靠谱的FFU龙骨优质厂家推荐榜单 在洁净室、电子制造、医疗等高端领域,FFU(风机过滤单元)龙骨作为核心支撑结构,其质量直接影响空气净化系统的稳定性和使用寿命。选择一家技术成熟、产能稳定、售后服务完善的…

2025年比较好的三维调节阻尼托底轨TOP品牌厂家排行榜

2025年比较好的三维调节阻尼托底轨TOP品牌厂家排行榜 随着家具行业对功能性与品质要求的不断提升,三维调节阻尼托底轨作为高端抽屉系统的核心部件,其市场需求持续增长。优质的托底轨不仅能实现静音开合、缓冲防夹,…

父子组件联动出现问题的一个bug记录

父子组件联动出现问题的一个bug记录这是Bug是这样,父组件有个部门的树,子组件有个饼图。 初始状态下,部门树默认是查询全部部门,饼图是有数据的,切换不同的部门后,饼图也是有数据的。 但是当部门切回全部时候,饼…

ArkTS语言入门:HarmonyOS应用开发的新基石

ArkTS是HarmonyOS应用开发的推荐语言,它基于TypeScript,并扩展了声明式UI语法。本文将带你全面了解ArkTS语言的基础语法和核心特性,为HarmonyOS应用开发打下坚实基础。一、ArkTS与TypeScript的关系 ArkTS是TypeScri…

大模型越来越多,国产AI的突围之路在哪里?

一、大模型“遍地开花”,同质化的隐忧 过去两年,全球AI行业进入了「大模型百花齐放」时代。OpenAI的GPT系列、Anthropic的Claude、Google的Gemini、Mistral的开源路线……国外大厂纷纷亮剑。与此同时,中国的大模型数…

2025年靠谱的卫浴缓冲隐藏轨厂家最新权威实力榜

2025年靠谱的卫浴缓冲隐藏轨厂家最新权威实力榜在卫浴五金行业,缓冲隐藏轨作为高端橱柜、浴室柜的核心配件,其品质直接影响产品的使用寿命和用户体验。随着消费者对家居品质要求的提升,具备静音、缓冲、承重强等特点…

【2025-10-29】买了周卡

20:00人谁不顾老,老去有谁怜。身瘦带频减,发稀冠自偏。废书缘惜眼,多灸为随年。经事还谙事,阅人如阅川。细思皆幸矣,下此便偷然。莫道桑榆晚,为霞尚满天。——《酬乐天咏老见示》 唐刘禹锡今天又是焦头烂耳的一天…

鸿蒙初开:HarmonyOS 5应用开发环境搭建(DevEco Studio)全指南

鸿蒙初开:HarmonyOS 5应用开发环境搭建(DevEco Studio)全指南 本文将手把手带你完成HarmonyOS 5应用开发的第一步,也是最关键的一步——开发环境的搭建。我们将从系统要求开始,直至在模拟器上成功运行第一个“Hel…

AI智能客服机器人是怎么做出来的?

AI智能客服机器人是怎么做出来的?大家好!今天咱们来聊聊AI智能客服机器人到底是怎么做出来的。如果你好奇这些能7*24小时在线、秒回问题的“数字员工”是如何工作的,或者正考虑为企业搭建一套智能客服系统,这篇文章…

2025年方形真空干燥机工厂权威推荐榜单:圆形真空干燥机/真空干燥机/双锥回转真空干燥机源头厂家精选

在化工、制药等行业的生产线上,一台高效的方形真空干燥机正将一批热敏性物料的含水率精准降至0.5%以下,而能耗较传统设备降低了30%以上。 方形真空干燥机作为现代工业干燥技术的重要组成部分,以其空间利用率高、易于…