Просмотр полной версии : getCharBoundaries в Spark TextArea
Начал разбираться с FTE и Spark-компонентами во Flex SDK 4. Пока немного тяжело...
Скажем, для получения количества строк текста в TextArea предложили расширить его чем-то вроде:
public function get numLines():uint
{
return textDisplay.mx_internal::textContainerManager.numLines;
}
Но это ладно... Передо мной стоит задача получить ограничивающий прямоугольник (локальный или глобальный) для отдельного символа в TextArea и пока копание документации не помогло. Очень много новых классов и понятий. Понятно, что новый движок отрисовки текста даёт много "вкусностей", но те вещи, которые делались раньше более-менее просто теперь выглядят куда сложнее и длиннее. Если кто-то уже имел дело с этой всей "кухней" и текстами, направьте парой строчек примера, пожалуйста, к светлому будущему. ^_^
В FTE нет понятия символ, это связано с особенностями отображения (например лигатуры отображаются как один символ). Неделимой еденицей является атом, который отображается при помощи TextLine. В TextLine вы можете получить границы атома. Скорее всего это и будут границы символа.
Т.е. должно быть что-то типа:
Так можно получить кол-во строк
textDisplay.textFlow.flowComposer.numLines
Границы атома:
//получаем TextFlowLine – это описание текстовой строки
//ищем для 5-го символа
var flowLine:TextFlowLine = textDisplay.textFlow.flowComposer.findLineAtPosition(5);
//получаем TextLine
var textLine:TextLine = flowLine.getTextLine();
//получаем индекс атома (символ по-прежнему пятый)
var atomInd:int = textLine.getAtomIndexAtCharIndex(5);
//наконец получаем размеры
var rect:Rectangle = textLine.getAtomBounds(atomInd);
Все изыскания теоретические и не проверялись. Код примерный, необходимо вставить проверки на null и возврат ошибок.
В общем просмотрите доку по всем классам в этой цепочке.
Фуух, наконец дописал все это.
Добавлено через 10 минут
P.S. textDisplay.textFlow вернет интерфейс IEditableText, т.е. надо сделать приведение к RichEditableText.
Добавлено через 14 минут
P.P.S Оказывается можно сократить путь. TextFlow доступен непосредственно в TextArea.
2 alatar:
Спасибо большое, буду копать.
Полученный Rectangle имеет координаты относительно TextLine. Т.е. надо скорректировать x и y. Вот проверенный код. Обратите внимание на номер символа, они отсчитываются с 0.
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="100" minHeight="100">
<fx:Script>
<![CDATA[
import flash.text.engine.TextLine;
import flashx.textLayout.compose.TextFlowLine;
import flashx.textLayout.elements.TextFlow;
import mx.events.FlexEvent;
import mx.graphics.SolidColor;
import spark.primitives.Rect;
protected function area_creationCompleteHandler(event:FlexEvent):void
{
var flow:TextFlow = area.textFlow;
var flowLine:TextFlowLine = flow.flowComposer.findLineAtPosition(4);
var textLine:TextLine = flowLine.getTextLine();
var atomInd:int = textLine.getAtomIndexAtCharIndex(4);
var rect:Rectangle = textLine.getAtomBounds(atomInd);
rect.x += textLine.x;
rect.y += textLine.y;
trace(rect);
var rectItem:Rect = new Rect();
rectItem.x = rect.x;
rectItem.y = rect.y;
rectItem.width = rect.width;
rectItem.height = rect.height;
rectItem.fill = new SolidColor(0xFF0000);
addElement(rectItem);
}
]]>
</fx:Script>
<s:TextArea id="area" text="Hello world" creationComplete="area_creationCompleteHandler(event)"/>
</s:Application>
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.