首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >纯血鸿蒙APP实战开发——Text实现部分文本高亮和超链接样式

纯血鸿蒙APP实战开发——Text实现部分文本高亮和超链接样式

原创
作者头像
小帅聊鸿蒙
发布于 2025-02-13 12:45:04
发布于 2025-02-13 12:45:04
1690
举报
文章被收录于专栏:鸿蒙开发笔记鸿蒙开发笔记

介绍

本示例通过自定义Span类型,在Text组件中使用ForEach遍历,根据不同的Span类型生成不同样式和功能的Span组件,实现部分文本高亮和超链接。

效果图预览

使用说明

  1. 点击超链接,根据链接类型出现相应提示弹窗。
  2. 长按消息卡片出现提示弹窗。

实现思路

  1. 定义 CustomSpanType 枚举类型,此处定义了 Normal、Hashtag、Mention、VideoLink 和 DetailLink 五种类型。
代码语言:ts
AI代码解释
复制
export enum CustomSpanType {
  Normal, // 普通文本,不含任何特殊格式或标记
  Hashtag, // 话题标签
  Mention, // @提及
  VideoLink, // 视频链接
  DetailLink // 正文详情
}
  1. 创建 CustomSpan 数据类,用于表示不同类型的 Span 对象。
代码语言:ts
AI代码解释
复制
export class CustomSpan {
  type: CustomSpanType; // 文本类型
  content: string; // 文本内容
  url?: string; // 跳转的链接地址

  constructor(type: CustomSpanType = CustomSpanType.Normal, content: string, url?: string) {
    this.type = type;
    this.content = content;
    if (url) {
      this.url = url;
    }
  }
}
  1. 使用 Text 组件结合 ForEach 方法遍历 spans 中的 CustomSpan 对象,根据不同的 Span 类型生成不同样式和功能的 Span 组件。
代码语言:ts
AI代码解释
复制
Text() {
  ForEach(this.spans, (item: CustomSpan) => {
    if (item.type === CustomSpanType.Normal) {
      Span(item.content)
        .fontSize($r('app.string.ohos_id_text_size_body1'))
    } else if (item.type === CustomSpanType.Hashtag || item.type === CustomSpanType.Mention || item.type === CustomSpanType.DetailLink) {
      TextLinkSpan({ item: item })
    } else {
      VideoLinkSpan({ item: item })
    }
  })
}
.width($r('app.string.styled_text_layout_100'))
.fontSize($r('app.string.ohos_id_text_size_body1'))
.margin({ top: $r('app.string.ohos_id_card_margin_start') })
  1. 对于 Normal 类型的 Span,直接使用 Span 组件展示文本内容,并设置相应的样式。
代码语言:ts
AI代码解释
复制
Span(item.content)
  .fontSize($r('app.string.ohos_id_text_size_body1'))
  1. 对于 Hashtag、Mention 和 DetailLink 类型的 Span,在 TextLinkSpan 组件中添加带有超链接功能的 Span 组件,根据 CustomSpan 的类型和内容,实现对应的样式和交互功能,例如显示提示信息或执行其他操作。
代码语言:ts
AI代码解释
复制
@Component
struct TextLinkSpan {
  @State linkBackgroundColor: Color | Resource = Color.Transparent; // 超链接背景色
  private item: CustomSpan = new CustomSpan(CustomSpanType.Normal, '');
  @State myItem: CustomSpan = this.item;

  aboutToAppear(): void {
    // LazyForEach中Text组件嵌套自定义组件会有数据初次不渲染问题,异步修改状态变量更新视图
    setTimeout(() => {
      this.myItem = this.item;
    })
  }

  build(){
    Span(this.myItem.content)
      .fontColor($r('app.color.styled_text_link_font_color'))// 超链接字体颜色
      .fontSize($r('app.string.ohos_id_text_size_body1'))
      .textBackgroundStyle({ color: this.linkBackgroundColor })
      .onClick(() => {
        this.linkBackgroundColor = $r('app.color.styled_text_link_clicked_background_color'); // 点击后的背景色
        setTimeout(() => {
          this.linkBackgroundColor = Color.Transparent;
        }, BACKGROUND_CHANGE_DELAY)
        // 根据文本超链接的类型做相应处理
        if (this.myItem.type === CustomSpanType.Hashtag) {
          promptAction.showToast({
            message: $r('app.string.styled_text_hashtag_toast_message')
          });
        } else if (this.myItem.type === CustomSpanType.Mention) {
          promptAction.showToast({
            message: $r('app.string.styled_text_user_page_toast_message')
          });
        } else {
          promptAction.showToast({
            message: $r('app.string.styled_text_content_details_toast_message')
          });
        }
      })
  }
}
DD一下:欢迎大家关注公众号<程序猿百晓生>,可以了解到一下知识点。
代码语言:erlang
AI代码解释
复制
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.OpenHarmonyUboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......
  1. 对于 VideoLink 类型的 Span,使用 VideoLinkSpan 组件添加图标和超链接功能,在点击事件中显示提示信息或执行跳转视频页操作。
