
项目已开源,开源地址: https://gitcode.com/nutpi/HarmonyosNextCaseStudyTutorial , 欢迎fork & star

在上一篇教程中,我们介绍了聊天页面的整体布局结构和消息列表区域的实现。本篇教程将继续深入探讨ChatPage组件的底部输入区域的实现,重点讲解Row布局的使用、条件渲染表情按钮以及Stack层叠布局在交互元素中的应用。通过这些技巧,我们可以创建一个既美观又实用的聊天输入界面,提升用户体验。
Row({ space: 16 })
{
// 表情按钮(悬浮层叠在输入框上方)
if (this.showEmoji) {
Stack() {
// 表情面板内容
}
} else {
Button('+')
// 表情按钮样式
}
// 输入框
TextInput({text:this.inputText})
// 输入框样式
} .width('100%')
.height(64)
.padding({ left: 16,right:16, bottom: 24 })
.backgroundColor(0xFFFFFF)底部输入区域使用Row组件实现水平布局,将表情按钮和输入框放置在同一行。
属性/参数 | 值 | 作用 |
|---|---|---|
space | 16 | 设置子组件之间的水平间距为16vp |
width | 100% | 设置Row宽度占父容器的100% |
height | 64 | 设置Row高度为64vp,形成固定高度的输入栏 |
padding | { left: 16, right: 16, bottom: 24 } | 设置内边距,使内容与边缘保持适当距离 |
backgroundColor | 0xFFFFFF | 设置背景色为白色 |
底部输入区域的设计考虑了以下几个方面:
这些设计规范有助于创建一个清晰、易用的输入区域,提升用户体验。
if (this.showEmoji) {
Stack() {
Row()
.width(48)
.height(48)
.opacity(0) // 透明蒙层
Button('😀')
.width(48)
.height(48)
.fontSize(20)
.backgroundColor(0xF5F5F5)
.borderRadius(24)
.onClick(() => this.showEmoji = false)
}
} else {
Button('+')
.width(48)
.height(48)
.fontSize(20)
.backgroundColor(0xF5F5F5)
.borderRadius(24)
.onClick(() => this.showEmoji = true)
}条件渲染使用if-else语句根据showEmoji状态变量的值决定显示表情面板还是表情按钮。
条件渲染是HarmonyOS NEXT中实现动态UI的重要机制,它基于以下原理:
在这个案例中,showEmoji状态变量控制着表情面板的显示状态:
通过点击事件改变showEmoji的值,实现表情面板和表情按钮之间的切换。
Button('+')
.width(48)
.height(48)
.fontSize(20)
.backgroundColor(0xF5F5F5)
.borderRadius(24)
.onClick(() => this.showEmoji = true)属性 | 值 | 作用 |
|---|---|---|
构造参数 | '+' | 设置按钮文本为加号 |
width | 48 | 设置按钮宽度为48vp |
height | 48 | 设置按钮高度为48vp |
fontSize | 20 | 设置字体大小为20vp |
backgroundColor | 0xF5F5F5 | 设置背景色为浅灰色 |
borderRadius | 24 | 设置边框圆角为24vp,创建圆形按钮效果 |
onClick | () => this.showEmoji = true | 设置点击事件处理函数,显示表情面板 |
表情按钮的设计考虑了以下几个方面:
这些设计规范有助于创建一个既美观又实用的表情按钮,提升用户体验。
Stack() {
Row()
.width(48)
.height(48)
.opacity(0) // 透明蒙层
Button('😀')
.width(48)
.height(48)
.fontSize(20)
.backgroundColor(0xF5F5F5)
.borderRadius(24)
.onClick(() => this.showEmoji = false)
}Stack组件用于创建层叠布局,使表情按钮可以叠加在透明蒙层上方。
Stack组件是HarmonyOS NEXT中实现层叠布局的核心组件,它基于以下原理:
在这个案例中,Stack组件包含两个子组件:
这种层叠结构使表情按钮可以叠加在透明蒙层上方,创建更丰富的视觉效果。
Row()
.width(48)
.height(48)
.opacity(0) // 透明蒙层属性 | 值 | 作用 |
|---|---|---|
width | 48 | 设置蒙层宽度为48vp |
height | 48 | 设置蒙层高度为48vp |
opacity | 0 | 设置不透明度为0,使蒙层完全透明 |
透明蒙层的设计考虑了以下几个方面:
透明蒙层在这个案例中主要起到占位作用,为表情按钮提供一个固定的位置和尺寸。
Button('😀')
.width(48)
.height(48)
.fontSize(20)
.backgroundColor(0xF5F5F5)
.borderRadius(24)
.onClick(() => this.showEmoji = false)属性 | 值 | 作用 |
|---|---|---|
构造参数 | '😀' | 设置按钮文本为表情符号 |
width | 48 | 设置按钮宽度为48vp |
height | 48 | 设置按钮高度为48vp |
fontSize | 20 | 设置字体大小为20vp |
backgroundColor | 0xF5F5F5 | 设置背景色为浅灰色 |
borderRadius | 24 | 设置边框圆角为24vp,创建圆形按钮效果 |
onClick | () => this.showEmoji = false | 设置点击事件处理函数,隐藏表情面板 |
表情按钮的设计与之前的加号按钮类似,但有以下不同:
这种设计使用户可以通过点击表情按钮来切换表情面板的显示状态,提供直观的交互体验。
TextInput({text:this.inputText})
.flexGrow(1)
.height(48)
.padding(12)
.border({ width: 1, color: 0xD9D9D9 })
.borderRadius(24)TextInput组件用于创建文本输入框,允许用户输入消息。
属性/参数 | 值 | 作用 |
|---|---|---|
构造参数 | {text:this.inputText} | 绑定输入框文本到inputText状态变量 |
flexGrow | 1 | 设置弹性增长因子为1,使其填充剩余空间 |
height | 48 | 设置输入框高度为48vp |
padding | 12 | 设置内边距为12vp,使文本与边缘保持距离 |
border | { width: 1, color: 0xD9D9D9 } | 设置边框宽度为1vp,颜色为浅灰色 |
borderRadius | 24 | 设置边框圆角为24vp,创建圆角输入框效果 |
输入框的设计考虑了以下几个方面:
这些设计规范有助于创建一个既美观又实用的输入框,提升用户体验。
@State messages: string[] = ['你好,今天需要开发布局功能', '收到,马上开始编写示例']
@State inputText: string = ''
@State showEmoji: boolean = false这三个状态变量分别控制着聊天页面的不同方面:
// 显示表情面板
.onClick(() => this.showEmoji = true)
// 隐藏表情面板
.onClick(() => this.showEmoji = false)表情面板的交互通过改变showEmoji状态变量的值来实现:
这种基于状态的交互模式是HarmonyOS NEXT中实现动态UI的常用方式,它具有以下优势:
聊天页面的完整交互流程如下:
这种交互流程简单直观,符合用户的使用习惯,提供了良好的用户体验。
ChatPage组件展示了多层嵌套布局的高级应用:
这种多层嵌套的布局结构使我们能够:
在这个案例中,Stack组件被应用于两个不同的场景:
这展示了Stack组件的灵活性和多样性,它可以适应不同的布局需求,实现各种复杂的视觉效果。
条件渲染和状态管理的结合是实现动态UI的关键:
这种模式使我们能够创建响应用户操作的动态界面,提升用户体验。
通过ChatPage组件的实现,我们学习了以下核心技术要点:
在实际开发中,可以参考以下建议:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。