Руководство по actionscript. часть 5, стр. 049
Сглаживание содержимого, переносимого в объект BitmapData, происходит по отношению к существующему фону в растровом изображении.
Далее мы воспользуемся методом draw ( ) для выполнения растеризации объекта TextField, чтобы можно было применить к нему эффект растворения на уровне пикселов. Этот код представлен в листинге 26.9.
Рис. 26.7. Отображаемые объекты, объединенные в растровом изображении
Листинг 26.9. Растеризация и последующее растворение объекта TextField
package { import flash. display.*; import flash. utils.*; import flash. events.*; import flash. geom.*; import flash. text.*;
public class DissolveText extends Sprite { // Переменные, используемые для эффекта растворения private var randomSeed:int = Math. floor(Math. random( ) * int. MAX_VALUE);
private var destPoint:Point = new Point(0, 0); private var numberOfPixels:int = 10; private var destColor:uint = OxFFOOOOOO;
// Объект, в который будет переноситься текст private var bitmapData.-BitmapData;
// Таймер, используемый для периодического вызова метода pixelDissolve( ) private var t:Timer;
// Конструктор
public function DissolveText ( ) { // Создаем текст
var txt:TextField = new TextField( ); txt. text = «Essential ActionScript 3.0″; txt. autoSize = TextFieldAutoSize. LEFT; txt. textColor = OxFFFFFF;
// Создаем объект BitmapData с размерами, // достаточными для размещения текста
bitmapData = new BitmapData(txt. width, txt. height, false, destColor); // Переносим текст в объект BitmapData bitmapData. draw(txt);
// Связываем объект BitmapData с объектом Bitmap, чтобы отобразить его // на экране
var bitmap:Bitmap = new Bitmap(bitmapData); addChild(bitmap);
// Начинаем периодически вызывать метод pixelDissolve( ) t = new Timer(lO);
t. addEventLi stener(TimerEvent. TIMER, ti merLi stener); t. start( );
}
// Обрабатывает события TimerEvent. TIMER private function timerListener (e:TimerEvent):void { dissolve( );
}
// Выполняет растворение public function dissolve( ):void { // Вызываем метод pixelDissolve( ), чтобы растворить указанное // количество пикселов, и запоминаем возвращенное псевдослучайное // число для следующего раза. Использование возвращаемого // псевдослучайного числа гарантирует плавное растворение. randomSeed = bitmapData. pixelDissolve(bitmapData,
bitmapData. rect,
destPoint,
randomSeed,
numberOfPixels,
destColor);
// Прекращаем растворение, когда все пикселы будут иметь целевой цвет // (то есть когда ширина и высота области, в которой отсутствует // целевой цвет, будут равны 0) var coloredRegion:Rectangle =
bitmapData. getColorBoundsRect(OxFFFFFFFF, destColor, false): if (coloredRegion. width == 0 && coloredRegion. height == 0 ) { t. stop( ):
}
}
}
}
Метод draw ( ) также используется для растеризации векторного содержимого с целью повышения производительности. Например, вспомните простую программу рисования ScribbleAS3, представленную ранее в листинге 26.6. Она рисует точки всякий раз, когда происходит перемещение мыши, но не соединяет нарисованные точки линиями. Одним из способов соединить точки является использование метода экземпляра 1 ineTo ( ) класса Graphics, который рисует векторную линию между двумя точками. Тем не менее применение векторов для рисования линий ограничивает производительность: теоретически можно нарисовать такое количество линий, которое не позволит приложению реагировать на действия пользователя (из-за ограничений в механизме отображения векторов среды выполнения Flash). Для решения этой проблемы мы можем рисовать линии с помощью метода 1 ineTo ( ) в экземпляре класса Shape, не отображаемом на экране. После рисования каждой линии мы копируем ее из объекта Shape в объект BitmapData, после чего очищаем данный экземпляр класса Shape. Поскольку за один раз рисуется только одна векторная линия, приложение никогда не прекратит реагировать на действия пользователя.