CocosCreator3.8研究笔记(二十)CocosCreator UI组件(四)

简介: CocosCreator3.8研究笔记(二十)CocosCreator UI组件(四)

RichText 组件


RichText 组件是富文本控件,实际是由多个 Label 节点拼装而成,用来显示一段带有不同样式效果的文字,通过BBCode 标签来设置文字的样式。


目前支持的样式有:颜色(color)、字体大小(size)、字体描边(outline)、加粗(b)、斜体(i)、下划线(u)、换行(br)、图片(img)和点击事件(on)。


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/6ff2fa2410d44a0f8a203598bcbdf470.png#pic_center)

1、RichText 属性

属性 功能说明
String 富文本的内容字符串,可以在里面使用 BBCode 来指定特定文本的样式
Horizontal Align 水平对齐方式
Vertical Align 竖直对齐方式
Font Size 字体大小,单位是 point(注意:该字段不会影响 BBCode 里面设置的字体大小)
Font 富文本定制字体,所有的 label 片段都会使用这个定制的 TTF 字体
Font Family 富文本定制系统字体
Use System Font 是否使用系统字体
Max Width 富文本的最大宽度,传 0 的话意味着必须手动换行
Line Height 字体行高,单位是 point
Image Atlas 对于 img 标签里面的 src 属性名称,都需要在 imageAtlas 里面找到一个有效的 spriteFrame,否则 img tag 会判定为无效
Handle Touch Event 选中此选项后,RichText 将阻止节点边界框中的所有输入事件(鼠标和触摸),从而防止输入事件穿透到底层节点


2、BBCode 标签格式


(1)、基本格式

目前支持的标签类型有:size、color、b、i、u、img 和 on,分别用来定制字体大小、字体颜色、加粗、斜体、下划线、图片和点击事件。

每一个标签都有一个起始标签和一个结束标签,起始标签的名字和属性格式必要符合要求,且全部为小写。

结束标签的名字不做任何检查,只需要满足结束标签的定义即可。


注意:所有的 tag 名称必须是小写,且属性值是用 = 号赋值,如下:

<color=green>test</color>,<size=50>test1</>


(2)、BBCode 支持的标签

