富文本

富文本与普通文本的区别在于:

点击主工具栏中的按钮,生成一个富文本。

实例属性

GRichTextField

富文本支持动态创建,例如:

GRichTextField aRichTextField = new GRichTextField();
aRichTextField.SetSize(100,100);
aRichTextField.text = "<a href='xxx'>Hello World</a>";

侦听富文本中链接点击的方法是(这个事件是冒泡的,也就是你可以不在富文本上侦听,在它的父元件或者祖父元件上侦听都是可以的):

//Unity/Cry/MonoGame, EventContext里的data就是href值。
aRichTextField.onClickLink.Add(onClickLink);

//AS3/Egret,TextEvent.text就是href值。
aRichTextField.addEventListener(TextEvent.LINK, onClickLink);

//Egret,TextEvent.text就是href值。
aRichTextField.addEventListener(TextEvent.LINK, this.onClickLink, this);

//Laya, onClickLink的参数就是href值。
aRichTextField.on(laya.events.Event.LINK,this,this.onClickLink);

//Cocos2dx,EventContext.getDataValue().asString()就是href的值。
aRichTextField->addEventListener(UIEventType::ClickLink, CC_CALLBACK_1(AClass::onClickLink, this));

//CocosCreator,onClickLink的第一个参数就是href值,可选的第二个参数是fgui.Event
aRichTextField.on(fgui.Event.LINK, this.onClickLink, this);

富文本最重要的功能是支持HTML解析和渲染。普通的文本样式标签,例如FONTBIU这些一般都能很好的支持。其他一些对象标签,例如AIMG等在各个引擎中支持的力度有所不同:

HTML语法

Unity/MonoGame版本对HTML解析有比较完整的支持。

如果要访问HTML中的对象,可以使用以下的方式:

//当前文本中具有的HTML元素数量
int cnt = aRichTextField.richTextField.htmlElementCount;

//获得指定索引的HTML元素,0=<index<cnt
HtmlElement element = aRichTextField.richTextField.GetHtmlElementAt(index);

//获得指定名称的HTML元素。名称由HTML元素里的name属性指定。
element = aRichTextField.richTextField.GetHtmlElement(elementName);

//获得HTML元素对应的HTML对象。HTML对象的类型有HtmlImage、HtmlLink、HtmlInput等。
IHtmlObject htmlObject = (IHtmlObject)element.htmlObject;
if(element.type==HtmlElementType.Image)
{
HtmlImage image = (HtmlImage)htmlObject;
}

又例如,如果要制作鼠标移到链接上显示信息的效果:

int cnt = richText.htmlObjectCount;
for(int i=0;i<cnt;i++)
{
IHtmlObject obj = richText.GetHtmlObjectAt(i);
if(obj is HtmlLink)
{
((HtmlLink)obj).shape.onRollOver.Add(onLinkRollOver);
((HtmlLink)obj).shape.onRollOut.Add(onLinkRollOut);
}
}

//你可以在RollOver和RollOut的处理里调用GRoot.inst.ShowPopup、GRoot.inst.ShowTooltips或者其他处理。

你也可以扩展实现自己的IHtmlObject。你需要自己实现一个IHtmlPageContext接口,然后赋值给RichTextField的htmlPageContext属性。详细可阅读源码。