Каждая из обсуждавшихся до сих пор в этой главе технологий создания вектор_ ной графики имеет ограниченный круг применения: тег <canvas> доступен толь_ ко в броузерах Safari 1.3, Firefox 1.5 и Opera 9; технология VML может (и всегда будет) применяться только в IE, а встроенной поддержкой SVG обладает только броузер Firefox 1.5. Конечно, существуют модули поддержки SVG и для других броузеров, но эти модули пока не получили широкого распространения.
Один из мощнейших модулей векторной графики, который у многих (практиче_ ски у всех) установлен, – это Flash_плеер компании Adobe (прежде – Macrome_ dia). Flash_плеер имеет собственный язык сценариев, который называется Acti_ onScript (фактически – диалект JavaScript). Начиная с версии 6 Flash_плеер пре_ доставляет простой, но мощный прикладной интерфейс создания изображений в виде ActionScript_кода. Кроме того, Flash версий 6 и 7 предоставляет ограничен_ ные средства взаимодействия между клиентским JavaScript_кодом и Action_ Script_кодом, что дает возможность из JavaScript_сценариев посылать подклю_ чаемому Flash_модулю команды рисования, которые исполняются интерпрета_ тором ActionScript.
Материал этой главы ориентирован на Flash 8, к моменту написания этих строк данная версия была самой новой. Flash 8 включает прикладной интерфейс Exter_ nalInterface, который существенно упрощает экспорт ActionScript_методов, так что они могут совершенно прозрачно вызываться из JavaScript_сценариев. В гла_ ве 23 продемонстрировано, как вызывать методы рисования Flash 6 и 7.
Для рисования средствами Flash необходим файл с расширением .swf, который сам по себе не выполняет рисование, но экспортирует в JavaScript_сценарий прикладной интерфейс для работы с графикой.1 Мы начнем рассмотрение с Ac_ tionScript_файла, содержимое которого приводится в примере 22.12.
Пример 22.12. Canvas.as
import flash.external.ExternalInterface;
class Canvas {
// Свободно распространяемый компилятор mtasc автоматически вставит
// вызов метода main() в скомпилированный SWF_файл. Если для создания
1 Программный код примера 22.13, создающий круговую диаграмму, использует этот прикладной интерфейс рисования, но я не буду описывать его здесь. Всю необходимую документацию можно найти на веб_сайте компании Adobe.
22.6. Создание графики средствами Flash
// файла Canvas.swf вы используете Flash IDE, вам потребуется вызвать
// метод Canvas.main() из первого кадра ролика.
static function main( ) { var canvas = new Canvas( ); }
// Этот конструктор содержит код инициализации нашего Flash_класса Canvas function Canvas() {
// Определить поведение холста при изменении размеров Stage.scaleMode = "noScale";
Stage.align = "TL";
// Импортировать функции рисования Flash API ExternalInterface.addCallback("beginFill", _root, _root.beginFill); ExternalInterface.addCallback("beginGradientFill", _root,
// А также экспортировать функцию addText(), представленную далее ExternalInterface.addCallback("addText", null, addText);
}
static function addText(text, x, y, w, h, depth, font, size) {
// Создать объект TextField для визуализации текста
// в заданных координатах
var tf = _root.createTextField("tf", depth, x, y, w, h);
// Представить выводимый текст tf.text = text;
// Установить параметры шрифта текста var format = new TextFormat(); format.font = font;
format.size = size; tf.setTextFormat(format);
}
}
Программный код файла Canvas.as, представленный в примере 22.12, должен быть скомпилирован в файл Canvas.swf, прежде чем его можно будет использо_ вать в Flash_плеере. Подробное описание того, как это делается, выходит за рам_ ки темы данной книги, но вы можете воспользоваться коммерческой версией Flash IDE компании Adobe или свободно распространяемым компилятором Acti_ onScript.1
К сожалению, Flash предоставляет лишь низкоуровневый прикладной интер_ фейс. В частности, curveTo() – это единственная функция, рисующая кривые (точнее, кривые Безье второго порядка). Все окружности, эллипсы и кривые Бе_
1 Я пользуюсь свободно распространяемым компилятором mtasc (http://www. mtasc.org) и компилировал файл командойmtasc_swf Canvas.swf_main_version 8_header 500:500:1 Canvas.as. После компиляции получившийся файл имел размер всего 578 байт – много меньше, чем большинство растровых изображений.
578 Глава 22. Работа с графикой на стороне клиента
зье третьего порядка приходится аппроксимировать простейшими кривыми вто_ рого порядка. Этот низкоуровневый прикладной интерфейс отлично подходит для создания Flash_роликов в скомпилированном формате SWF: все вычисле_ ния, необходимые для создания более сложных кривых, можно выполнить на этапе компиляции, и Flash_плееру достаточно уметь рисовать простейшие кри_ вые. Высокоуровневый прикладной интерфейс можно выстроить поверх прими_ тивов, предоставляемых Flash_плеером, и его вполне можно реализовать средст_ вами ActionScript или JavaScript (пример 22.13 написан на языке JavaScript).
Пример 22.13 начинается с вспомогательной функции, выполняющей внедре_ ние файла Canvas.swf в HTML_документ. В разных броузерах эта операция вы_ полняется по_разному, а функция insertCanvas() скрывает эти различия. Вслед за ней идет функция wedge(), использующая прикладной интерфейс Flash для рисования сектора круговой диаграммы. Вслед за ней идет функция pieChart(), вызывающая функцию wedge() для рисования отдельного сектора. Заканчивает_ ся пример определением обработчика события onload, который вставляет Flash_ холст в документ и создает на нем рисунок.
Пример 22.13. Рисование круговой диаграммы средствами JavaScript и Flash
<html>
<head>
<script>
// Встраивает Flash_холст заданного размера в виде единственного
// потомка указанного контейнерного элемента. Для переносимости функция
// использует тег <embed> в Netscape_совместимых броузерах и тег <object> _ в остальных
// Идея взята из FlashObject, автор Джеф Стернс (Geoff Stearns).
// http://blog.deconcept.com/flashobject/
function insertCanvas(containerid, canvasid, width, height) { var container = document.getElementById(containerid);
if (navigator.plugins && navigator.mimeTypes&&navigator.mimeTypes.length){ container.innerHTML =