代码语言:ts
AI代码解释
复制
@Component
struct VideoLinkSpan {
  @State linkBackgroundColor: Color | Resource = Color.Transparent;
  private item: CustomSpan = new CustomSpan(CustomSpanType.Normal, '');
  @State myItem: CustomSpan = this.item;

  aboutToAppear(): void {
    // LazyForEach中Text组件嵌套自定义组件会有数据初次不渲染问题,异步修改状态变量更新视图
    setTimeout(() => {
      this.myItem = this.item;
    })
  }

  build() {
    ContainerSpan() {
      ImageSpan($r('app.media.styled_text_ic_public_video'))
        .height($r('app.integer.styled_text_video_link_icon_height'))
        .verticalAlign(ImageSpanAlignment.CENTER)
      Span(this.myItem.content)
        .fontColor($r('app.color.styled_text_link_font_color'))
        .fontSize($r('app.string.ohos_id_text_size_body1'))
        .onClick(() => {
          this.linkBackgroundColor = $r('app.color.styled_text_link_clicked_background_color');
          setTimeout(() => {
            this.linkBackgroundColor = Color.Transparent;
          }, BACKGROUND_CHANGE_DELAY)
          promptAction.showToast({
            message: $r('app.string.styled_text_video_function_message')
          });
        })
    }
    .textBackgroundStyle({ color: this.linkBackgroundColor })
  }
}

高性能知识点

本示例使用了LazyForEach进行数据懒加载

工程结构&模块类型

代码语言:shell
AI代码解释
复制
   styledtext                                   // har类型
   |---/src/main/ets/mock                        
   |   |---MockData.ets                         // mock数据
   |---/src/main/ets/model                        
   |   |---DataSource.ets                       // 列表数据模型                        
   |   |---TextModel.ets                        // 数据类型定义
   |---/src/main/ets/pages                        
   |   |---StyledText.ets                       // 视图层-主页面

