Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   getCharBoundaries в Spark TextArea (http://www.flasher.ru/forum/showthread.php?t=148993)

Хемуль 17.01.2011 17:07

getCharBoundaries в Spark TextArea
 
Начал разбираться с FTE и Spark-компонентами во Flex SDK 4. Пока немного тяжело...
Скажем, для получения количества строк текста в TextArea предложили расширить его чем-то вроде:
Код AS3:

            public function get numLines():uint
            {
                    return textDisplay.mx_internal::textContainerManager.numLines;
            }

Но это ладно... Передо мной стоит задача получить ограничивающий прямоугольник (локальный или глобальный) для отдельного символа в TextArea и пока копание документации не помогло. Очень много новых классов и понятий. Понятно, что новый движок отрисовки текста даёт много "вкусностей", но те вещи, которые делались раньше более-менее просто теперь выглядят куда сложнее и длиннее. Если кто-то уже имел дело с этой всей "кухней" и текстами, направьте парой строчек примера, пожалуйста, к светлому будущему. ^_^

alatar 17.01.2011 18:52

В FTE нет понятия символ, это связано с особенностями отображения (например лигатуры отображаются как один символ). Неделимой еденицей является атом, который отображается при помощи TextLine. В TextLine вы можете получить границы атома. Скорее всего это и будут границы символа.
Т.е. должно быть что-то типа:
Так можно получить кол-во строк
Код AS3:

textDisplay.textFlow.flowComposer.numLines

Границы атома:
Код AS3:

//получаем 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.

Хемуль 17.01.2011 19:08

2 alatar:
Спасибо большое, буду копать.

alatar 17.01.2011 19:45

Полученный 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, время: 19:28.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.