百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

鸿蒙Next仓颉语言开发实战教程:聊天页面

zhezhongyun 2025-07-15 02:06 29 浏览

大家下午好。昨天分享了消息列表页面,今天继续分享聊天页面的开发过程:

这个页面又是常见的上中下布局,从上至下依次为导航栏、聊天列表和输入框工具栏,我们可以先写一下简单的结构,最上面导航栏是横向布局,所以写个Row容器,中间是List,底部仍然是Row容器,导航栏和底部输入框的高度是固定的,List不确定,所以给List设置layoutWeight属性它自动撑满屏幕,具体代码是这样的:

Row{
    
}
.width(100.percent)
.height(60)
List{
    
}
.width(100.percent)
.layoutWeight(1)
Row{
    
}
.width(100.percent)
.height(50)

整体结构写好了,剩下的工作就是分别丰富每一部分的内容,导航栏部分为了使标题绝对居中,所以我将Row换为Stack容器:

Stack {
     Text('消息')
    .fontSize(16)
    .fontWeight(FontWeight.Bold)
    .fontColor(Color.BLACK)
    Row{
         Image(@r(app.media.back))
    .width(27)
    .height(27)
     .onClick({evet => Router.back()})
    }.width(100.percent).justifyContent(FlexAlign.Start).padding(left:5)
}
.width(100.percent)
.height(60)
.backgroundColor(Color.WHITE)

消息列表部分要考虑到消息是本人发送的还是别人发送的,以此区分内容靠左还是靠右,还要考虑到消息内容过长时的屏幕适配问题,可以使用约束属性和设置内容的最大和最小尺寸,消息列表组件的具体代码如下:

package ohos_app_cangjie_entry.components
internal import ohos.base.*
internal import ohos.component.*
internal import ohos.state_manage.*
import ohos.state_macro_manage.*
import cj_res_entry.app
import ohos_app_cangjie_entry.model.ChatItem
@Component
public class chatrow {
    @Link var model:ChatItem
    func build() {
        Column(){
            Row{
                            Text(model.getSendTime())
                            .fontColor(Color.GRAY)
                            .fontSize(13)
                        }
                        .width(100.percent)
                        .alignItems(VerticalAlign.Center)
                        .justifyContent(FlexAlign.Center)
           
                if(model.getFrom() == 'I'){
                 Row(8){
                      Image(@r(app.media.ih1))
                        .width(34)
                        .height(34)
                        .borderRadius(17)
                        .backgroundColor(Color.GRAY)
                    Column(5){
                            Text(model.getName())
                            .fontSize(14)
                            .fontColor(0x4a4a4a)
                            Text(model.getContent())
                            .backgroundColor(Color(237,237,237))
                            .padding(8)
                            .fontColor(Color.BLACK)
                            .fontSize(15)
                            .borderRadius(6)
                                .constraintSize(minWidth: 20.vp, maxWidth: 60.percent)
                        }
                        .alignItems(HorizontalAlign.Start)
                     }
                    .alignItems(VerticalAlign.Top)
                }else if(model.getFrom() == 'D'){
                
                Row(8){
                    Column(5){
                            Text(model.getName())
                            .fontSize(14)
                            .fontColor(0x4a4a4a)
                            Text(model.getContent())
                            .backgroundColor(0xd84642)
                            .padding(8)
                            .fontColor(Color.WHITE)
                            .fontSize(15)
                            .borderRadius(6)
                                .constraintSize(minWidth: 20.vp, maxWidth: 60.percent)
                        }
                        .alignItems(HorizontalAlign.End)
                    Image(@r(app.media.ih2))
                        .width(34)
                        .height(34)
                        .borderRadius(17)
                        .backgroundColor(Color.GRAY)
                     }
                    .alignItems(VerticalAlign.Top)
                .width(100.percent)
                .justifyContent(FlexAlign.End)
            }
        }
        .alignItems(HorizontalAlign.Start)
    }
}

最后是输入框部分,比较难的应该是上方阴影和聊天框语音框的切换,仓颉中阴影的设置依然使用shadow属性,输入框的切换使用if语句控制即可,这一部分的具体代码如下:

Row(6){
if(inputText){
     Image(@r(app.media.barvoice))
    .width(30)
    .height(30)
    .borderRadius(15)
    .onClick({evet =>
        inputText = false
        })
     TextInput()
    .height(36)
    .borderRadius(18)
    .backgroundColor(Color(237,237,237))
    .layoutWeight(1)
}else {
     Image(@r(app.media.bartxt))
    .width(30)
    .height(30)
    .borderRadius(15)
    .onClick({evet =>
        inputText = true
        })
    Text('按住讲话')
     .height(36)
    .borderRadius(18)
    .backgroundColor(Color(237,237,237))
    .layoutWeight(1)
    .textAlign(TextAlign.Center)
}
    Image(@r(app.media.barimg))
    .width(30)
    .height(30)
    .borderRadius(15)
}
.width(100.percent)
.height(46)
.alignItems(VerticalAlign.Center)
.padding(left:12,right:12)
.borderWidth(EdgeWidths( top: 0.5.vp))
.borderStyle(BorderStyle.Solid)
.borderColor(Color(216,216,216))
.shadow(radius: 23, color: Color(230,230,230), offsetX: 0, offsetY: -20)

今天的内容就是这样,感谢阅读。##HarmonyOS语言##仓颉##购物#

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...