TLF найти положение элемента
У меня возникла проблема с TLF, пытающимся найти положение элемента (например, LinkElement), прежде чем он будет добавлен в список отображения.
Я попробовал следующий код:
Создать мой textFlow:
var textFlow:TextFlow = TextConverter.importToFlow(MY_HTML_STRING, TextConverter.TEXT_FIELD_HTML_FORMAT);
Возьмите весь элемент, который мне нужен:
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; }
Для каждого найденного элемента попробуйте получить границы:
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));
}