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

ops/2024/12/22 14:25:53/

介绍

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

效果图预览

使用说明

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

实现思路

  1. 定义 CustomSpanType 枚举类型,此处定义了 Normal、Hashtag、Mention、VideoLink 和 DetailLink 五种类型。
export enum CustomSpanType {Normal, // 普通文本,不含任何特殊格式或标记Hashtag, // 话题标签Mention, // @提及VideoLink, // 视频链接DetailLink // 正文详情
}
  1. 创建 CustomSpan 数据类,用于表示不同类型的 Span 对象。
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 组件。
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 组件展示文本内容,并设置相应的样式。
Span(item.content).fontSize($r('app.string.ohos_id_text_size_body1'))
  1. 对于 Hashtag、Mention 和 DetailLink 类型的 Span,在 TextLinkSpan 组件中添加带有超链接功能的 Span 组件,根据 CustomSpan 的类型和内容,实现对应的样式和交互功能,例如显示提示信息或执行其他操作。
@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')});}})}
}
如果你对这篇鸿蒙开发技术分析感兴趣,还请帮忙来个“素质三连”,后续带你探索 “→更多←” 鸿蒙开发的技术奥秘!

  1. 对于 VideoLink 类型的 Span,使用 VideoLinkSpan 组件添加图标和超链接功能,在点击事件中显示提示信息或执行跳转视频页操作。
@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进行数据懒加载

工程结构&模块类型

   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. 本示例依赖动态路由模块来实现页面的动态加载。

http://www.ppmy.cn/ops/144039.html

相关文章

【1.排序】

排序 笔记记录 1.排序的基本概念1.1 排序的定义 2. 插入排序2.1 直接插入排序2.2 折半插入排序2.3 希尔排序 3. 交换排序3.1 冒泡排序3.2 快速排序 4. 选择排序4.1 简单选择排序4.2 堆排序 5. 归并排序、基数排序和计数排序5.1 归并排序4.2 基数排序4.3 计数排序 6. 各种内部排…

Unity Apple Vision Pro 开发教程:物体识别跟踪

Spatial XR 开发者社区官网:SpatialXR 社区 开发流程与原理:Apple Vision Pro 物体识别跟踪原理与开发流程【Unity Apple Vision Pro 开发系列教程】 PolySpatial 物体跟踪官方样例讲解:Unity Apple Vision Pro 开发教程:物体识别…

nginx 拦截指定ip访问指定 url

nginx 拦截指定ip访问指定 url 这里需要注意的是一定要用$http_x_forwarded_for 这个变量 upstream myapp1 { # 定义一个名为myapp1的服务器组 server backend1.example.com weight5; # 添加一个服务器,并设置权重为5 server backend2.example.com; # 添加另…

React和Vue中暴露子组件的属性和方法给父组件用,并且控制子组件暴露的颗粒度的做法

React 在 React 中,forwardRef 是一种高级技术,它允许你将 ref 从父组件传递到子组件,从而直接访问子组件的 DOM 节点或公开的方法。这对于需要操作子组件内部状态或 DOM 的场景非常有用。为了使子组件能够暴露其属性和方法给父组件&#xf…

【k8s集群应用】kubeadm1.20高可用部署(3master)

文章目录 Kubeadm - K8S1.20 - 高可用集群部署Kubernetes 环境准备1. 基础配置2. 修改主机名3. 修改 hosts 文件4. 时间同步5. Linux 资源限制6. 升级内核7. 调整内核参数8. 加载 ip_vs 模块 Kubernetes 集群部署在所有节点上安装 Docker在所有节点上安装 kubeadm、kubelet 和 …

SQLAlchemy 2.0 高级特性详解

SQLAlchemy 2.0 高级特性详解 一、关系运算符 any 与 has 1. any 方法 用于一对多关系中,检查集合中是否存在满足条件的元素。 from sqlalchemy import select# 示例:查找有任何价格大于100的商品的订单 stmt select(Order).where(Order.items.any(…

【WRF教程第3.1期】预处理系统 WPS 详解:以4.5版本为例

预处理系统 WPS 详解:以4.5版本为例 每个 WPS 程序的功能程序1:geogrid程序2:ungrib程序3:metgrid WPS运行(Running the WPS)步骤1:Define model domains with geogrid步骤2:Extract…

大数据-环保领域

在生态环境领域,我国正在加快建设布局合理、功能完善的生态环境监测网络,实现对环境质量、重点污染源、生态状况监测的全覆盖。建设生态环境大数据平台,提高环境综合分析、预警预测和协同监管能力,搭建面向社会公众和组织的数据开…