# UIRichText Rich Text Component
# Overview
UIRichText inherits UILabel, which can realize the ability to style, mix graphics and text, hyperlink, and bind external nodes.
# Label format
Rich text format is similar to XML. Nodes are opened in <tag>
format, and nodes are closed with </tag>
. In the component, most of the nodes can be closed automatically, and only a few of them need to be handwritten to close the label.
The node attribute is written as key=value
without quotation marks; different attributes are separated by a vertical bar, such as <tag|key1=value1|key2=value2>
.
# Style
Style sheet support attributes:
Property | Type | Default Value | Description |
---|---|---|---|
font | string | "Arial" | font name |
size | number | 12 | font size |
color | string | "#000000" | font color |
bold | boolean | false | whether to bold |
italic | boolean | false | whether to italic |
spacing | number | 0 | word spacing |
stroke | number | 0 | stroke thickness, 0 means no stroke |
strokeColor | string | "#000000" | stroke color |
underline | number | 0 | underline thickness, 0 means no underline |
underlineColor | string | "#000000" | underline color |
shadow | string | "" | shadow offset, such as "1,2" for the offset x=1, y=2, set the empty string "" to have no shadow |
shadowColor | string | "#000000" | shadow color |
applyGradient | boolen | false | Whether to turn on gradient |
gradientTop | string | "#000000" | gradient top |
gradientBottom | string | "#000000" | gradient bottom |
# Set the global style sheet
Similar to CSS, you can set the key-value style sheet before instantiating UIRichText. All UIRichtext share the same global style sheet.
// style sheet
const style = {
s1: {font: "SimSun", size: 18, color: "#FF0000" },
s2: ...
};
// Write the style sheet through the style static attribute overwrite
engine.UIRichText.style = style;
// Or use the setStyle() static method to incrementally write the style sheet
engine.UIRichText.setStyle(style);
# Set the instance style sheet
Similar to CSS, after instantiating UIRichText, you can set the key-value style sheet first. The instance UIRichtext uses a separate style sheet, which cascades global styles.
// style sheet
const style = {
s1: {font: "Arial", size: 20, color: "#FF0000" },
s2: ...
};
// Write the rich text instance to the local style
richtextComp.style = style;
# Style tags
Set the style. It is best to use </style>
to close the label manually, otherwise the component will automatically determine the closing timing, which may produce unexpected effects.
# Use style sheets
<style|value=style name>text</style>
# Use attributes directly
<style||applyGradient=true|gradientTop=#00ff00|gradientBottom=#ff44ff>Colored text</style>
# Layout label
# Align label
<align|horz=right|vert=top>right alignment</align>
Alignment. Need to use </align>
to manually close the label.
- align tags cannot be nested.
Under the same layout,
Adjacent algins with the same horz in the horizontal direction will be merged into the whole; adjacent aligns with different horz in the horizontal direction will be line-wrapped first, and then the alignment operation will be performed.
The vertical alignment of align is vert
, which controls the vertical alignment rules of the sub-elements inside align.
Attribute | meaning | optional value |
---|---|---|
horz | Align horizontally, align according to the width of the current Layout container | left to the left (default), center to the center, right to the right |
vert | Vertical alignment, aligned according to the line height | top top (default), center center, bottom bottom |
# Line spacing multiple linespace
<linespace|value=0.5>
Set the line spacing multiple to the current node. Determine the line spacing inside the current layout.
Attributes:
- value: multiple, the default is 0.
# Newline label
<br|value=0>
Take the initiative to wrap. If you do not bring br, then when the content exceeds the width of the container, it will automatically wrap.
Attributes:
- value: line break distance, extra distance beyond the line break distance of the line itself.
# Hyperlinks
<link|id=1|style=s2|text=hyperlink|data=someData>hyperlink</link>
Hyperlink element. You need to use </link>
to manually close the label, add an externally set click callback to all the elements inside the label, and add a script component with a specific function to the click callback.
export default class RichTextlLink extends engine.Script {
public onClickRichTextLink(obj: {id: number, data: string}) {
console.log(obj.id, obj.data);
}
}
Attributes:
- id: The mark distinguished when the callback is triggered
- style: the name of the style.
- text: text content.
- data: data available after clicking, string format.
# Rendering tags
# Normal text
Hello World
Just use the text directly.
# picture
<img|texture=path/to/texture2d|size=15,20>
<img|spriteframe=path/to/spriteframe|size=15,20>
For static pictures, if size is not specified, the default size of the picture will be used.
Attributes:
- texture: The path of the resource Texture2D. Mutually exclusive with the spriteframe attribute.
- spriteframe: The path of the resource SpriteFrame. Mutually exclusive with the texture property.
- size: picture width and height, format width, height.
# Binding external nodes
The <node>
tag is used as a layout area. The label is set to the default width and height, and an id is set. The script can be used to bind the id and the external node to synchronize the information of the external node and the layout area. .
<node|id=1|size=96,128>Follow-up text
this._richText.bindNodeWithTransform(1, this._renderSpriteTransform);
The external node must be the first-level child node of the rich text, and the case is a picture frame animation node. After playing, you can dynamically modify the rich text layout to view, and the external nodes are directly synchronized with the rich text layout.
# Instructions
# Code usage
UIRichText is a rendering component, so it needs to be mounted on a non-rendering node.
const xmlText = "<style|value=s1>Text</style>"
const richTextComp = entity.addComponent<UIRichText>(engine.UIRichText);
richTextComp.text = xmlText;
// ...
# Get the actual width and height
Get the size of the layout element, get will trigger the operation and update in the current rich text state.
interface Metrics {
width: number;
height: number;
innerWidth: number;
innerHeight: number;
outerWidth: number;
outerHeight: number;
rowsNumber: number;
layoutWidth?: number;
layouHeight?: number;
}
const metrics = richText.metrics as Metrics;
# Editor use
Right click-UI-New RichText