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

鸿蒙ArkTS+ArkUI仿微信消息列表页制作

zhezhongyun 2025-07-02 00:09 5 浏览

先放一下页面效果:

第一步我们先定义一下数据格式,创建一个数据模型,通过图片,可以看到每一条数据的字段应当包括:头像,姓名,最新消息内容和最新消息的时间,创建一个model文件夹,然后在里面新建一个_Chat.ets文件

这里我使用的是interface来定义,当然也有很多人习惯class,类和接口的区别大概就是,interface里不包括代码,只是定义了一种实现规范

代码如下:

```javascript

export interface Info{

name:string

img:Resource

day:string

last:string

}

```

这里的头像img用的是Resource格式,因为我这里模拟演示的时候,用的是本地media文件夹里的图片,在实际项目中,也可以改成string,以对应网络url地址

第二步是模拟一组测试数据,我们在目录里创建一个data文件夹用来存放测试数据,然后创建一个_Chat.ets用来存放聊天的数据。因为是新的文件,所以在这个页面里,并没有对数据类型的定义,所以要先从刚才model文件那里把这个数据规范import过来,然后通过const创建一个数组,并通过as来确认这个数组里的每一个json数据都是同一个聊天数据的规范

代码如下:

```

import {Info} from '../model/_Chat'

export const Chatlist = [

{

name:"同学1",

img:$r("app.media.head1"),

day:"5月5日",

last:"今天上学怎么样?"

},

{

name:"同学2",

img:$r("app.media.head2"),

day:"5月5日",

last:"今天上学怎么样?"

}

] as Info[]

```

由于整体页面结构采用一个@Entry修改的页面+Tab来包裹的4个子组件的形式,因此继续在目录里创建一个views文件夹,用来存放表示一级页面的子组件,然后创建一个Home.ets作为首页

然后要通过import,来引入模拟数据和这个聊天的数据类型,代码如下

``` javascript

import {Chatlist} from '../data/_Chat'

import * as chat from '../model/_Chat'

```

然后创建一个@State描述的数据,作为数据列表

```

@State list:chat.Info[] = Chatlist;

```

最上面的首页标题,使用Row+Text来创建

```

Row() {

Text('首页')

.fontSize(20)

.fontWeight(FontWeight.Medium)

.fontColor('#333333')

}

.width('100%')

.height(56)

.justifyContent(FlexAlign.Center)

.backgroundColor('#f8f9fa')

.border({

width: { bottom: 1 },

color: '#e9ecef'

})

```

这里使用了justifyContent属性来进行居中,如果不加这个属性的话,那么100%宽度的row会让文字靠左显示。接下来是显示聊天数据的列表,这里采用ForEach列表渲染来实现。组件上的话,要考虑到多组数据的情况下是要上下滚动的,所以采用List+ListItem的组合比较合适,虽然说Scroll也能滚动,但是实际上我觉得套个List更加方便,我之前api6那会儿,写js开发鸿蒙的时候,也是用的这个方法。

然后页面中,最新的消息是给了一行的显示位置,然而实际上,很多情况下最新消息的字数可能会超过一行的限制,所以对于这个Text组件,要加上maxLines和textOverflow这两个属性,这两个属性表示最大行数和超出最大行数的话,内容如何显示,单独设置其中某一个是没有意义的。

这里的头像使用了圆形设计方案,当然这个头像的图片不可能直接上传成圆形的,这个是通过对于图片的borderRadius属性进行设置实现的,要把图片的宽度和高度设置成一样的数值,然后把borderRadius这个属性设置为高宽的一半

对于日期的设置上,可以看到日期是在每个组件的右上方的,但这不是通过position来固定的,而是和姓名在同一行里,然后通过设置这个row的justifyContent属性实现的,那么,这就要求,row的父组件的宽度,要正好是除了图片外的全部宽度,所以row的父组件即Column要加上layoutWeight属性,设置为1

这部分的代码如下:

```

List() {

ForEach(this.list, (item: chat.Info, index: number) => {

ListItem() {

Column() {

Row() {

// 头像

Image(item.img)

.width(50)

.height(50)

.borderRadius(25)

.margin({ right: 12 })

// 中间内容区域

Column() {

Row() {

// 姓名

Text(item.name)

.fontSize(16)

.fontWeight(FontWeight.Medium)

.fontColor('#1a1a1a')

// 日期

Text(item.day)

.fontSize(12)

.fontColor('#8e8e93')

}

.width('100%')

.justifyContent(FlexAlign.SpaceBetween)

.margin({ bottom: 4 })

// 最新消息

Text(item.last)

.fontSize(14)

.fontColor('#8e8e93')

.maxLines(1)

.textOverflow({ overflow: TextOverflow.Ellipsis })

.width('100%')

}

.layoutWeight(1)

.alignItems(HorizontalAlign.Start)

}

.width('100%')

.padding({ left: 16, right: 16, top: 12, bottom: 12 })

.alignItems(VerticalAlign.Center)

// 分割线

if (index < this.list.length - 1) {

Divider()

.strokeWidth(0.5)

.color('#e5e5e7')

.margin({ left: 78 })

}

}

}

.backgroundColor('#ffffff')

.onClick(() => {

// 跳转到聊天页面,传递姓名参数

router.pushUrl({

url: 'pages/Chat',

params: {

name: item.name

}

})

})

})

}

.layoutWeight(1)

.backgroundColor('#ffffff')

.scrollBar(BarState.Off)

.edgeEffect(EdgeEffect.Spring)

```

