鸿蒙应用示例:实现文本高亮与自动换行

饭宝  论坛元老 | 2025-1-14 17:00:36 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1014|帖子 1014|积分 3042

在设计应用界面时,我们经常需要对某些重要的文本进行高亮表现,以引起用户的注意。同时,在一些场景中,我们需要确保长文本可以或许自动换行,以顺应差别的屏幕尺寸和布局需求。本文将通过两个示例,分别展示如安在HarmonyOS应用中实现这些功能。
【示例一】文本高亮表现

  1. @Entry
  2. @Component
  3. struct Page01 {
  4.   @State originalText: string = '混沌未分天地乱,茫茫渺渺无人见。自从盘古破鸿蒙,开辟从兹清浊辨。';
  5.   @State highlightKeyword: string = '鸿蒙'; // 需要高亮显示的关键字
  6.   @State highlightedSegments: string[] = [];
  7.   // 分割原始文本并保留关键字
  8.   private splitAndHighlight(text: string, keyword: string): string[] {
  9.     let segments: string[] = [];
  10.     let lastMatchEnd: number = 0;
  11.     while (true) {
  12.       const matchIndex = text.indexOf(keyword, lastMatchEnd);
  13.       if (matchIndex === -1) {
  14.         segments.push(text.slice(lastMatchEnd));
  15.         break;
  16.       } else {
  17.         segments.push(text.slice(lastMatchEnd, matchIndex));
  18.         segments.push(text.slice(matchIndex, matchIndex + keyword.length));
  19.         lastMatchEnd = matchIndex + keyword.length;
  20.       }
  21.     }
  22.     return segments;
  23.   }
  24.   // 页面即将出现时进行文本分割
  25.   aboutToAppear() {
  26.     this.highlightedSegments = this.splitAndHighlight(this.originalText, this.highlightKeyword);
  27.     console.info(`分割后的文本段落:${JSON.stringify(this.highlightedSegments)}`);
  28.   }
  29.   build() {
  30.     Column({ space: 20 }) {
  31.       Text() {
  32.         ForEach(this.highlightedSegments, (segment: string, index: number) => {
  33.           ContainerSpan() {
  34.             ImageSpan($r('app.media.app_icon')).width(0).height(1);
  35.             Span(segment).fontSize(30)
  36.               .fontColor(segment === this.highlightKeyword ? Color.White : Color.Black)
  37.               .onClick(() => {
  38.                 console.info(`高亮文本被点击:${segment}`);
  39.                 console.info(`点击索引:${index}`);
  40.               });
  41.           }.textBackgroundStyle({
  42.             color: segment === this.highlightKeyword ? Color.Red : Color.Transparent
  43.           });
  44.         });
  45.       }
  46.     }.width('100%').height('100%');
  47.   }
  48. }
复制代码
在这个示例中,我们首先界说了一个字符串originalText作为原始文本,并指定了需要高亮表现的关键字highlightKeyword。然后,我们界说了一个splitAndHighlight函数来分割原始文本,并将包含关键字的部门与其他部门分开。在页面加载时,我们调用这个函数来获得分割后的文本段落,并使用Span组件来表现文本。需要注意的是,由于Span组件本身不支持直接设置配景颜色(即Span不支持.backgroundColor(Color.Orange)),因此设置配景色需要在Span外部嵌套ContainerSpan组件,并使用textBackgroundStyle属性来实现。
对于需要高亮表现的关键字部门,我们通过ContainerSpan组件的textBackgroundStyle属性来改变其配景颜色,同时保持字体颜色为白色,以确保高亮效果明显。
【示例二】文本自动换行

接下来,我们来看一个文本自动换行的示例。在这个例子中,我们需要将多行文本按照一定的规则自动换行。
  1. @Entry
  2. @Component
  3. struct Page02 {
  4.   @State poemLines: string[] = [
  5.     '混沌未分天地乱,',
  6.     '茫茫渺渺无人见。',
  7.     '自从盘古破鸿蒙,',
  8.     '开辟从兹清浊辨。',
  9.   ];
  10.   build() {
  11.     Column({ space: 10 }) {
  12.       Text('Text + Span,文本无法自动换行').backgroundColor(Color.Orange);
  13.       Text() {
  14.         ForEach(this.poemLines, (line: string) => {
  15.           Span(line);
  16.         });
  17.       }
  18.       .fontSize(20);
  19.       Text('Flex + Span,可以实现文本换行').backgroundColor(Color.Orange);
  20.       Flex({ wrap: FlexWrap.Wrap }) {
  21.         ForEach(this.poemLines, (line: string) => {
  22.           Text(line).fontSize(20);
  23.         });
  24.       }
  25.     }
  26.     .width('100%').height('100%');
  27.   }
  28. }
复制代码
在这个示例中,我们界说了一个字符串数组poemLines,其中包含了多行诗句。我们展示了两种差别的方式来表现这些诗句:一种是使用Text和Span组件直接表现,这种方式默认不会自动换行;另一种是使用Flex容器,并设置wrap属性为FlexWrap.Wrap,如许可以使得子元素在超出容器宽度时自动换行。
【技能要点总结】
1. 文本高亮:
• 使用splitAndHighlight函数分割文本,并标记关键字。
• 使用ContainerSpan和Span组件组合实现配景高亮。
• 注意Span不支持直接设置配景颜色,需通过ContainerSpan的textBackgroundStyle属性实现。
2. 文本换行:
• 使用Flex容器并设置wrap属性为FlexWrap.Wrap,实现自动换行。
• 多行文本可以通过ForEach循环动态生成。
盼望本文能为正在学习或开辟HarmonyOS应用的开辟者们提供有效的参考和启示。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

饭宝

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表