我在TLF尝试找到元素的位置(例如LinkElement)时遇到了问题,然后将其添加到显示列表中。
我尝试了以下代码:
创建我的textFlow:
var textFlow:TextFlow = TextConverter.importToFlow(MY_HTML_STRING,
TextConverter.TEXT_FIELD_HTML_FORMAT);
抓住我需要的所有元素:
var lElem:Array = findLinkElement(textFlow, []);
private function findLinkElement(group:FlowGroupElement, arr:Array):Array {
var childGroups:Array = [];
for (var i:int = 0; i < group.numChildren; i++) {
var element:FlowElement = group.getChildAt(i);
if (element is LinkElement) {
arr.push(element as LinkElement);
} else if (element is FlowGroupElement) {
childGroups.push(element);
}
}
for (i = 0; i < childGroups.length; i++) {
var childGroup:FlowGroupElement = childGroups[i];
findLinkElement(childGroup, arr);
}
return arr;
}
对于找到的每个元素,尝试获取边界:
for each (var le:LinkElement in lElem){
var abs:int = le.getAbsoluteStart();
var tl:TextLine = le.getTextFlow().flowComposer.getLineAt(abs).getTextLine(true);
var rect:Rectangle = tl.getAtomBounds(tl.getAtomIndexAtCharIndex(abs));
}
似乎我无法检索Textline,因为flowComposer为null。
我知道如何获得边界/为什么作曲家总是空的?
答案 0 :(得分:1)
问题不在于flowComposer为null。它实际上是一个对象,但是你在这个表达式中有这么长的对象链,并且该链中的其他东西是null:
var tl:TextLine = le.getTextFlow().flowComposer.getLineAt(abs).getTextLine(true);
问题在于您获得了每个LinkElement
的字符索引 - 这不是行号。所以,当你执行flowComposer.getLineAt(abs)
时,它返回null,因为该行不存在。
相反,您要使用flowComposer.getLineAtPosition(abs)
。而且,作为优化,可能尚未生成整个流程。所以在你这样做之前,最好拨打flowComposer.composeToPosition(abs)
。
以下是我为了执行上述操作而修改的代码。您可能不需要composeToPosition()
调用,它实际上可能是在循环内多次执行它的性能问题。我会留下你的决定。
这是我使用的代码(减去我的html
变量的声明)。我修改的相关代码位于for each
循环内:
var container:Sprite = new Sprite;
stage.addChild(container);
var textFlow:TextFlow = TextConverter.importToFlow(html, TextConverter.TEXT_FIELD_HTML_FORMAT);
var controller:ContainerController = new ContainerController(container, 200,200);
textFlow.flowComposer.addController(controller);
textFlow.flowComposer.updateAllControllers();
var links:Array = findLinkElement(textFlow, []);
// modified this code
for each (var le:LinkElement in links){
var abs:int = le.getAbsoluteStart();
var composer:IFlowComposer = le.getTextFlow().flowComposer;
composer.composeToPosition(abs);
var textFlowLine:TextFlowLine = composer.findLineAtPosition(abs);
var tl:TextLine = textFlowLine.getTextLine(true);
var rect:Rectangle = tl.getAtomBounds(tl.getAtomIndexAtCharIndex(abs));
}