1# 富文本(RichEditor)
2RichEditor是支持图文混排和文本交互式编辑的组件,通常用于响应用户对图文混合内容的输入操作,例如可以输入图文的评论区。具体用法参考[RichEditor](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md)。
3
4## 创建RichEditor组件
5开发者可以创建[不使用属性字符串](#创建不使用属性字符串构建的richeditor组件)和[使用属性字符串](#创建使用属性字符串构建的richeditor组件)构建的RichEditor组件。
6
7### 创建不使用属性字符串构建的RichEditor组件
8使用RichEditor(value: [RichEditorOptions](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#richeditoroptions))接口创建非属性字符串构建的RichEditor组件,一般用于展示简单的图文信息,例如展示联系人的信息,也可以用于内容要求格式统一的场景,例如一些代码编辑器。
9
10```ts
11controller: RichEditorController = new RichEditorController();
12options: RichEditorOptions = { controller: this.controller };
13
14RichEditor(this.options)
15    .onReady(() => {
16        this.controller.addTextSpan('创建不使用属性字符串构建的RichEditor组件。', {
17            style: {
18                fontColor: Color.Black,
19                fontSize: 15
20            }
21        })
22    })
23```
24![alt text](figures/richeditor_image_options.gif)
25
26### 创建使用属性字符串构建的RichEditor组件
27使用RichEditor(options: [RichEditorStyledStringOptions](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#richeditorstyledstringoptions12))接口创建属性字符串构建的RichEditor组件,是基于属性字符串([StyledString/MutableStyledString](arkts-styled-string.md))构建的,通常应用于需要界面美化和内容强调的场景,通过设置重要功能特性文本的样式来突出显示,从而吸引用户注意。
28
29相较于不使用属性字符串构建的RichEditor组件,此种方式提供了多种文本修改方式,包括调整字号、添加字体颜色、使文本具备可点击性,以及支持自定义文本绘制等。此外,此种方式还提供了多种类型样式对象,覆盖了各种常见的文本样式格式,如文本装饰线样式、文本行高样式、文本阴影样式等。
30
31```ts
32fontStyle: TextStyle = new TextStyle({
33    fontColor: Color.Pink
34  });
35//自定义字体样式
36
37mutableStyledString: MutableStyledString = new MutableStyledString("创建使用属性字符串构建的RichEditor组件。",
38    [{
39        start: 0,
40        length: 5,
41        styledKey: StyledStringKey.FONT,
42        styledValue: this.fontStyle
43    }]);
44//创建属性字符串
45
46controller: RichEditorStyledStringController = new RichEditorStyledStringController();
47options: RichEditorStyledStringOptions = {controller: this.controller};
48
49RichEditor(this.options)
50    .onReady(() => {
51        this.controller.setStyledString(this.mutableStyledString);
52    })
53```
54![alt text](figures/richeditor_image_stylestringoptions.gif)
55
56## 设置属性
57
58### 设置自定义选择菜单
59通过[bindSelectionMenu](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#bindselectionmenu)设置自定义选择菜单。
60
61组件原本具有默认的文本选择菜单,包含复制、剪切和全选的功能。用户可使用该属性设定自定义菜单,例如翻译英文、加粗字体等丰富的菜单功能。
62
63当自定义菜单超长时,建议内部嵌套Scroll组件使用,避免键盘被遮挡。
64
65```ts
66export interface SelectionMenuTheme {
67  imageSize: number;
68  buttonSize: number;
69  menuSpacing: number;
70  editorOptionMargin: number;
71  expandedOptionPadding: number;
72  defaultMenuWidth: number;
73  imageFillColor: Resource;
74  backGroundColor: Resource;
75  iconBorderRadius: Resource;
76  containerBorderRadius: Resource;
77  cutIcon: Resource;
78  copyIcon: Resource;
79  pasteIcon: Resource;
80  selectAllIcon: Resource;
81  shareIcon: Resource;
82  translateIcon: Resource;
83  searchIcon: Resource;
84  arrowDownIcon: Resource;
85  iconPanelShadowStyle: ShadowStyle;
86  iconFocusBorderColor: Resource;
87}
88
89export const defaultTheme: SelectionMenuTheme = {
90  imageSize: 24,
91  buttonSize: 48,
92  menuSpacing: 8,
93  editorOptionMargin: 1,
94  expandedOptionPadding: 3,
95  defaultMenuWidth: 256,
96  imageFillColor: $r('sys.color.ohos_id_color_primary'),
97  backGroundColor: $r('sys.color.ohos_id_color_dialog_bg'),
98  iconBorderRadius: $r('sys.float.ohos_id_corner_radius_default_m'),
99  containerBorderRadius: $r('sys.float.ohos_id_corner_radius_card'),
100  cutIcon: $r("sys.media.ohos_ic_public_cut"),
101  copyIcon: $r("sys.media.ohos_ic_public_copy"),
102  pasteIcon: $r("sys.media.ohos_ic_public_paste"),
103  selectAllIcon: $r("sys.media.ohos_ic_public_select_all"),
104  shareIcon: $r("sys.media.ohos_ic_public_share"),
105  translateIcon: $r("sys.media.ohos_ic_public_translate_c2e"),
106  searchIcon: $r("sys.media.ohos_ic_public_search_filled"),
107  arrowDownIcon: $r("sys.media.ohos_ic_public_arrow_down"),
108  iconPanelShadowStyle: ShadowStyle.OUTER_DEFAULT_MD,
109  iconFocusBorderColor: $r('sys.color.ohos_id_color_focused_outline'),
110}
111//定义startIcon信息
112
113RichEditor(this.options)
114.onReady(() => {
115    this.controller.addTextSpan('组件设置了自定义菜单,长按可触发。', {
116      style: {
117        fontColor: Color.Black,
118        fontSize: 18
119      }
120    })
121  })
122  .bindSelectionMenu(RichEditorSpanType.TEXT, this.SystemMenu, ResponseType.LongPress, {
123    onDisappear: () => {
124      this.sliderShow = false
125    }
126  })//绑定自定义菜单
127  .width(300)
128  .height(300)
129
130@Builder
131  SystemMenu() {
132    Column() {
133      Menu() {
134        if (this.controller) {
135          MenuItemGroup() {
136            MenuItem({
137              startIcon: this.theme.cutIcon,
138              content: "剪切",
139              labelInfo: "Ctrl+X",
140            })
141            MenuItem({
142              startIcon: this.theme.copyIcon,
143              content: "复制",
144              labelInfo: "Ctrl+C"
145            })
146            MenuItem({
147              startIcon: this.theme.pasteIcon,
148              content: "粘贴",
149              labelInfo: "Ctrl+V"
150            })
151          }
152        }
153      }
154      .radius(this.theme.containerBorderRadius)
155      .clip(true)
156      .backgroundColor(Color.White)
157      .width(this.theme.defaultMenuWidth)
158    }
159    .width(this.theme.defaultMenuWidth)
160  }
161```
162
163![alt text](figures/richeditor_image_bindselectionmenu.gif)
164
165### 设置输入框光标、手柄颜色
166通过[caretColor](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#caretcolor12)设置输入框光标、手柄颜色。
167
168设置不同颜色的光标和手柄可以提高视觉辨识度,特别是在包含多个输入区域或不同类型内容输入区域的复杂界面中,独特的光标颜色能协助用户迅速定位当前操作的输入区域。这一特性同样适用于需要标示特殊功能或状态的输入框,比如密码输入框。
169
170```ts
171RichEditor(this.options)
172  .onReady(() => {
173    this.controller.addTextSpan('组件设置了光标手柄颜色。', {
174      style: {
175        fontColor: Color.Black,
176        fontSize: 15
177      }
178    })
179  })
180  .caretColor(Color.Orange)
181  .width(300)
182  .height(300)
183```
184
185![alt text](figures/richeditor_image_caretcolor.gif)
186
187### 设置无输入时的提示文本
188通过[placeholder](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#placeholder12)设置无输入时的提示文本。
189
190例如,在用户登录界面采用提示文本,有助于用户区分用户名与密码的输入框。又如,在文本编辑框中,运用提示文本明确输入要求,如“限输入100字以内”,以此指导用户正确操作。
191
192```ts
193RichEditor(this.options)
194    .placeholder("此处为提示文本...", {
195        fontColor: Color.Gray,
196        font: {
197            size: 15,
198            weight: FontWeight.Normal,
199            family: "HarmonyOS Sans",
200            style: FontStyle.Normal
201        }
202    })
203    .width(300)
204    .height(300)
205```
206
207![alt text](figures/richeditor_image_placeholder.gif)
208
209更多属性使用请参考[RichEditor属性](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#属性)。
210
211## 添加事件
212
213### 添加组件初始化完成后可触发的回调
214通过[onReady](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#onready)来添加组件初始化完成后可触发的回调。
215
216该回调可在组件初始化后,有效地展示包括图文和表情在内的丰富内容。例如,利用富文本组件展示新闻时,此回调可触发从服务器获取图文数据的操作。随后,将获取到的数据填充至组件中,确保组件在初始化完成后能够迅速在页面上呈现完整的新闻内容。
217
218```ts
219RichEditor(this.options)
220    .onReady(() => {
221        this.controller.addTextSpan('onReady回调内容是组件内预置文本。', {
222            style: {
223                fontColor: Color.Black,
224                fontSize: 15
225            }
226        })
227    })
228```
229
230![alt text](figures/richeditor_image_onReady.gif)
231
232### 添加组件内容被选中时可触发的回调
233通过[onSelect](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#onselect)来添加组件内容被选中时可触发的回调。
234
235该回调可在文本选择后增强操作体验。例如,在选中文本后,可在回调中触发弹出菜单,以便用户进行文本样式的修改。或者对选中的文本进行内容分析和处理,为用户提供输入建议,从而提升文本编辑的效率和便捷性。
236
237触发回调有两种方式:一是通过鼠标左键选择,即按下左键进行选择,然后在松开左键时触发回调。二是通过手指触摸选择,即用手指进行选择,然后在松开手指时触发回调。
238
239```ts
240RichEditor(this.options)
241    .onReady(() => {
242        this.controller.addTextSpan('选中此处文本,触发onselect回调。', {
243            style: {
244                fontColor: Color.Black,
245                fontSize: 15
246            }
247        })
248    })
249    .onSelect((value: RichEditorSelection) => {
250        this.controller1.addTextSpan(JSON.stringify(value), {
251            style: {
252                fontColor: Color.Gray,
253                fontSize: 10
254            }
255        })
256    })
257    .width(300)
258    .height(50)
259Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)
260RichEditor(this.options1)
261    .width(300)
262    .height(70)
263```
264
265![alt text](figures/richeditor_image_onSelect.gif)
266
267### 添加图文变化前和图文变化后可触发的回调
268通过[onWillChange](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#onwillchange12)添加图文变化前可触发的回调。此回调适用于用户实时数据校验与提醒,例如在用户输入文本时,可在回调内实现对输入内容的检测,若检测到敏感词汇,应立即弹出提示框。此外,它还适用于实时字数统计与限制,对于有字数限制的输入场景,可在回调中实时统计用户输入的字数,并在接近字数上限时提供相应的提示。
269
270通过[onDidChange](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#ondidchange12)添加图文变化后可触发的回调。此回调适用于内容保存与同步,例如在用户完成内容编辑后,可使用该回调自动将最新内容保存至本地或同步至服务器。此外,它还适用于内容状态更新与渲染,例如在待办事项列表应用中,用户编辑富文本格式的待办事项描述后,可使用该回调更新待办事项在列表中的显示样式。
271
272使用[RichEditorStyledStringOptions](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#richeditorstyledstringoptions12)构建的RichEditor组件不支持上述两种回调。
273
274```ts
275RichEditor(this.options)
276    .onReady(() => {
277        this.controller.addTextSpan('组件内图文变化前,触发回调。\n图文变化后,触发回调。', {
278            style: {
279                fontColor: Color.Black,
280                fontSize: 15
281            }
282        })
283    })
284    .onWillChange((value: RichEditorChangeValue) => {
285        this.controller1.addTextSpan('组件内图文变化前,触发回调:\n' + JSON.stringify(value), {
286            style: {
287                fontColor: Color.Gray,
288                fontSize: 10
289            }
290        })
291        return true;
292    })
293    .onDidChange((rangeBefore: TextRange, rangeAfter: TextRange) => {
294        this.controller1.addTextSpan('\n图文变化后,触发回调:\nrangeBefore:' + JSON.stringify(rangeBefore) + '\nrangeAfter:' + JSON.stringify(rangeBefore), {
295            style: {
296                fontColor: Color.Gray,
297                fontSize: 10
298            }
299        })
300        return true;
301    })
302    .width(300)
303    .height(50)
304Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)
305RichEditor(this.options1)
306    .width(300)
307    .height(70)
308```
309
310![alt text](figures/richeditor_image_ondid.gif)
311
312### 添加输入法输入内容前和完成输入后可触发的回调
313在添加输入法输入内容前,可以通过[aboutToIMEInput](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#abouttoimeinput)触发回调。在输入法完成输入后,可以通过[onIMEInputComplete](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#onimeinputcomplete)触发回调。
314
315这两种回调机制适用于智能输入辅助。例如:在用户开始输入文本前,利用回调进行词汇联想的提供,在用户完成输入后,利用回调执行自动化纠错或格式转换。
316
317使用[RichEditorStyledStringOptions](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#richeditorstyledstringoptions12)构建的组件并不支持上述两种回调功能。
318
319```ts
320RichEditor(this.options)
321          .onReady(() => {
322            this.controller.addTextSpan('输入法输入内容前,触发回调。\n输入法完成输入后,触发回调。' , {
323              style: {
324                fontColor: Color.Black,
325                fontSize: 15
326              }
327            })
328          })
329          .aboutToIMEInput((value: RichEditorInsertValue) => {
330            this.controller1.addTextSpan('输入法输入内容前,触发回调:\n'+JSON.stringify(value), {
331              style: {
332                fontColor: Color.Gray,
333                fontSize: 10
334              }
335            })
336            return true;
337          })
338          .onIMEInputComplete((value: RichEditorTextSpanResult) => {
339            this.controller1.addTextSpan('输入法完成输入后,触发回调:\n'+ JSON.stringify(value), {
340              style: {
341                fontColor: Color.Gray,
342                fontSize: 10
343              }
344            })
345            return true;
346          })
347          .width(300)
348          .height(50)
349Text('查看回调内容:').fontSize(10).fontColor(Color.Gray).width(300)
350RichEditor(this.options1)
351    .width(300)
352    .height(70)
353```
354
355![alt text](figures/richeditor_image_aboutToIMEInput2.0.gif)
356
357### 添加完成粘贴前可触发的回调
358通过[onPaste](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#onpaste11)添加完成粘贴前可触发的回调。
359
360此回调适用于内容格式的处理。例如,当用户复制包含HTML标签的文本时,可在回调中编写代码,将其转换为富文本组件所支持的格式,同时剔除不必要的标签或仅保留纯文本内容。
361
362由于组件默认的粘贴行为仅限于纯文本,无法处理图片粘贴,开发者可利用此方法实现图文并茂的粘贴功能,从而替代组件原有的粘贴行为。
363
364```ts
365RichEditor(this.options)
366    .onReady(() => {
367        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {
368            style: {
369                fontColor: Color.Black,
370                fontSize: 15
371            }
372        })
373    })
374    .onPaste(() => {
375        this.controller1.addTextSpan('触发onPaste回调\n', {
376            style: {
377                fontColor: Color.Gray,
378                fontSize: 10
379            }
380        })
381    })
382    .width(300)
383    .height(70)
384```
385
386### 添加完成剪切前可触发的回调
387通过[onCut](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#oncut12)添加完成剪切前可触发的回调。
388
389此回调功能适用于数据处理与存储,例如,当用户从富文本组件中剪切内容时,可在回调中执行将被剪切的内容进行临时存储的操作,确保后续的粘贴操作能够准确无误地还原内容。
390
391由于组件默认的剪切行为仅限于纯文本,无法处理图片剪切,开发者可利用此方法实现图文并茂的剪切功能,从而替代组件原有的剪切行为。
392
393```ts
394RichEditor(this.options)
395    .onReady(() => {
396        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {
397            style: {
398                fontColor: Color.Black,
399                fontSize: 15
400            }
401        })
402    })
403    .onCut(() => {
404        this.controller1.addTextSpan('触发onCut回调\n', {
405            style: {
406                fontColor: Color.Gray,
407                fontSize: 10
408            }
409        })
410    })
411    .width(300)
412    .height(70)
413```
414
415### 添加完成复制前可触发的回调
416通过[onCopy](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#oncopy12)添加完成复制前可触发的回调。
417
418此回调适用于内容的备份与共享,例如在用户复制内容时,可在回调中执行以下操作:将复制的内容及其格式信息保存至本地备份文件夹,或自动生成一段包含复制内容及产品购买链接的分享文案,以方便用户进行粘贴和分享。
419
420由于组件默认的复制行为仅限于纯文本,无法处理图片复制,开发者可利用此方法实现图文并茂的复制功能,从而替代组件原有的复制行为。
421
422```ts
423RichEditor(this.options)
424    .onReady(() => {
425        this.controller.addTextSpan('对此处文本进行复制粘贴操作可触发对应回调。', {
426            style: {
427                fontColor: Color.Black,
428                fontSize: 15
429            }
430        })
431    })
432    .onCopy(() => {
433        this.controller1.addTextSpan('触发onCopy回调\n', {
434            style: {
435                fontColor: Color.Gray,
436                fontSize: 10
437            }
438        })
439    })
440    .width(300)
441    .height(70)
442```
443
444![alt text](figures/richeditor_image_oncut_paste_copy.gif)
445
446
447更多事件使用请参考[RichEditor事件](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#事件)。
448
449## 设置用户预设的样式
450通过[setTypingStyle](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#settypingstyle11)设置用户预设的样式。
451
452此接口可用于个性化的写作体验,例如可以使用此接口让输入的不同层级标题自动应用相应格式(如一级、二级标题)。
453
454```ts
455RichEditor(this.options)
456    .onReady(() => {
457        this.controller.addTextSpan('点击按钮,改变组件预设样式。', {
458            style: {
459                fontColor: Color.Black,
460                fontSize: 15
461            }
462        })
463    })
464    .width(300)
465    .height(60)
466Button('setTypingStyle', {
467        buttonStyle: ButtonStyleMode.NORMAL
468    })
469    .height(30)
470    .fontSize(13)
471    .onClick(() => {
472        this.controller.setTypingStyle({
473            fontWeight: 'medium',
474            fontColor: Color.Pink,
475            fontSize: 15,
476            fontStyle: FontStyle.Italic,
477            decoration: {
478                type: TextDecorationType.Underline,
479                color: Color.Gray
480            }
481        })
482    })
483```
484
485![alt text](figures/richeditor_image_setTypingStyle.gif)
486
487## 设置组件内的内容选中时部分背板高亮
488通过[setSelection](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#setselection11)设置组件内的内容选中时部分背板高亮。
489
490此接口可用与文本聚焦效果,例如当用户点击某个文本段落的标题或摘要时,可通过该接口自动选中并高亮出对应正文内容。
491
492当组件内未获焦出现光标时,调用该接口不产生选中效果。
493
494```ts
495RichEditor(this.options)
496    .onReady(() => {
497        this.controller.addTextSpan('点击按钮在此处选中0-2位置的文本。', {
498            style: {
499                fontColor: Color.Black,
500                fontSize: 15
501            }
502        })
503    })
504    .width(300)
505    .height(60)
506Button('setSelection(0,2)', {
507        buttonStyle: ButtonStyleMode.NORMAL
508    })
509    .height(30)
510    .fontSize(13)
511    .onClick(() => {
512        this.controller.setSelection(0, 2)
513    })
514```
515
516![alt text](figures/richeditor_image_set_selection.gif)
517
518## 添加文本内容
519除了直接在组件内输入内容,也可以通过[addTextSpan](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#addtextspan)添加文本内容。
520
521此接口可以实现文本样式多样化,例如需要创建混合样式文本。
522
523如果组件是获焦状态,有光标在闪烁,那么通过addTextSpan添加文本内容后,光标位置会更新,在新添加文本内容的右侧闪烁。
524
525```ts
526RichEditor(this.options)
527    .onReady(() => {
528        this.controller.addTextSpan('点击按钮在此处添加text。', {
529            style: {
530                fontColor: Color.Black,
531                fontSize: 15
532            }
533        })
534    })
535    .width(300)
536    .height(100)
537Button('addTextSpan', {
538        buttonStyle: ButtonStyleMode.NORMAL
539    })
540    .height(30)
541    .fontSize(13)
542    .onClick(() => {
543        this.controller.addTextSpan('新添加一段文字。')
544    })
545```
546
547![alt text](figures/richeditor_image_add_text.gif)
548
549## 添加图片内容
550通过[addImageSpan](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#addimagespan)添加图片内容。
551
552此接口可用于内容丰富与可视化展示,例如在新闻中加入图片,在文档中加入数据可视化图形等。
553
554如果组件是获焦状态,有光标在闪烁,那么通过addImageSpan添加图片内容后,光标位置会更新,在新添加图片内容的右侧闪烁。
555
556```ts
557RichEditor(this.options)
558    .onReady(() => {
559        this.controller.addTextSpan('点击按钮在此处添加image。', {
560            style: {
561                fontColor: Color.Black,
562                fontSize: 15
563            }
564        })
565    })
566    .width(300)
567    .height(100)
568Button('addImageSpan', {
569        buttonStyle: ButtonStyleMode.NORMAL
570    })
571    .height(30)
572    .fontSize(13)
573    .onClick(() => {
574        this.controller.addImageSpan($r("app.media.startIcon"), {
575            imageStyle: {
576                size: ["57px", "57px"]
577            }
578        })
579    })
580```
581
582![alt text](figures/richeditor_image_add_image.gif)
583
584## 添加@Builder装饰器修饰的内容
585通过[addBuilderSpan](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#addbuilderspan11)添加@Builder装饰器修饰的内容。
586
587此接口可用于自定义复杂组件的嵌入,例如在组件内加入自定义图表。
588
589该接口内可通过[RichEditorBuilderSpanOptions](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#richeditorbuilderspanoptions11)设置在组件中添加builder的位置,省略或者为异常值时,则添加builder到所有内容的最后位置。
590
591```ts
592@Builder
593TextBuilder() {
594    Row() {
595            Image($r('app.media.startIcon')).width(50).height(50).margin(16)
596            Column() {
597                Text("文本文档.txt").fontWeight(FontWeight.Bold).fontSize(16)
598                Text("123.45KB").fontColor('#8a8a8a').fontSize(12)
599            }.alignItems(HorizontalAlign.Start)
600        }.backgroundColor('#f4f4f4')
601        .borderRadius("20")
602        .width(220)
603}
604
605Button('addBuilderSpan', {
606        buttonStyle: ButtonStyleMode.NORMAL
607    })
608    .height(30)
609    .fontSize(13)
610    .onClick(() => {
611        this.my_builder = () => {
612            this.TextBuilder()
613        }
614        this.controller.addBuilderSpan(this.my_builder)
615    })
616```
617![alt text](figures/richeditor_image_add_builder_span2.0.gif)
618
619## 添加SymbolSpan内容
620可通过[addSymbolSpan](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#addsymbolspan11)添加Symbol内容。此接口可用于特殊符号添加与展示,例如在编辑学术论文时,此接口可用于添加各种数学符号。
621
622添加Symbol内容时,如果组件内有光标闪烁,则插入Symbol后光标位置更新为新插入Symbol的右侧。
623Symbol内容暂不支持手势、复制、拖拽处理。
624
625```ts
626RichEditor(this.options)
627    .onReady(() => {
628        this.controller.addTextSpan('点击按钮在此处添加symbol。', {
629            style: {
630                fontColor: Color.Black,
631                fontSize: 15
632            }
633        })
634    })
635    .width(300)
636    .height(100)
637Button('addSymbolSpan', {
638        buttonStyle: ButtonStyleMode.NORMAL
639    })
640    .height(30)
641    .fontSize(13)
642    .onClick(() => {
643        this.controller.addSymbolSpan($r("sys.symbol.basketball_fill"), {
644            style: {
645                fontSize: 30
646            }
647        })
648    })
649```
650![alt text](figures/richeditor_image_add_SymbolSpan.gif)
651
652## 获取组件内图文信息
653可通过[getSpans](../reference/apis-arkui/arkui-ts/ts-basic-components-richeditor.md#getspans)获取组件内所有图文内容的信息,包括图文的内容、id、样式、位置等信息。获取内容位置信息后,可对指定范围内容进行样式的更新。
654
655此接口适用于已有的内容样式获取与检查,例如在模板应用场景下,可利用此接口获取文本样式。此外,它还适用于内容解析与处理,例如在文本分析应用中,此接口能够获取特定范围内的文本信息。
656
657```ts
658controller: RichEditorController = new RichEditorController();
659options: RichEditorOptions = { controller: this.controller }
660controller1: RichEditorController = new RichEditorController();
661options1: RichEditorOptions = { controller: this.controller1 }
662//定义两个富文本组件
663
664RichEditor(this.options)
665    .onReady(() => {
666        this.controller.addTextSpan('点击按钮获取此处span信息。', {
667            style: {
668                fontColor: Color.Black,
669                fontSize: 15
670            }
671        })
672    })
673    .width(300)
674    .height(50)
675Text('查看getSpans返回值:').fontSize(10).fontColor(Color.Gray).width(300)
676RichEditor(this.options1)
677    .width(300)
678    .height(50)
679Button('getSpans', {
680        buttonStyle: ButtonStyleMode.NORMAL
681    })
682    .height(30)
683    .fontSize(13)
684    .onClick(() => {
685        this.controller1.addTextSpan(JSON.stringify(this.controller.getSpans()), {
686            style: {
687                fontColor: Color.Gray,
688                fontSize: 10
689            }
690        })
691
692    })
693```
694![alt text](figures/richeditor_image_getspan.gif)
695<!--RP1--><!--RP1End-->