2

在将元素添加到显示列表之前,我遇到了 TLF 试图查找元素(例如 LinkElement)位置的问题。

我尝试了以下代码:

  1. 创建我的文本流:

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

似乎我无法检索 Textline,因为 flowComposer 为空。

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

4

1 回答 1

1

问题不在于 flowComposer 为空。它实际上是一个对象,但是在这个表达式中有这么长的对象链,而该链中的其他东西是空的:

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));   
}
于 2013-02-19T11:52:14.790 回答