首页 > 系统相关 >Avalonia 实现聊天消息渲染、图文混排(支持Windows、Linux、信创国产OS)

Avalonia 实现聊天消息渲染、图文混排(支持Windows、Linux、信创国产OS)

时间:2023-08-21 15:47:13浏览次数:54  
标签:string 渲染 Windows void int 消息 图文混排 Linux null

    在实现即时通讯软件或聊天软件时,渲染文字表情、图文混排是一项非常繁琐的工作,再加上还要支持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,到时我会发给大家。  

 

标签:string,渲染,Windows,void,int,消息,图文混排,Linux,null
From: https://www.cnblogs.com/zhuweisky/p/17646170.html

相关文章

  • Linux ps命令
    一、ps命令简介ps命令全称为processstatus,它用于显示当前系统的进程状态。使用ps可以方便地查看进程的PID、内存占用、执行时间等信息,辅助我们对进程进行监控和管理。二、ps命令的功能作用1、查看进程执行状态ps可以显示每个进程的详细状态,常见的有:R-运行(Running)S-中断(......
  • Linux文件误删恢复
    在Linux系统中,误删除的文件是可以恢复的。一般Linux桌面环境都有回收站功能,类似于Windows系统中的回收站。如果你使用的是图形化界面,可以尝试在桌面环境的回收站或垃圾桶中找回误删除的文件。如果使用了rm-rf命令删除的,可以使用lsof命令等工具来处理。本文将介绍如何使用命令行和......
  • Linux设置开机启动
    1.建立一个sh文件tee/etc/init.d/myservice.sh<<EOF#!/bin/sh#此脚本用于启动和停止my_service服务。start(){echo"Startingmy_serviceservice..."/usr/bin/my_servicestartecho"my_serviceservicestartedsuccessfully."}stop(){e......
  • Linux/centos上如何配置管理samba服务器?
    (Linux/centos上如何配置管理samba服务器?)1samba服务相关知识samba服务器可使用户在异构网络操作系统之间进行文件系统共享;samba服务器提供了在Windows环境下共享Linux中用户目录的一个工具;在linux中安装samba后,只需在windows中做一些登陆即可访问。1.1SMB协议Windows系......
  • Linux/centos上如何配置管理samba服务器?
    (Linux/centos上如何配置管理samba服务器?)1samba服务相关知识samba服务器可使用户在异构网络操作系统之间进行文件系统共享;samba服务器提供了在Windows环境下共享Linux中用户目录的一个工具;在linux中安装samba后,只需在windows中做一些登陆即可访问。1.1SMB协议Windows系......
  • Linux基本命令(1)
    用type命令查看cd、ls、man、help、info、whatis、stat、passwd、mkdir、useradd命令类型并回答结果[root@localhost~]#typecdcd是shell内嵌[root@localhost~]#typelsls是`ls--color=auto'的别名[root@localhost~]#typemanman是/usr/bin/man[root@localho......
  • 在 Amazon Linux 2023 上托管 WordPress 博客
    以下步骤将帮助您在AmazonLinux2023实例上安装、配置和保护WordPress博客。本教程是很好的AmazonEC2入门教程,因为您可以完全控制托管您WordPress博客的Web服务器,这对传统的托管服务来说并不是一个典型的方案。您负责更新软件包并为您的服务器维护安全补丁。对于不需......
  • linux下mysql安装
    查看mysql版本(root用户)#mysql-V官网下载rpm包(MySQLCommunityServer8.0.16)下载地址:https://dev.mysql.com/downloads/mysql/在线下载rpm安装包#cd/usr/local/src#wgethttps://dev.mysql.com/get/mysql80-community-r......
  • Linux init详解 (0,1,2,3,4,5,6)
    #0-停机(千万不能把initdefault设置为0)#1-单用户模式#2-多用户,没有NFS#3-完全多用户模式(标准的运行级)#4-没有用到#5-X11(xwindow)#6-重新启动(千万不要把initdefault设置为6)......
  • 在f1c100s芯片上移植spi网卡enc28j60的linux驱动
    前言我个人与全志的芯片颇有故事。在我还是一个不懂事的高中生时,我看到荔枝派的官方文档,顿时被这小小的板子给吸引住。点开文档的初见:荔枝派Nano(下面简称Nano)是一款精致迷你的Arm9核心板/开发板,可用于初学者学习linux或者商用于产品开发。Nano在与SD卡相当的尺寸上(25.4*3......