模块依赖

  1. 本实例依赖common模块中的资源文件。
  2. 本示例依赖动态路由模块来实现页面的动态加载。

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力;
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识;
  • 想要获取更多完整鸿蒙最新学习知识点,可关注B站:码牛课堂;

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
纯血鸿蒙APP实战开发——自定义Stepper
在许多场景下,我们都需要引导用户按照步骤完成任务,此功能在HarmonyOS Next中可以使用 Stepper 来实现,但是Stepper的定制化能力较弱,开发者无法定制上下页切换按钮的样式、位置,因此本例介绍了如何基于Swiper实现Stepper的能力。
小帅聊鸿蒙
2025/02/17
1370
纯血鸿蒙APP实战开发——自定义Stepper
纯血鸿蒙APP实战开发——跨文件样式复用和组件复用
本示例主要介绍了跨文件样式复用和组件复用的场景。在应用开发中,我们通常需要使用相同功能和样式的ArkUI组件,例如购物页面中会使用相同样式的Button按钮、Text显示文字,我们常用的方法是抽取公共样式或者封装成一个自定义组件到公共组件库中以减少冗余代码。
小帅聊鸿蒙
2025/01/06
1290
纯血鸿蒙APP实战开发——跨文件样式复用和组件复用
纯血鸿蒙APP实战开发——ArkWeb同层渲染
该方案展示了ArkWeb 同层渲染 :将系统原生组件直接渲染到前端H5页面上,原生组件不仅可以提供H5组件无法实现的一些功能,还能提升用户体验的流畅度。
小帅聊鸿蒙
2025/01/07
1590
纯血鸿蒙APP实战开发——ArkWeb同层渲染
纯血鸿蒙APP实战开发——动态注册字体案例
本示例介绍利用 上传下载 模块和 注册自定义字体 模块实现从网络上下载字体并注册应用字体的功能,该场景多用于由特殊字体要求的场景。
小帅聊鸿蒙
2025/02/10
1290
纯血鸿蒙APP实战开发——动态注册字体案例
纯血鸿蒙APP实战开发——自定义安全键盘案例
金融类应用在密码输入时,一般会使用自定义安全键盘。本示例介绍如何使用TextInput组件实现自定义安全键盘场景,主要包括TextInput.customKeyboard绑定自定义键盘、自定义键盘布局和状态更新等知识点。
小帅聊鸿蒙
2025/01/05
2320
纯血鸿蒙APP实战开发——自定义安全键盘案例
鸿蒙开发实战案例:文本选择菜单案例
本案例拓展富文本组件文字选择菜单选项,通过富文本组件editMenuOptions属性添加自定义选择菜单,在编辑文字时选择更多选项打开额外菜单栏。
小帅聊鸿蒙
2025/03/03
990
鸿蒙开发实战案例:文本选择菜单案例
纯血鸿蒙APP实战开发——边框或背景图片拉伸案例
HarmonyOS上不支持.9资源文件进行安全拉伸。作为替代方案,本案例中商城页面的促销标签边框使用同一张图片资源,通过设置图片的resizable属性,展示不同长度的促销标签效果。
小帅聊鸿蒙
2025/02/16
1440
纯血鸿蒙APP实战开发——边框或背景图片拉伸案例
纯血鸿蒙APP实战开发——应用异常处理案例
本示例介绍了通过应用事件打点 hiAppEvent 获取上一次应用异常信息的方法,主要分为应用崩溃、应用卡死以及系统查杀三种。
小帅聊鸿蒙
2025/02/07
1460
纯血鸿蒙APP实战开发——应用异常处理案例
纯血鸿蒙APP实战开发——投票动效实现案例
本示例介绍使用绘制组件中的Polygon组件配合使用显式动画以及borderRadius实现投票pk组件。
小帅聊鸿蒙
2025/01/14
1440
纯血鸿蒙APP实战开发——投票动效实现案例
纯血鸿蒙APP实战开发——图片选择和下载保存案例
本示例介绍图片相关场景的使用:包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面,下载并保存网络图片到手机相册或到指定用户目录两个场景。
小帅聊鸿蒙
2025/02/06
2180
纯血鸿蒙APP实战开发——图片选择和下载保存案例
纯血鸿蒙APP实战开发——多层级轮播图
本示例介绍使用ArkUI stack 组件实现多层级轮播图。该场景多用于购物、资讯类应用。
小帅聊鸿蒙
2024/12/25
2030
鸿蒙原生应用天气之子
在工具栏File/Project Structure/Signing Configs,勾选Automatically generate签名;运行HelloWorld。
徐建国
2024/01/17
2310
鸿蒙原生应用天气之子
纯血鸿蒙APP实战开发——边缘渐变实现
滑动列表的图片,当一侧边缘有渐变色时表示还没有滑动到边缘,该侧仍有内容可以浏览,当滑动到边缘时,渐变色消失。
小帅聊鸿蒙
2025/02/17
700
纯血鸿蒙APP实战开发——边缘渐变实现
纯血鸿蒙APP实战开发——阻塞事件冒泡
本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题;以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,如何解决父组件也会被触发的问题。
小帅聊鸿蒙
2025/01/22
1740
纯血鸿蒙APP实战开发——阻塞事件冒泡
纯血鸿蒙APP实战开发——评论组件案例实现
评论组件在目前市面上的短视频app中是一种很常见的场景,本案例使用 全局状态保留能力弹窗 来实现评论组件。点击评论按钮弹出评论组件,点击空白处隐藏该组件,再次点击评论按钮则会恢复上一次浏览的组件状态。
小帅聊鸿蒙
2024/12/27
1720
纯血鸿蒙APP实战开发——评论组件案例实现
纯血鸿蒙APP实战开发——列表项交换案例
本案例通过List组件、组合手势GestureGroup、swipeAction属性以及attributeModifier属性等实现了列表项的交换和删除。
小帅聊鸿蒙
2025/01/18
1510
纯血鸿蒙APP实战开发——列表项交换案例
纯血鸿蒙APP实战开发——深色模式适配
本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下:
小帅聊鸿蒙
2024/12/30
2470
纯血鸿蒙APP实战开发——标题下拉缩放案例
本示例使用了 LazyForEach 进行数据懒加载以及 显式动画animateTo 实现文本偏移。
小帅聊鸿蒙
2025/01/15
1250
纯血鸿蒙APP实战开发——标题下拉缩放案例
纯血鸿蒙APP实战开发——全屏登录页面
小帅聊鸿蒙
2024/12/30
2000
纯血鸿蒙APP实战开发——自定义视图实现Tab效果
本示例介绍使用Text、List等组件,添加点击事件onclick,动画,animationTo实现自定义Tab效果。
小帅聊鸿蒙
2025/01/02
1430
纯血鸿蒙APP实战开发——自定义视图实现Tab效果
推荐阅读
相关推荐
纯血鸿蒙APP实战开发——自定义Stepper
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档