![]() |
|
||||||||||
|
|
|
|||||
|
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
Начал разбираться с FTE и Spark-компонентами во Flex SDK 4. Пока немного тяжело...
Скажем, для получения количества строк текста в TextArea предложили расширить его чем-то вроде: Но это ладно... Передо мной стоит задача получить ограничивающий прямоугольник (локальный или глобальный) для отдельного символа в TextArea и пока копание документации не помогло. Очень много новых классов и понятий. Понятно, что новый движок отрисовки текста даёт много "вкусностей", но те вещи, которые делались раньше более-менее просто теперь выглядят куда сложнее и длиннее. Если кто-то уже имел дело с этой всей "кухней" и текстами, направьте парой строчек примера, пожалуйста, к светлому будущему. ^_^
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
|
В FTE нет понятия символ, это связано с особенностями отображения (например лигатуры отображаются как один символ). Неделимой еденицей является атом, который отображается при помощи TextLine. В TextLine вы можете получить границы атома. Скорее всего это и будут границы символа.
Т.е. должно быть что-то типа: Так можно получить кол-во строк Границы атома: //получаем 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); В общем просмотрите доку по всем классам в этой цепочке. Фуух, наконец дописал все это. Добавлено через 10 минут P.S. textDisplay.textFlow вернет интерфейс IEditableText, т.е. надо сделать приведение к RichEditableText. Добавлено через 14 минут P.P.S Оказывается можно сократить путь. TextFlow доступен непосредственно в TextArea. Последний раз редактировалось alatar; 17.01.2011 в 18:57. |
|
|||||
|
Квач
Регистрация: Sep 2006
Адрес: Украина, Киев
Сообщений: 1,526
|
2 alatar:
Спасибо большое, буду копать.
__________________
Да не нужно тебе читать документацию по Flash и AS от Adobe - ты слишком умён для этого |
|
|||||
|
Полученный 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>
|
![]() |
![]() |
Часовой пояс GMT +4, время: 13:55. |
|
|
« Предыдущая тема | Следующая тема » |
|
|