2013-02-18 142 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