Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Цвет выделения текста как в Word можно сделать? (http://www.flasher.ru/forum/showthread.php?t=182531)

Bred45 25.07.2012 22:41

Цвет выделения текста как в Word можно сделать?
 
Друзья, подскажите, пожалуйста.
Есть текстовое поле (динамическое), надо мышкой подсветить ЧАСТЬ текста (не сам текст, а его фон).
В Word это называется - "Цвет выделения текста".

Есть ли такая возможность в принципе?

bav 25.07.2012 23:24

Встроенной возможности сделать это нет. Придется вручную. (Хотя может в TLF такая возможность и есть, не знаю). TextField.getCharBoundaries(), TextField.getLineMetrics() и прочие методы TextField'а вам в помощь.

Wolsh 25.07.2012 23:59

В TLF — SelectionFormat

Bred45 26.07.2012 12:52

Большое спасибо за ответы!

ps
А в SelectionFormat все свойства для чтения только вроде.
Выделить можно с помощью
setSelection и alwaysShowSelection = true, но там голубоватый цвет только.
Вот его можно ли поменять?

Wolsh 26.07.2012 20:43

SelectionFormat это класс.
Свойства для чтения, да.
Потому что задаются они все в конструкторе, и "на лету" уже не меняются.

Голубоватый? У меня серый. В хелпе тоже))) Может это как-то зависит от системы.

Wolsh 27.07.2012 14:30

Вложений: 1
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flashx.textLayout.container.ContainerController;
        import flashx.textLayout.edit.SelectionFormat;
        import flashx.textLayout.edit.SelectionManager;
        import flashx.textLayout.elements.ParagraphElement;
        import flashx.textLayout.elements.SpanElement;
        import flashx.textLayout.elements.TextFlow;
        import flashx.textLayout.events.SelectionEvent;
        import flashx.textLayout.formats.TextLayoutFormat;
 
        /**
        * ...
        * @author wolsh
        */

        public class Main extends Sprite
        {
                //// Цвет и непрозрачность закрашивания полосы "подсветки" при выделении
                private var _selectionColorFocusOn:uint = 0xDD2222; //Different color is 0x4fe4e4
                private var _selectionColorFocusOff:uint = 0xDDDD00;
                private var _selectionAlpha:Number = 1;
 
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        //// отображаемый контейнер текста
                        var textContainer:Sprite = new Sprite();
                        this.addChild(textContainer);
                        textContainer.x = 100;
                        textContainer.y = 100;
 
                        //// Стиль для выделения (в фокусе)
                        var colorOn:uint = getDifferentColor(_selectionColorFocusOn);
                        var selectionStyleFocusOn:SelectionFormat = new SelectionFormat(colorOn, _selectionAlpha);
 
                        //// Стиль для выделения (без фокуса)
                        var colorOff:uint = getDifferentColor(_selectionColorFocusOff);
                        var selectionStyleFocusOff:SelectionFormat = new SelectionFormat(colorOff, _selectionAlpha);
 
                        //// Менеджер стилей для выделения
                        var selectionManager:SelectionManager = new SelectionManager();
 
                        //// Устанавливаем стиль для выделения в фокусе
                        selectionManager.focusedSelectionFormat = selectionStyleFocusOn;
                        selectionManager.unfocusedSelectionFormat = selectionStyleFocusOff;
                        //// Text Font settings
                        var textFormat:TextLayoutFormat = new TextLayoutFormat();
                        textFormat.fontFamily = "Arial";
                        textFormat.fontSize = 14;
 
                        //// Контроллер для управления отображением нашего текста
                        var textController:ContainerController = new ContainerController(textContainer);
 
                        //// Устанавливаем формат текста
                        textController.format = textFormat;
 
                        //// Устанавливаем размеры текстового блока
                        textController.setCompositionSize(1000, 40);
 
                        //// строчный элемент
                        var textSpan:SpanElement = new SpanElement();
                        textSpan.text = "Вот какой-то текст, который будем выделять.";
 
                        //// блок текста, содержащий наш строчный элемент
                        var textParagraph:ParagraphElement = new ParagraphElement();
                        textParagraph.addChild(textSpan);
 
                        //// Главный управляющий элемент))
                        var textFlow:TextFlow = new TextFlow();
                        textFlow.addChild(textParagraph);
 
                        //// Устанавливаем управляющего выделением
                        textFlow.interactionManager = selectionManager;
 
                        //// Добавляем управляющего нашим текстом
                        textFlow.flowComposer.addController(textController);
 
                        //// Запускаем обновление отображения
                        textFlow.flowComposer.updateAllControllers();
 
                        //// Подписываемся на собтие выделения
                        textFlow.addEventListener(SelectionEvent.SELECTION_CHANGE, handlerSelection);
                }
 
                private function getDifferentColor(selectionColor:uint):uint
                {
                        var r:uint = 0xFF - (selectionColor >> 16);
                        var g:uint = 0xFF - (selectionColor >> 8) & 0xFF;
                        var b:uint = 0xFF - selectionColor & 0xFF;
                        var rgb:uint = (r << 16) + (g << 8) + b;
                        return rgb;
                }
 
                private function handlerSelection(event:SelectionEvent):void
                {
                        var selectionBegin:int = event.selectionState.absoluteStart;
                        var selectionEnd:int = event.selectionState.absoluteEnd;
 
                        trace(event.selectionState.textFlow.getText(selectionBegin, selectionEnd))
                }
 
        }
 
}


