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