TLF找到元素位置

时间:2013-02-18 22:47:53

标签: actionscript-3 tlf textflow

我在TLF尝试找到元素的位置(例如LinkElement)时遇到了问题,然后将其添加到显示列表中。

我尝试了以下代码:

  1. 创建我的textFlow:

    var textFlow:TextFlow = TextConverter.importToFlow(MY_HTML_STRING,
    TextConverter.TEXT_FIELD_HTML_FORMAT);
    
  2. 抓住我需要的所有元素:

    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;
    }
    
  3. 对于找到的每个元素,尝试获取边界:

    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));   
    }
    
  4. 似乎我无法检索Textline,因为flowComposer为null。

    我知道如何获得边界/为什么作曲家总是空的?

1 个答案:

答案 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));   
}