前言
在移动应用开发中,富文本编辑功能是实现用户复杂内容输入的核心需求之一。HarmonyOS 的 RichEditor 组件凭借其强大的图文混排能力和灵活的交互设计,成为开发者构建评论系统、笔记、消息应用等场景的首选工具。本文将从基础配置到进阶功能,结合代码示例与最佳实践,全面解析 RichEditor 的使用技巧。
一、RichEditor 基础:创建与初始化
1.1 两种创建方式
RichEditor 支持两种初始化方式,适用于不同场景:
//方式一:动态构建内容 通过 RichEditorOptions 动态添加文本和样式,适用于实时编辑场景(如评论区)。// 创建控制器与配置controller: RichEditorController = new RichEditorController();options: RichEditorOptions = { controller: this.controller };// 初始化组件并添加内容RichEditor(this.options).onReady(() => { this.controller.addTextSpan('动态构建的文本', { style: { fontColor: Color.Black, fontSize: 15 } });});//方式二:属性字符串预定义 使用 MutableStyledString 预定义带样式的字符串,适合静态内容展示(如公告板)。mutableStyledString: MutableStyledString = new MutableStyledString("预定义样式文本", [{ start: 0, length: 4, styledKey: StyledStringKey.FONT, styledValue: this.fontStyle }]);RichEditor({ controller: this.controller }).onReady(() => { this.controller.setStyledString(this.mutableStyledString);});
二、核心功能配置
2.1 属性设置
//自定义选择菜单 通过 bindSelectionMenu 绑定长按菜单,支持添加剪切、复制等操作:RichEditor(this.options).bindSelectionMenu(RichEditorSpanType.TEXT, this.SystemMenu, ResponseType.LongPress, { onDisappear: () => { /* 菜单关闭回调 */ }});@BuilderSystemMenu() { Menu() { MenuItem({ content: "复制", startIcon: this.theme.copyIcon }); MenuItem({ content: "粘贴", startIcon: this.theme.pasteIcon });}}//光标与占位符 设置光标颜色与无输入时的提示文本:RichEditor(this.options).caretColor(Color.Orange).placeholder("请输入内容...", { fontColor: Color.Gray, fontSize: 15 });
2.2 事件监听
//RichEditor 提供丰富的事件回调,覆盖编辑全生命周期://内容变化监听 .onWillChange((value) => { /* 变化前拦截 */ }).onDidChange((before, after) => { /* 变化后响应 */ });//输入法交互 .aboutToIMEInput((value) => { /* 输入前校验 */ }).onIMEInputComplete((result) => { /* 输入完成处理 */ });//剪贴板操作 .onPaste(() => { console.log("粘贴事件触发"); }).onCut(() => { console.log("剪切事件触发"); });
三、进阶功能与最佳实践
3.1 样式预设与动态切换
通过 setTypingStyle 预设输入时的默认样式,用户输入时自动应用:
Button('设置为粉色斜体').onClick(() => { this.controller.setTypingStyle({ fontColor: Color.Pink, fontStyle: FontStyle.Italic, decoration: { type: TextDecorationType.Underline } });});
3.2 安全区域与动态布局
针对折叠屏或分屏设备,设置组件的安全区域适配:
RichEditor(this.options).applySafeArea({ edges: [SafeAreaEdge.TOP, SafeAreaEdge.BOTTOM] });
3.3 性能优化建议
- 避免频繁更新大段文本:使用 MutableStyledString 预渲染静态内容。
- 异步处理回调:在 onDidChange 中执行耗时操作时,启用异步任务防止界面卡顿。
四、实战示例:构建一个支持图文混排的评论框
// 1. 初始化组件controller: RichEditorController = new RichEditorController();options: RichEditorOptions = { controller: this.controller };// 2. 配置基础属性RichEditor(this.options).placeholder("写下你的评论...", { fontColor: Color.Gray }).caretColor(Color.Blue).bindSelectionMenu(RichEditorSpanType.TEXT, this.CustomMenu, ResponseType.LongPress).onPaste(() => { /* 处理图片粘贴逻辑 */ });// 3. 添加交互事件Button('插入图片').onClick(() => { this.controller.insertImage("image.png", { width: 100, height: 100 });});// 4. 自定义菜单@BuilderCustomMenu() { Menu() { MenuItem({ content: "@用户", startIcon: $r('app.media.mention_icon') }); MenuItem({ content: "插入表情", startIcon: $r('app.media.emoji_icon') });}}
五、注意事项与常见问题
- 版本兼容性:onWillChange 和 onDidChange 回调不适用于属性字符串构建的组件。
- 键盘遮挡问题:自定义菜单高度过高时,建议嵌套 Scroll 组件。
- 新增特性:HarmonyOS 5.0.2 Beta 1 新增鼠标悬停(onHover)和双击事件(onDoubleClick)支持。
下 期案例预告:
-
wx表情面板完整效果实现
-
-
长按气泡效果
-
图文表情复制&粘贴
-
控制菜单
-
表情动态插入
-
中文->解析表情([开心]->😊)
-
-
效果预览: