2013-02-18 103 views
2

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

我尝试下面的代码:

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

看来我无法检索TEXTLINE因为flowComposer会空。

任何想法我怎么能得到的界限/为什么作曲家总是空?

+0

你能显示更多代码吗?例如,你的findLinkElement()方法在做什么?为什么'flowComposer'无效的答案似乎就在那里。 – 2013-02-19 01:50:01

+0

肯定,刚加了findLinkElement()代码 – Guillaume 2013-02-19 08:34:45

回答

1

问题不在于flowComposer为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)); 
} 
+0

谢谢你的回复,我明白了这个问题。我试过你的代码,但不断得到 RangeError:Error#2006:提供的索引超出范围。 \t在flash.text.engine ::一个TextLine/getAtomBounds() 我与虚设HTML字符串进行测试: VAR HTML:字符串= “dfdfdffdfsdfsdfsdf xcwxcxcwxcwxcq


sdfsdfsdf”; – Guillaume 2013-02-19 13:56:40

+0

当HTML是'多行'时,实际显示范围错误。 – Guillaume 2013-02-19 14:01:59