Avalonia 实现聊天消息渲染、图文混排(支持Windows、Linux、信创国产OS)
在实现即时通讯软件或聊天软件时,渲染文字表情、图文混排是一项非常繁琐的工作,再加上还要支持GIF动图、引用消息、撤回消息、名片等不同样式的消息渲染时,就更加麻烦了。
好在我们可以使用 ESFramework 提供的 IChatRender 组件,使用它我们就能轻松实现类似于微信聊天消息的渲染效果。IChatRender 支持 Windows、Linux(包括国产OS)。在Windows平台上提供了基于 WinForm 和基于 WPF 的实现,在Linux上则是基于Avalonia 实现的。
废话不多说,先上张渲染Demo的效果图(该Demo源码可于文末下载):

一. 支持的聊天消息类型
IChatRender 支持渲染的聊天消息类型包括:
(1)文本表情混排。
(2)图片,GIF 动图。
(3)文件传输进度及控制。
(4)个人名片、群名片。
(5)引用消息。
(6)语音消息。
(7)语音通话。
(8)视频通话。
(9)撤回消息、删除消息。
二. IChatRender 接口定义
IChatRender 接口的定义具体如下所示:
/// <summary>
/// 渲染名片
/// </summary>
/// <param name="msgID">聊天记录ID</param>
/// <param name="userID">发送者</param>
/// <param name="cardUserID">名片上的个人ID</param>
/// <param name="index">插入聊天记录的位置,默认是放到最后面</param>
void AddChatItemCard(string msgID ,string userID, string cardUserID ,int? index = null); /// <summary>
/// 渲染文件
/// </summary>
/// <param name="fileName">文件名称</param>
/// <param name="fileSize">文件大小</param>
/// <param name="state">文件状态</param>
void AddChatItemFile(string msgID, string userID, string fileName, ulong fileSize, FileTransState state, int? index = null); /// <summary>
/// 渲染图片
/// </summary>
/// <param name="image">图像</param>
/// <param name="imgSize">图像大小</param>
/// <param name="observerable">默认传null</param>
void AddChatItemImage(string msgID, string userID, object image, Size imgSize ,IProgressObserverable observerable = null, int? index = null); /// <summary>
/// 渲染文本表情
/// </summary>
/// <param name="text">内容,在渲染文本的内容中用 [000]来代表第一个表情,[001]即是二个表情,以此类推</param>
/// <param name="referenced">引用内容可以是文本、图片、文件或名片</param>
/// <param name="textColor">文字颜色</param>
void AddChatItemText(string msgID, string userID, string text, ReferencedChatMessage referenced = null, Color? textColor = null, int? index = null); /// <summary>
/// 渲染悄悄话,默认显示内容—>> 悄悄话
/// </summary>
void AddChatItemSnap(string msgID, string userID, int? index = null); /// <summary>
/// 渲染语音消息
/// </summary>
/// <param name="audioMessageSecs">语音时长</param>
/// <param name="audioMessage">语音短信</param>
void AddChatItemAudio(string msgID, string userID, int audioMessageSecs, object audioMessage, int? index = null); /// <summary>
/// 渲染多媒体通话类型
/// </summary>
/// <param name="duration">通话时长</param>
/// <param name="isAudioCommunicate">通话类型(语音/视频)</param>
void AddChatItemMedia(string msgID, string userID, string duration, bool isAudioCommunicate, int? index = null); /// <summary>
/// 渲染系统消息
/// </summary>
/// <param name="msg">系统消息内容</param>
void AddChatItemSystemMessage(string msg, int? index = null); /// <summary>
/// 渲染消息的发送时间
/// </summary>
/// <param name="dt">发送时间</param>
void AddChatItemTime(DateTime dt, int? index = null); /// <summary>
/// 自己撤回消息
/// </summary>
void RecallChatMessage(string msgID); /// <summary>
/// 其他用户撤回消息
/// </summary>
/// <param name="operatorName">操作者</param>
void RecallChatMessage(string msgID ,string operatorName); /// <summary>
/// 删除对应的记录
/// </summary>
void RemoveChatMessage(string msgID);
三. 创建 IChatRender 实例
可以通过调用ESFramework.Extensions.ChatRendering.ChatRenderFactory 的静态方法 CreateChatRender 创建一个 IChatRender 实例。
/// <param name="provider">提供必要的信息给聊天渲染器</param>
/// <param name="ctrl">要在其表面渲染的UI控件</param>
/// <param name="myID">自己的ID</param>
/// <param name="destID">对方ID、或群ID</param>
/// <param name="isGroup">群聊/单聊</param>
/// <returns></returns>
public static IChatRender CreateChatRender(ISysRender sysRender,IRenderDataProvider provider, IChatControl ctrl, string myID, string destID, bool isGroup);
第一个参数 sysRender 用于完成特定平台上的基础渲染绘制实现,比如 Winform 版的实现,WPF版的实现,以及Avalonia版的实现。
ISysRender 接口的定义如下所示:

在文末可下载的源码中,AvaloniaRender 类就实现了 ISysRender 接口。由于代码量较大,这里就不贴出来了,大家可自行参看。
第二个参数 IRenderDataProvider 用于在 IChatRender 渲染时,能从该接口获取必要的信息(如用户的头像、名称、表情图片等)。
第三个参数 则是要在其表面进行渲染的UI控件。
四. 扩展自定义消息渲染
如果需要渲染自定义的消息,可以调用 IChatRender 的 AddChatItemCustomized 方法插入要渲染的自定义消息。
/// <summary>
/// 插入要渲染的自定义消息。
/// </summary>
void AddChatItemCustomized(IChatItem item, int? index = null);
自定义的消息可以从 BaseChatItem 继承,然后override复写其几个方法就可以了。具体可以参见文末demo源码中的自定义消息渲染的实现。
五. Demo 源码下载
ChatRenderDemo 源码链接 1:Linux 端(Avalonia) 源码
ChatRenderDemo 源码链接 2:Windows 端 + Linux 端 源码
源码解决方案中包括三个项目:
(1)ChatRenderDemo.WPF: 该Demo的Windows端(基于WPF)。
(2)ChatRenderDemo.WinForm: 该Demo的Windows端(基于WinForm)。
(3)ChatRenderDemo.Linux: 该Demo的Linux客户端(基于.NetCore),支持在统信UOS、银河麒麟等国产OS上运行。
注:Linux 端内置的是x86/x64非托管so库,若需要其它架构的so,可以评论区留下email,到时我会发给大家。
Avalonia 实现聊天消息渲染、图文混排(支持Windows、Linux、信创国产OS)的更多相关文章
- AS3聊天单行输入框图文混排完美实现
几年前刚毕业.第一个游戏模块做的就是聊天.到如今.几个游戏写过几次聊天模块. 之前在4399做的<幻龙骑士>(又名<神骑士>),还有上周六刚上线的<疯狂的子弹>, ...
- C#实现聊天消息渲染、图文混排(支持Windows、Linux)
在实现聊天软件时,渲染文字表情图文混排是一项非常繁琐的工作,再加上还要支持GIF动图.引用消息.撤回消息.名片等不同样式的消息渲染时,就更加麻烦了. 好在我们可以使用 ESFramework 提供的 ...
- 【转】关于FLASH中图文混排聊天框的小结
原文链接 图文混排也是FLASH里一个很古老的话题了,我们不像美国佬那样游戏里面聊天框就是聊天框,全是文字干干净净,也不像日本人发明了并且频繁地使用颜文字.不管是做论坛.做游戏,必定要实现的一点就是带 ...
- 仿QQ聊天图文混排流程图【适用于XMPP】
图文混排流程图.graffle4.8 KB 下面附上图片素材: 表情.zip692.5 KB 下面是字符串与图片的详细对应关系: "[呲牙]& ...
- Unity UGUI图文混排源码(二)
Unity UGUI图文混排源码(一):http://blog.csdn.net/qq992817263/article/details/51112304 Unity UGUI图文混排源码(二):ht ...
- Unity UGUI实现图文混排
目前在unity实现图文混排的好像都是通过自定义字体然后在文本获取字符的位置,用图片替换掉图片标签,这样对于支持英文来说,并没有什么影响.然后对于中文来说就是一个相当麻烦的事了,毕竟图文混排多用于游戏 ...
- ios图文混排
图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...
- Coretext实现图文混排及Gif图片播放
CoreText是iOS3.2推出的一套文字排版和渲染框架,可以实现图文混排,富文本显示等效果. CoreText中的几个重要的概念: CTFont CTFontCollection CTFontD ...
- 【iOS】使用CoreText实现图文混排
iOS没有现成的支持图文混排的控件,而要用多个基础控件组合拼成图文混排这样复杂的排版,是件很苦逼的事情.对此的解决方案有使用CoreText进行绘制,或者使用TextKit.本文主要讲解对于CoreT ...
- UITextView实现图文混排效果
用UITextView实现图文混排效果的展示,首先要禁用UITextView的编辑功能,将属性editable设置为NO 1.首先创建一个NSTextAttachment对象,这个对象有一个image ...
随机推荐
- 2021-04-23:TSP问题 有N个城市,任何两个城市之间的都有距离,任何一座城市到自己的距离都为0。所有点到点的距 离都存在一个N*N的二维数组matrix里,也就是整张图由邻接矩阵表示。现要求
2021-04-23:TSP问题 有N个城市,任何两个城市之间的都有距离,任何一座城市到自己的距离都为0.所有点到点的距 离都存在一个N*N的二维数组matrix里,也就是整张图由邻接矩阵表示.现要求 ...
- 2013年蓝桥杯C/C++大学A组省赛真题(振兴中华)
题目描述: 小明参加了学校的趣味运动会,其中的一个项目是:跳格子. 地上画着一些格子,每个格子里写一个字,如下所示: 从我做起振 我做起振兴 做起振兴中 起振兴中华 比赛时,先站在左上角的写着&quo ...
- RabbitMQ系列-概念及安装
1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送.缓存.接收,使得进程间能相互通信,是点对点的通信 而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不 ...
- mac -bash: ls: No such file or directory
再mac 输入ls 竟然提示我 如图其他到命令都不能用了??? 网上找了大半天.看见这种类似的很多,但是最后都不是我要的答案,最后没辙,注销用户,重新登陆,问题没有了,也不知道是不是mac的bug:有 ...
- Java中的金钱陷阱
前言 有多少小伙伴是被标题 骗 吸引进来的呢,我可不是标题党,今天的文章呢确实跟"金钱"有关系. 但是我们说的不是过度追求金钱而掉入陷阱,而是要说一说在Java程序中,各种跟金钱运 ...
- rust随笔
# 第二章 语言精要 好读书,不求甚解:每有会意,便欣然忘食. **动手,动手,动手!!!** ## 语句与表达式 Rust 中语法可以分成两大类:语句 statement 和表达式 expres ...
- docker构建FreeSWITCH编译环境及打包
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 Docker版本:23.0.6 FreeSWITCH这种比较复杂的系统,使用容器部署是比较方便的,今天 ...
- 深度学习中的循环神经网络”在Transformer中的应用
目录 深度学习中的"循环神经网络"在Transformer中的应用 背景介绍 文章目的 目标受众 技术原理及概念 基本概念解释 相关技术比较 实现步骤与流程 准备工作:环境配置与依 ...
- 【.Net/C#之ChatGPT开发系列】四、ChatGPT多KEY动态轮询,自动删除无效KEY
ChatGPT是一种基于Token数量计费的语言模型,它可以生成高质量的文本.然而,每个新账号只有一个有限的初始配额,用完后就需要付费才能继续使用.为此,我们可能存在使用多KEY的情况,并在每个KEY ...
- 手把手教你自定义自己SpringBoot Starter组件源码剖析
我们知道SpringBoot Starter也就是启动器.是SpringBoot组件化的一大优点.基于这个思想,基于这个思想SpringBoot 才变得非常强大,官方给我们提供很多开箱即用的启动器. ...