Да, действительно полезный. Ведь метод getCharBoundaries() позволяет реализовать в флеш-приложениях тот функционал, которого так не хватает во Flash (особенно тем, кто имел дело с HTML). Немного упрощая, можно сказать, что метод getCharBoundaries принимает индекс символа в строке, а возвращает данные о координатах и размере блока с данным символом в текстовом поле.
На практике данный метод используется, как правило, в двух случаях:
1.) Внедрение визуальных объектов в текстовое поле.
В качестве внедряемых объектов могут выступать компоненты, поля ввода и т. д.. Допустим, что мы создаём тест, в котором пользователю надо вводить какие-то данные. Есть следующий вопрос:
Город Псков основан в 903 году.
Наша задача в том, чтобы вместо 903 пользователь видел поле ввода, куда ему предстоит ввести свою версию правильного ответа.
Код ActionScript 3.0:
/*
импорт классов
*/
import flash.display.Sprite;
import flash.text.*;
import flash.geom.Rectangle;
/*
спрайт-контейнер, внутрь которого мы поместим все текстовые поля
*/
var conteinerText:Sprite = new Sprite();
conteinerText.graphics.beginFill(0x999999,1);
conteinerText.graphics.drawRect(0,0,550,400);
conteinerText.graphics.endFill();
addChild(conteinerText);
/*
форматирование текстовых полей
*/
var textFormat:TextFormat = new TextFormat();
textFormat.color = 0x333333;
textFormat.font = "_serif";
textFormat.size = 32;
textFormat.bold = true;
/*
динамическое текстовое поле
*/
var txtField:TextField = new TextField();
txtField.defaultTextFormat = textFormat;
txtField.width = 550;
txtField.height = 400;
txtField.text = "Город Псков основан в 903 году.";
conteinerText.addChild(txtField);
/*
поле ввода
*/
var txtInput:TextField = new TextField();
txtInput.type = TextFieldType.INPUT;
txtInput.defaultTextFormat = textFormat;
txtInput.border = true;
txtInput.background = true;
conteinerText.addChild(txtInput);
/*
с помощью метода getCharBoundaries настраиваем размеры поля ввода и помещаем его в нужные координаты
*/
var rect:Rectangle = txtField.getCharBoundaries(22);
txtInput.x = rect.x;
txtInput.y = rect.y;
txtInput.height = rect.height;
rect = txtField.getCharBoundaries(24);
txtInput.width = rect.x + rect.width - txtInput.x;
Результат:
Да, выглядит не очень красиво, но суть, думаю, раскрыта :-)
2.) Подсветка подстроки в текстовом поле.
Оставляем прежнее текстовое поле и прежний текст. Но теперь мы дату будем не накрывать полем ввода, а подсвечивать ядовито-красным цветом...
Код ActionScript 3.0:
/*
импорт классов
*/
import flash.display.Sprite;
import flash.text.*;
import flash.geom.Rectangle;
/*
спрайт-контейнер
*/
var conteinerText:Sprite = new Sprite();
conteinerText.graphics.beginFill(0x999999,1);
conteinerText.graphics.drawRect(0,0,550,400);
conteinerText.graphics.endFill();
addChild(conteinerText);
/*
форматирование
*/
var textFormat:TextFormat = new TextFormat();
textFormat.color = 0x333333;
textFormat.font = "_serif";
textFormat.size = 32;
textFormat.bold = true;
/*
динамическое текстовое поле
*/
var txtField:TextField = new TextField();
txtField.defaultTextFormat = textFormat;
txtField.width = 550;
txtField.height = 400;
txtField.text = "Город Псков основан в 903 году.";
conteinerText.addChild(txtField);
/*
с помощью метода getCharBoundaries получаем координаты и размеры подсвечиваемой области
*/
var rectHighlighting:Rectangle = new Rectangle();
var rect:Rectangle = txtField.getCharBoundaries(22);
rectHighlighting.x = rect.x;
rectHighlighting.y = rect.y;
rectHighlighting.height = rect.height;
rect = txtField.getCharBoundaries(24);
rectHighlighting.width = rect.x + rect.width - rectHighlighting.x;
/*
рисуем подстветку
*/
conteinerText.graphics.beginFill(0xff0000,1);
conteinerText.graphics.drawRect(rectHighlighting.x,rectHighlighting.y,rectHighlighting.width,rectHighlighting.height);
conteinerText.graphics.endFill();
Результат:
Если вы внимательно смотрели код, то, возможно, у вас появился вопрос: «Да откуда, б..., он взял 22 и 24?!» Если честно, то я их подсчитал вручную (считать надо с начала строки, причём счёт идёт не с 1, а с 0 + учитываются пробелы). Это не совсем правильный подход. В ActionScript-е есть встроенные инструменты для автоматизации данной операции. Но, как говорит Леонид Каневский: «Впрочем, это уже совсем другая история...» :-)