Bred45 29.07.2012 15:40

Большое спасибо за пример, буду изучать.
Пока у меня есть сомнения в возможности решения данной задачи встроенными способами.
Selection - это не совсем то, что мне надо. Даже если удастся поменять его цвет.
Мне ведь нужна возможность выделить в одном текстовом блоке разные фрагменты, возможно, разным цветом.
Т.е. выделение не должно сбрасываться при клике по тексту. Здесь нужен другой инструмент.

Но Ваш код я пока не изучал.
Спасибо еще раз.

ps
Скажите, а есть ли возможность добиться такого результата, если использовать уже готовое текстовое окно (а не текст превращать в поток), созданное во Flash Professional? Никак не могу понять, как это сделать.

Wolsh 29.07.2012 20:14

Про текстфилд Вам ответили в первом же ответе. Нет там раскраски фона, ни в IDE ни программно. Там же отвечено, как делать самому — определяете область с нужными символами и закрашиваете в шейпе/спрайте под текстфилдом нужную область нужным цветом.
Может Вы нормально опишите проблему, не предполагая, что каждый флэшер однажды такое делал.
В частности, объясните что значит "надо мышкой подсветить". Как подсветить? При наведении мышки на слово, при нажатии мышкой на слово, при стандартном выделении (протаскивании мышкой с нажатой кнопкой) и т.д. Что значит разными цветами? Откуда цвета, как определить, каким и что подсвечивать?
Вы спросили про Выделение, Вам ответили про Выделение. Нужна раскраска — спрашивайте о раскраске. Подробно спрашивайте — подробно ответят.

Bred45 30.07.2012 21:21

Вы правы, для TLF можно сформулировать проще: нужен программный инструмент "highlight".

Wolsh 30.07.2012 21:45

Ну, ну? Подробности?))) Что надо закрашивать фон под буквами это уже все поняли. Что именно Вы хотите, что он должен делать, какие методы иметь? Просто "закраситьФон(начальныйИндекс, конечный индекс)"? И чтобы закраска не исчезала, пока такой же командой не перекрасят ее в другой цвет?

Добавлено через 6 минут
Текст должен менять цвет в областях подсветки? Новый цвет должен рассчитываться автоматически, или устанавливаться в другом методе (собственно, другой то есть готовый, setTextFormat)?


Часовой пояс GMT +4, время: 14:16.

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