相关推荐

用豆包生成的BMI计算器(豆包的热量是多少?)

<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8&#...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

Qt推流(视频文件/视频流/摄像头/桌面转流媒体rtmp+hls+webrtc)

一、前言说明推流直播就是把采集阶段封包好的内容传输到服务器的过程。其实就是将现场的视频信号从手机端,电脑端,摄影机端打包传到服务器的过程。“推流”对网络要求比较高,如果网络不稳定,直播效果就会很差,观...

一看就会!谷歌广告转化跟踪详细设置指南来了

在出海推广业务中,投放广告最常见的目的是获取订单,但我们怎么知道有没有达成投放目的呢?谷歌转化跟踪技术就可以做到!熟悉谷歌的卖家朋友都知道,转化跟踪在最近几年变得越来越复杂了,虽然有很多选项可以自定义...

Android原生编解码接口MediaCodec详解

作者:躬行之MediaCodec是Android中的编解码器组件,用来访问底层提供的编解码器,通常与MediaExtractor、MediaSync、MediaMuxer、MediaCrypt...

手把手搭建RTSP流媒体服务器(rtsp 流媒体)

0.引言本文主要讲解如何搭建RTSP流媒体服务器的过程,使用开源项目ZLMediaKit。通过这个开源项目,推RTSP流到服务器,然后拉流端可以拉取RTSP、RTMP等流。ZLMediaKit码云链接...

MediaInfo 24.04.0 是一个关于多媒体文件的信息提供工具

MediaInfo24.04.0是一个关于多媒体文件的信息提供工具(仅当文件中包含信息时才提供):包括常规信息(标题、作者、导演、专辑、曲目编号、日期、时长等);视频信息(编解码器、画面比例、帧率...

rmvb格式视频怎么打开,rmvb转MP4认准这个方法

 一、rmvb是什么格式?  RMVB是一种视频文件格式,其中的VB指的是可变比特率。比起上一代的RM格式,RMVB  格式的画面比较清晰,因为它是降低了静态画面下的比特率。  二、制作rmvb  ①...

教你用Plex Media Server,把铁威马变成你的“私人好莱坞”!

TNAS(铁威马NAS)中可以安装多媒体服务器、影视、PlexMediaServer、EmbyServer作为个人媒体服务器使用。PlexMediaServer可以组织整理TNAS上的媒体...

你肯定用过!经典Windows软件被抛弃

Windows系统这些年持续更新的过程中,不断融入新的软件和功能的同时,一些经典的应用也渐渐成为了历史……Windows媒体播放器被抛弃Windows系统不断地推陈出新,一些老旧的组件也难免被抛弃,在...

博思得Q8标签打印全能手(博思得标签打印机安装教程)

2014-12-0905:35:00作者:宋达希【中关村在线办公打印频道原创】服装吊牌、洗涤标签、产品说明标签等都要用到标签打印机,这些标签涵盖多种尺寸的长度和宽度以及材质。另外作为一件商品或者产...

flv文件用什么播放器打开,这样做不踩雷!

FLV是FLASHVIDEO的简称,是随着FlashMX的推出发展而来的视频格式。它的出现有效地解决了视频文件导入Flash后,使导出的SWF文件体积庞大,不能在网络上很好的使用等问题。一、...

media player怎么转换格式?音频转换神器推荐!

Windowsmediaplayer怎么转换格式?WindowsMediaPlayer是微软公司出品的一款多媒体播放器,通常简称“WMP”。提供了编辑音频和视频文件的功能。用户可以使用该软件导...

视频参数检查工具更新:MediaInfo 23.10

MediaInfo提供有关视频或音频文件的技术和标签信息。信息示例包括编解码器、比特率、每秒帧数、宽度、高度、频道数、持续时间、标题、作者、字幕语言和章节名称。多种方式可以查看信息(文本、工作表、树和...

多媒体管理软件:JRiver Media Center 31.0.68 (64位)

JRiverMediaCenter64位是适用于大量库的完整媒体解决方案。它组织、播放和标记所有类型的媒体文件,并对Xbox、PS3、UPnP、DLNA和TiVo进行翻录、刻录。JRiverM...