名称 描述 示例 注意事项
color 指定字体渲染颜色,颜色值可以是内置颜色,比如 white,black 等,也可以使用 16 进制颜色值,比如 #ff0000 表示红色 <color=#ff0000>Red Text</color>
size 指定字体渲染大小,大小值必须是一个整数 <size=30>enlarge me</size> Size 值必须使用等号赋值
outline 设置文本的描边颜色和描边宽度 <outline color=red width=4>A label with outline</outline> 如果你没有指定描边的颜色或者宽度的话,那么默认的颜色是白色 (#ffffff),默认的宽度是 1
b 指定使用粗体来渲染 <b>This text will be rendered as bold</b> 名字必须是小写,且不能写成 bold
i 指定使用斜体来渲染 <i>This text will be rendered as italic</i> 名字必须是小写,且不能写成 italic
u 给文本添加下划线 <u>This text will have a underline</u> 名字必须是小写,且不能写成 underline
on 指定一个点击事件处理函数,当点击该 Tag 所在文本内容时,会调用该事件响应函数 <on click="handler"> click me! </on> 除了 on 标签可以添加 click 属性,color 和 size 标签也可以添加,比如 <size=10 click="handler2">click me</size>
param 当点击事件触发时,可以在回调函数的第二个参数获取该数值 <on click="handler" param="test"> click me! </on> 依赖 click 事件
br 插入一个空行 <br/> 注意<br></br><br> 都是不支持的。
img 给富文本添加图文混排功能,img 的 src 属性必须是 ImageAtlas 图集里面的一个有效的 spriteframe 名称 <img src='emoji1' click='handler' /> 注意:只有 <img src='foo' click='bar' /> 这种写法是有效的。如果你指定一张很大的图片,那么该图片创建出来的精灵会被等比缩放,缩放的值等于富文本的行高除以精灵的高度。


(3)、img 标签的可选属性

img 标签类型提供了可选属性,可以使用 widthheight 来指定 SpriteFrame 的大小,允许该图片可以大于或是小于行高(但此设定不会改变行高)。

当改变了 SpriteFrame 的高度或宽度后,或许会需要使用 align 来调整该图片在行中的对齐方式。

属性 描述 示例 注意事项
height 指定 SpriteFrame 的渲染高度,大小值必须为整数 <img src='foo' height=50 /> 如果你只使用了高度属性,该 SpriteFrame 会自动计算宽度以保持图片比例
width 指定 SpriteFrame 的渲染宽度,大小值必须为整数 <img src='foo' width=50 /> 你可以同时使用高度及宽度属性 <img src='foo' width=20 height=30 />
align 指定 SpriteFrame 在行中的对齐方式,值必需为 bottomtopcenter <img src='foo' align=center /> 预设对齐方式为 bottom

为了支持定制图片排版,还提供了 offset 属性,用于微调 SpriteFrame 在 RichText 中的位置。

设置 offset 时需注意属性值必须为整数。

offset 属性 示例 描述 注意事项
Y <img src='foo' offset=5 /> 指定 SpriteFrame 的 y 轴加上 5 当 offset 只设定一个值的时候,它代表 y 轴的偏移
Y <img src='foo' offset=-5 /> 指定 SpriteFrame 的 y 轴减少 5 你可以设定负整数来减少 y 轴
X, Y <img src='foo' offset=6,-5 /> 指定 SpriteFrame 的 x 轴加上 6,y 轴减少 5 偏移属性的值只能包含 0-9-, 字符


(4)、标签嵌套

标签与标签是支持嵌套的,且嵌套规则跟 HTML 是一样的。比如下面的嵌套标签设置一个文本的渲染大小为 30,且颜色为绿色。

<size=30><color=green>I'm green</color></size>

也可以实现为:

<color=green><size=30>I'm green</size></color>


(5)、文本缓存

对于复杂的富文本,底层可能有十几个 label 节点,drawcall 数量会比较高,引擎为富文本组件提供了 Label 组件的文本缓存类型设置,来适当减少 drawcall 的增加。

一般情况下,不应该在游戏的主循环里面频繁地修改富文本的文本内容,这可能会导致性能比较低。

如果能不使用富文本组件,就尽量使用普通的文本组件,推荐使用 BMFont,因为 BMFont的效率是最高的。

类型 功能说明
NONE 默认值,对富文本所拆分创建的每个 Label 节点,设置其 CacheMode 为 NONE 类型,即将每个 Label 的整段文本生成一张位图并单独进行渲染。
BITMAP 选择后,对富文本所拆分创建的每个 Label 节点,设置其 CacheMode 为 BITMAP 类型,即将每个 Label 的整段文本生成一张位图,并将该位图添加到动态图集中,再依据动态图集进行合并渲染。
CHAR 选择后,对富文本所拆分创建的每个 Label 节点,设置其 CacheMode 为 CHAR 类型,即将每个 Label 的文本以“字”为单位缓存到全局共享的位图中,相同字体样式和字号的每个字符将在全局共享一份缓存。


二、RichText 组件的使用

这里以添加事件为例,进行演示:

1、新建任意一个带有 RichText 组件的节点。并创建一个自定义脚本,挂载在 RichText 组件上

这里新建了一个自定义脚本TestRichText.ts。



2、将如下的代码复制到 RichText 的 String 属性内

<on click="onClicked" param="你好,这是点击事件">Click</on>



3、复制下面的代码到TestRichText.ts中:

import { _decorator, Component, EventTouch } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('TestRictText')
export class TestRictText extends Component {
    start() {
    }
    update(deltaTime: number) {
    }
    onClicked(eventTouch:EventTouch, param:string){
        console.log("onClicked", param);
    }
}


4、编译运行

使用鼠标点击Click文本,可以查看到控制台的输出:



相关文章
|
11天前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。
105 38
|
2天前
|
人工智能 开发框架 JavaScript
LowCodeEngine:阿里开源的企业级低代码开发平台,提供预制的 UI 组件和模板,覆盖完整的研发周期
LowCodeEngine 是阿里巴巴开源的低代码开发框架,旨在通过拖拽、配置等简单操作,帮助开发者快速构建复杂的系统页面,提升开发效率和质量。
28 4
LowCodeEngine:阿里开源的企业级低代码开发平台,提供预制的 UI 组件和模板,覆盖完整的研发周期
|
2月前
|
前端开发 搜索推荐 开发者
「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas组件自定义绘图
Canvas 组件在鸿蒙应用中用于绘制自定义图形,提供丰富的绘制功能和灵活的定制能力。通过 Canvas,可以创建矩形、圆形、路径、文本等基础图形,为鸿蒙应用增添个性化的视觉效果。本篇将介绍 Canvas 组件的基础操作,涵盖绘制矩形、圆形、路径和文本的实例。
83 12
「Mac畅玩鸿蒙与硬件20」鸿蒙UI组件篇10 - Canvas组件自定义绘图
|
2月前
|
搜索推荐 前端开发 开发者
「Mac畅玩鸿蒙与硬件19」鸿蒙UI组件篇9 - 自定义动画实现
自定义动画让开发者可以设计更加个性化和复杂的动画效果,适合表现独特的界面元素。鸿蒙提供了丰富的工具,支持通过自定义路径和时间控制来创建复杂的动画运动。本篇将带你学习如何通过自定义动画实现更多样化的效果。
86 11
|
2月前
|
UED 开发者
「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
高级动画可以显著提升用户体验,为应用界面带来更流畅的视觉效果。本篇将深入介绍鸿蒙框架的高级动画,包括弹性动画、透明度渐变和旋转缩放组合动画等示例。
81 12
「Mac畅玩鸿蒙与硬件18」鸿蒙UI组件篇8 - 高级动画效果与缓动控制
|
2月前
|
UED
「Mac畅玩鸿蒙与硬件31」UI互动应用篇8 - 自定义评分星级组件
本篇将带你实现一个自定义评分星级组件,用户可以通过点击星星进行评分,并实时显示评分结果。为了让界面更具吸引力,我们还将添加一只小猫图片作为评分的背景装饰。
76 6
|
2月前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
在鸿蒙应用开发中,Canvas 组件不仅用于基础绘图,还提供了处理复杂路径和渐变效果的多种手段,帮助开发者实现精美的静态图形。本篇将介绍如何在 Canvas 中绘制复杂路径、创建渐变填充效果。
55 7
「Mac畅玩鸿蒙与硬件21」鸿蒙UI组件篇11 - Canvas 组件的静态进阶应用
|
2月前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件22」鸿蒙UI组件篇12 - Canvas 组件的动态进阶应用
在鸿蒙应用中,Canvas 组件可以实现丰富的动态效果,适合用于动画和实时更新的场景。本篇将介绍如何在 Canvas 中实现动画循环、动态进度条、旋转和缩放动画,以及性能优化策略。
56 6
|
2月前
|
前端开发 开发者
「Mac畅玩鸿蒙与硬件23」鸿蒙UI组件篇13 - 自定义组件的创建与使用
自定义组件可以帮助开发者实现复用性强、逻辑清晰的界面模块。通过自定义组件,鸿蒙应用能够提高代码的可维护性,并简化复杂布局的构建。本篇将介绍如何创建自定义组件,如何向组件传递数据,以及如何在不同页面间复用这些组件。
52 5
|
27天前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。