TLF найти положение элемента

У меня возникла проблема с 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));   
    }
    

Кажется, я не могу получить Textline, потому что flowComposer имеет значение null.

Любая идея, как я могу получить границы / почему композитор всегда нулевой?

1 ответ

Проблема не в том, что flowComposer равен нулю. На самом деле это объект, но у вас есть такая длинная цепочка объектов в этом выражении, и что-то еще в этой цепочке равно нулю:

var tl:TextLine = le.getTextFlow().flowComposer.getLineAt(abs).getTextLine(true);

Проблема в том, что вы получаете индекс персонажа каждого LinkElement - это не номер строки. Итак, когда вы делаете flowComposer.getLineAt(abs) он возвращает ноль, потому что эта строка не существует.

Вместо этого вы хотите использовать 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));   
}
Другие вопросы по тегам