本示例主要介绍如何在聊天信息中加入表情图片。通过使用CustomDialog创建表情键盘对话框,使用RichEdit接收所选表情的热键字符串,在发送信息时将热键转换为图片后显示在Richtext的聊天信息框中。
效果图预览
使用说明
- 进入页面,在底部输入框中输入文字,点击输入框右边的表情图片按钮弹出表情键盘,在表情键盘中选择表情图片后点击发送,在聊天对话框中会显示聊天文字以及表情。
实现思路
- 在CustomDialog中通过Grid创建表情键盘,选中表情图片后,将表情的热键添加到输入框中。源码参考CustomFaceDialog.ets
Grid() { // TODO: 性能知识点:使用ForEach组件循环渲染数据 ForEach(EmojiData, (item: EmojiModel) => { GridItem() { Image(item.imgSrc) .width(FaceGridConstants.EMOJI_IMAGE_SIZE) .height(FaceGridConstants.EMOJI_IMAGE_SIZE) .onClick(() => { // TODO 知识点:将表情热键添加到输入框中 this.controller.addImageSpan(item.imgSrc, { imageStyle: { size: [this.imageSize, this.imageSize], verticalAlign: ImageSpanAlignment.CENTER } }); }) } }) } .maxCount(GRID_MAX_COUNT)
- 点击发送时,通过图片信息前缀(resource:)以及后缀(.png)循环搜索,将聊天信息中的表情资源解析为html的image标签来显示表情图片。源码参考ChatWithExpression.ets
const EMOJI_RESOURCE: string = 'resource:'; // 资源前缀 (资源图片 resource://RAWFILE/01.png) const EMOJI_SUFFIX: string = '.png'; // 资源图片后缀 // TODO 知识点:循环解析聊天信息中的表情图片 let pos: number = strMessage.indexOf(EMOJI_RESOURCE); while (pos !== -1) { // 从pos后面找到.png所在位置 const posPng = strMessage.indexOf(EMOJI_SUFFIX, pos); // 获取信息表情前面部分文字 strContent += strMessage.substring(0, pos); if (posPng !== -1) { expressionNum += 1; // 获取表情资源 const imgRes: string = strMessage.substring(pos, posPng + EMOJI_SUFFIX.length); strContent += EMOJI_RES_PREFIX; strContent += imgRes; strContent += EMOJI_MSG_SUFFIX_1; strContent += this.msgFontSize.toString(); strContent += EMOJI_MSG_SUFFIX_2; strContent += this.msgFontSize.toString(); strContent += EMOJI_MSG_SUFFIX_3; // 信息重新初始化为表情后面部分 strMessage = strMessage.substring(posPng + EMOJI_SUFFIX.length); } else { // 没匹配到.png strContent += EMOJI_RESOURCE; strMessage = strMessage.substring(pos + EMOJI_RESOURCE.length); } pos = strMessage.indexOf(EMOJI_RESOURCE); }
高性能知识点
本示例使用了LazyForEach进行数据懒加载,同时搭配组件复用能力以达到性能最优效果。
工程结构&模块类型
chatwithexpression // har类型
|---view
| |---ChatWithExpression.ets // 视图层-表情聊天界面
|---constants
| |---ChatConstants.ets // 常量
|---model
| |---Emoji.ets // 表情资源
| |---Message.ets // 消息结构
| |---BasicDataSource.ets // 数据类型文件
|---components
| |---CustomFaceDialog.ets // 表情键盘
模块依赖
本实例依赖动态路由模块实现页面的动态加载。
本实例依赖har包-common库中日志打印模块进行日志打印。
最后
有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
希望这一份鸿蒙学习资料能够给大家带来帮助,有需要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙(HarmonyOS NEXT)最新学习路线
-
HarmonOS基础技能
- HarmonOS就业必备技能
- HarmonOS多媒体技术
- 鸿蒙NaPi组件进阶
- HarmonOS高级技能
- 初识HarmonOS内核
- 实战就业级设备开发
有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,内容包含:ArkTS、ArkUI、Web开发、应用模型、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门教学视频》
《鸿蒙生态应用开发V2.0白皮书》
《鸿蒙 (OpenHarmony)开发基础到实战手册》
OpenHarmony北向、南向开发环境搭建
《鸿蒙开发基础》
- ArkTS语言
- 安装DevEco Studio
- 运用你的第一个ArkTS应用
- ArkUI声明式UI开发
- .……
《鸿蒙开发进阶》
- Stage模型入门
- 网络管理
- 数据管理
- 电话服务
- 分布式应用开发
- 通知与窗口管理
- 多媒体技术
- 安全技能
- 任务管理
- WebGL
- 国际化开发
- 应用测试
- DFX面向未来设计
- 鸿蒙系统移植和裁剪定制
- ……
《鸿蒙进阶实战》
- ArkTS实践
- UIAbility应用
- 网络案例
- ……
获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结
总的来说,华为鸿蒙不再兼容安卓,对中年程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,他们才能在这个变革的时代中立于不败之地。