WWW.LIB.KNIGI-X.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Электронные матриалы
 


Pages:     | 1 |   ...   | 11 | 12 ||

«Программирование на ADOBE ACTIONSCRIPT 3.0 ® ® © Adobe Systems Incorporated, 2008. Все права защищены. Авторские права Программирование на Adobe® ...»

-- [ Страница 13 ] --

break;

case IMEConversionMode.KOREAN:

tf.text = "Current conversion mode is Korean.";

break;

default:

tf.text = "Current conversion mode is " + IME.conversionMode + ".";

break;

} } else { tf.text = "Please install an IME and try again.";

} Предыдущий код сначала проверяет, установлен ли редактор IME. Затем он проверяет текущий режим преобразования IME сравнивая свойство IME.conversionMode с константами класса IMEConversionMode.

–  –  –

var statusText:TextField = new TextField;

statusText.autoSize = TextFieldAutoSize.LEFT;

addChild(statusText);

if (Capabilities.hasIME) { try { IME.enabled = true;

IME.conversionMode = IMEConversionMode.KOREAN;

statusText.text = "Conversion mode is " + IME.conversionMode + ".";

} catch (error:Error) { statusText.text = "Unable to set conversion mode.\n" + error.message;

} } Предыдущий код сначала создает текстовое поле с целью отображения сообщения о состоянии для пользователя. После этого, если редактор IME установлен, код включает его и устанавливает режим корейского языка. Если в системе пользователя не установлен редактор IME, проигрыватель Flash Player или AIR выдает ошибку, которую перехватывает блок try..catch. Блок try..catch отображает сообщение об ошибке в текстовом поле, созданном ранее.

–  –  –

var phoneTxt:TextField = new TextField();

var nameTxt:TextField = new TextField();

phoneTxt.type = TextFieldType.INPUT;

phoneTxt.addEventListener(FocusEvent.FOCUS_IN, focusInHandler);

phoneTxt.addEventListener(FocusEvent.FOCUS_OUT, focusOutHandler);

phoneTxt.restrict = "0-9";

phoneTxt.width = 100;

phoneTxt.height = 18;

phoneTxt.background = true;

phoneTxt.border = true;

addChild(phoneTxt);

nameField.type = TextFieldType.INPUT;

nameField.x = 120;

nameField.width = 100;

nameField.height = 18;

nameField.background = true;

nameField.border = true;

addChild(nameField);

function focusInHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = false;

} } function focusOutHandler(event:FocusEvent):void { if (Capabilities.hasIME) { IME.enabled = true;

} } В этом примере создается два текстовых поля ввода, phoneTxt и nameTxt, а затем добавляется два прослушивателя событий для поля phoneTxt. Когда пользователь переводит фокус на текстовое поле phoneTxt, отправляется событие FocusEvent.FOCUS_IN, и редактор IME отключается. Когда текстовое поле phoneTxt теряет фокус, отправляется событие FocusEvent.FOCUS_OUT, и редактор IME включается снова.

Прослушивание событий композиции IME События композиции IME отправляются в момент задания строки композиции. Например, если пользователь включил и активировал редактор IME и вводит строку на японском, событие IMEEvent.IME_COMPOSITION будет отправлено, как только он выберет строку композиции. Чтобы прослушивать событие IMEEvent.IME_COMPOSITION, необходимо добавить прослушиватель событий для статического свойства ime в классе System (flash.system.System.ime.addEventListener(...)), как показано в следующем примере.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 692 Среда клиентской системы var inputTxt:TextField;

var outputTxt:TextField;

inputTxt = new TextField();

inputTxt.type = TextFieldType.INPUT;

inputTxt.width = 200;

inputTxt.height = 18;

inputTxt.border = true;

inputTxt.background = true;

addChild(inputTxt);

outputTxt = new TextField();

outputTxt.autoSize = TextFieldAutoSize.LEFT;

outputTxt.y = 20;

addChild(outputTxt);

if (Capabilities.hasIME) { IME.enabled = true;

try { IME.conversionMode = IMEConversionMode.JAPANESE_HIRAGANA;

} catch (error:Error) { outputTxt.text = "Unable to change IME.";

} System.ime.addEventListener(IMEEvent.IME_COMPOSITION, imeCompositionHandler);

} else { outputTxt.text = "Please install IME and try again.";

} function imeCompositionHandler(event:IMEEvent):void { outputTxt.text = "you typed: " + event.text;

} Предыдущий код создает два текстовых поля и добавляет их в список отображения. Первое текстовое поле, inputTxt, является полем ввода, в которое пользователь может ввести японский текст. Второе текстовое поле, outputTxt, является динамическим текстовым полем, в котором отображаются сообщения об ошибке и дублируется японская строка, введенная пользователем в поле inputTxt.

–  –  –

Получить файлы приложения для этого примера можно на странице www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения CapabilitiesExplorer находятся в папке Samples/CapabilitiesExplorer.

Приложение состоит из следующих файлов:

–  –  –

Обзор файла CapabilitiesExplorer Файл CapabilitiesExplorer.mxml отвечает за настройку пользовательского интерфейса для приложения CapabilitiesExplorer. Возможности пользовательской версии Flash Player или AIR будут отображаться в экземпляре компонента DataGrid в рабочей области. Также будут отображаться их возможности взаимодействия с обозревателем, если приложение запущено из HTML-контейнера и если доступен внешний API-интерфейс.

После отправки события creationComplete основного файла приложения вызывается метод initApp().

Метод initApp() вызывает метод getCapabilities() класса com.example.programmingas3.capabilities.CapabilitiesGrabber. Ниже приводится код для метода initApp().

private function initApp():void { var dp:Array = CapabilitiesGrabber.getCapabilities();

capabilitiesGrid.dataProvider = dp;

} Метод CapabilitiesGrabber.getCapabilities() возвращает упорядоченный массив возможностей AIR или Flash Player и обозревателя, который затем назначается в качестве свойства dataProvider для экземпляра компонента DataGrid с именем capabilitiesGrid в рабочей области.

Обзор класса CapabilitiesGrabber Статический метод getCapabilities() класса CapabilitiesGrabber добавляет каждое свойство класса flash.system.Capabilities в массив (capDP). Затем он вызывает статический метод getBrowserObjects() класса CapabilitiesGrabber. Метод getBrowserObjects() использует внешний API-интерфейс для получения объекта navigator обозревателя, который содержит данные о его возможностях.

Метод getCapabilities() реализуется следующим образом:

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 694 Среда клиентской системы public static function getCapabilities():Array { var capDP:Array = new Array();

capDP.push({name:"Capabilities.avHardwareDisable", value:Capabilities.avHardwareDisable});

capDP.push({name:"Capabilities.hasAccessibility", value:Capabilities.hasAccessibility});

capDP.push({name:"Capabilities.hasAudio", value:Capabilities.hasAudio});

...

capDP.push({name:"Capabilities.version", value:Capabilities.version});

var navArr:Array = CapabilitiesGrabber.getBrowserObjects();

if (navArr.length 0) { capDP = capDP.concat(navArr);

} capDP.sortOn("name", Array.CASEINSENSITIVE);

return capDP;

} Метод getBrowserObjects() возвращает массив каждого свойства в объекте navigator обозревателя. Если этот массив содержит один или несколько элементов, то массив возможностей обозревателя (navArr) добавляется к массиву возможностей Flash Player (capDP), и полученный массив сортируется в алфавитном порядке. В завершение, упорядоченный массив передается основному файлу приложения, который затем заполняет таблицу данных. Ниже приводится код для метода getBrowserObjects().

private static function getBrowserObjects():Array { var itemArr:Array = new Array();

var itemVars:URLVariables;

if (ExternalInterface.available) { try { var tempStr:String = ExternalInterface.call("JS_getBrowserObjects");

itemVars = new URLVariables(tempStr);

for (var i:String in itemVars) { itemArr.push({name:i, value:itemVars[i]});

} } catch (error:SecurityError) { // ignore } } return itemArr;

}

–  –  –

Взаимодействие с JavaScript На последнем этапе разработки приложения CapabilitiesExplorer создается сценарий JavaScript, необходимый для циклической обработки всех элементов в объекте navigator обозревателя и добавления пары «имязначение» во временный массив. Ниже приводится код для метода JavaScript JS_getBrowserObjects() в файле container.html.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 696 Среда клиентской системы Сначала код создает временный массив для хранения всех пар «имя-значение» в объекте navigator. Затем объект navigator проходит цикл for..in, в котором тип данных текущего значения оценивается для отсеивания нежелательных результатов. В этом приложении нас интересуют только строковые или логические значения, остальные типы данных (такие как функции или массивы) игнорируются. Все строковые или логические значения в объекте navigator добавляются в массив tempArr. Затем объект screen обозревателя проходит цикл for..in, и все числовые значения добавляются в массив tempArr. В завершение, временный массив преобразуется в строку с помощью метода Array.join(). В этом массиве в качестве разделителя используется амперсанд (&), что облегчает для кода ActionScript анализ данных с помощью класса URLVariables.

Глава 29. Копирование и вставка Используйте классы в API- интерфейсе буфера обмена, чтобы копировать данные в системный буфер обмена и из него в другие места назначения.

Ниже перечислены форматы данных, которые можно переносить в приложение, выполняемое в среде Adobe® AIR™ и проигрывателе Adobe® Flash® Player, и обратно:

• Растровые изображения (только для AIR)

• Файлы (только для AIR)

• Текст

• Текст в формате HTML

• Данные в формате RTF

• Строки URL (только для AIR)

• Сериализованные объекты

• Ссылки на объекты (действуют только в пределах исходного приложения) Основы копирования и вставки API-интерфейс копирования и вставки содержит следующие классы.

–  –  –

Статическое свойство Clipboard.generalClipboard представляет буфер обмена операционной системы.

Класс Clipboard обеспечивает методы для чтения и записи данных в объекты буфера обмена.

Класс HTMLLoader (в среде AIR) и класс TextField реализуют поведение по умолчанию для обычных сочетаний клавиш для копирования и вставки. Чтобы реализовать поведение сочетаний клавиш копирования и вставки для пользовательских компонентов, можно прослушивать нажатия этих клавиш непосредственно.

Также можно использовать собственные команды меню с эквивалентными сочетаниями клавиш, чтобы реагировать на нажатия опосредованно.

Различные представления одной и той же информации можно сделать доступными в одном объекте Clipboard, чтобы другие приложения могли лучше интерпретировать и использовать данные. Например, изображение можно включить как графические данные, сериализованный объект Bitmap или файл.

Визуализация данных в том или ином формате может быть отложена, поэтому формат фактически создается только в момент чтения данных в этом формате.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 698 Копирование и вставка Чтение и запись системного буфера обмена Для чтения буфера обмена операционной системы нужно вызвать метод getData() объекта

Clipboard.generalClipbooard и передать имя формата для чтения:

import flash.desktop.Clipboard;

import flash.desktop.ClipboardFormats;

if(Clipboard.generalClipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){ var text:String = Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT);

} Примечание. Содержимое, выполняемое в проигрывателе Flash Player или в AIR за пределами изолированной программной среды приложения, может вызывать метод getData() только в обработчике события paste.

Только код, выполняемый в изолированной программной среде приложения AIR, может вызывать метод getData() за пределами обработчика события paste.

Для записи данных в буфер обмена их необходимо добавить в объект Clipboard.generalClipboard в одном или нескольких форматах. Существующие данные в том же формате автоматически перезаписываются.

Однако перед записью новых данных системный буфер обмена рекомендуется очищать, чтобы удалить нерелевантные данные и в других форматах.

import flash.desktop.Clipboard;

import flash.desktop.ClipboardFormats;

var textToCopy:String = "Copy to clipboard.";

Clipboard.generalClipboard.clear();

Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, textToCopy, false);

Примечание. Содержимое, выполняемое в проигрывателе Flash Player или в AIR за пределами изолированной программной среды приложения, может вызывать метод setData() только в обработчике событий пользователя, таких как события клавиатуры, мыши, copy или cut. Только код, выполняемый в изолированной программной среде приложения AIR, может вызывать метод setData() за пределами обработчика событий пользователя.

Форматы данных буфера обмена Форматы данных буфера обмена описывают данные, помещенные в объект Clipboard. Проигрыватель Flash Player и среда AIR автоматически переводят типы данных ActionScript и форматы данных буфера обмена в стандартные форматы данных. Кроме того, объекты приложения можно переносить между приложениями, созданными на базе ActionScript, и внутри них с помощью форматов, определенных в приложении.

Объект Clipboard может содержать представления одной и той же информации в разных форматах.

Например, объект Clipboard, представляющий экземпляр Sprite, может включать формат ссылки для использования в том же приложении, сериализованный формат для использования другим приложением, выполняемым в проигрывателе Flash Player или среде AIR, формат растрового изображения для использования графическим редактором и формат списка файлов, возможно, с отложенной визуализацией для кодирования файла PNG, чтобы копировать или перетаскивать представление объекта Sprite в файловой системе.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 699 Копирование и вставка Стандартные форматы данных Константы, определяющие имена стандартных форматов, содержатся в классе ClipboardFormats.

–  –  –

RICH_TEXT_FORMAT Данные формата RTF преобразуются в класс ByteArray языка ActionScript и обратно. Разметка RTF никак не интерпретируется и не преобразуется.

–  –  –

URL_FORMAT (только для AIR) Данные в формате URL преобразуются в класс ActionScript String и обратно.

Пользовательские форматы данных Можно использовать пользовательские формате, определяемые в приложении, чтобы переносить объекты в виде ссылок или сериализованных копий. Ссылки действуют только в пределах того же приложения, выполняемом в среде AIR или проигрывателе Flash Player. Сериализованные объекты можно переносить между приложениями, выполняемыми в среде AIR или проигрывателе Flash Player, однако из можно использовать только с объектами, которые остаются действительными при сериализации и десериализации.

Обычно объекты можно сериализовать, если их свойства представлены простыми тепами или сериализуемыми объектами.

Чтобы добавить сериализованный объект в объект Clipboard задайте параметру serializable значение true при вызове метода Clipboard.setData(). В качестве имени формата можно использовать один из стандартных форматов или произвольную строку, определенную в приложении.

Режимы переноса Когда объект записывается в буфер обмена с использованием пользовательского формата данных, данные объекта могут считываться из буфера как ссылка или как сериализованная копия исходного объекта. В среде AIR определяется четыре режима переноса, в соответствии с которым объекты переносятся как ссылки либо как сериализованные копии.

–  –  –

Чтение и запись пользовательских форматов данных Записывая объект в буфер обмена, в качестве параметра формата можно использовать любую строку, которая не начинается с зарезервированных префиксов air: или flash:. Используйте ту же строку в качестве формата при чтении объекта. В следующих примерах демонстрируется чтение и запись объектов в буфере обмена.

public function createClipboardObject(object:Object):Clipboard{ var transfer:Clipboard = Clipboard.generalClipboard;

transfer.setData("object", object, true);

} Чтобы извлечь сериализованный объект из объекта Clipboard (после операции перетаскивания или вставки), используйте то же имя формата и режимы переноса cloneOnly или clonePreferred.

var transfer:Object = clipboard.getData("object", ClipboardTransferMode.CLONE_ONLY);

Ссылка всегда добавляется в объект Clipboard. Чтобы извлечь ссылку из объекта Clipboard вместо сериализованной копии (после операции перетаскивания или вставки), используйте режимы переноса originalOnly или originalPreferred.

var transferredObject:Object = clipboard.getData("object", ClipboardTransferMode.ORIGINAL_ONLY);

Ссылки действительны, только если объект Clipboard создан текущим приложением, выполняемым в среде AIR или проигрывателе Flash Player. Используйте режим переноса originalPreferred, чтобы получить ссылку, если она имеется, или сериализованную копию, если она недоступна.

Отложенная визуализация Если создавать формат данных невыгодно с точки зрения производительности, можно использовать отложенную визуализацию, применив функцию, которая предоставляет данные по требованию. Эта функция вызывается, только если получатель операции перетаскивания или вставки запрашивает данные в отложенном формате.

Функция визуализации добавляется в объект Clipboard с помощью метода setDataHandler(). Эта функция должна возвращать данные в соответствующем формате. Например, если вызван метод setDataHandler(ClipboardFormat.TEXT_FORMAT, writeText), функция writeText() должна вернуть строку.

Если в объект Clipboard добавляется формат данных того же типа с помощью метода setData(), эти данные будут иметь преимущество перед отложенной версией (функция визуализации не вызывается). Функция визуализации может вызываться или не вызываться снова при втором обращении к тем же данным буфера обмена.

Примечание. В Mac OS X отложенная визуализация поддерживается только для пользовательских форматов данных. Для стандартных форматов данных функция визуализации вызывается немедленно.

–  –  –

Когда пользователь выбирает команду Paste (Вставить) из контекстного меню целевого текстового поля, приложение обращается к буферу обмена и задает целевой текст. Так как текстовый формат данных в буфере обмена задан с использованием функции, а не строки, буфер обмена вызывает функцию renderData().

Функция renderData() возвращает текст, скопированный в исходном текстовом поле и затем назначает его целевому текстовому полю.

Обратите внимание, что если перед нажатием кнопки Paste (Вставить) в исходный текст внести изменения, они будут отражены во вставленном тексте, даже если они были сделаны после нажатия кнопки копирования.

Это объясняется тем, что функция визуализации копирует исходный текст только после нажатия кнопки вставки. (При использовании отложенной визуализации в реальном приложении рекомендуется каким-либо сохранять или защищать исходные данные, чтобы предотвратить эту проблему.) package { import flash.desktop.Clipboard;

import flash.desktop.ClipboardFormats;

import flash.desktop.ClipboardTransferMode;

import flash.display.Sprite;

import flash.text.TextField;

import flash.text.TextFormat;

import flash.text.TextFieldType;

import flash.events.MouseEvent;

import flash.events.Event;

public class DeferredRenderingExample extends Sprite { private var sourceTextField:TextField;

private var destination:TextField;

private var copyText:TextField;

public function DeferredRenderingExample():void { sourceTextField = createTextField(10, 10, 380, 90);

sourceTextField.text = "Neque porro quisquam est qui dolorem " + "ipsum quia dolor sit amet, consectetur, adipisci velit.";

copyText = createTextField(10, 110, 35, 20);

copyText.htmlText = "a href='#'Copy/a";

copyText.addEventListener(MouseEvent.CLICK, onCopy);

–  –  –

Глава 30. Печать Проигрыватели Adobe® Flash® Player и Adobe® AIR™ могут взаимодействовать с интерфейсом печати операционной системы, чтобы можно было передавать страницы спулеру печати.

Каждая страница, которую Flash Player или AIR отправляет спулеру, может включать видимое, динамическое или находящееся за пределами экрана содержимое, включая значения баз данных и динамический текст. Кроме того, проигрыватель Flash Player и среда AIR задают свойства класса flash.printing.PrintJob на основе настроек принтера пользователя, чтобы можно было соответствующим образом отформатировать страницы.

В этой главе описываются стратегии использования методов и свойств класса flash.printing.PrintJob с целью создания задания печати, считывания пользовательских настроек печати и корректирования задания печати на основе данных Flash Player или AIR и операционной системы пользователя.

Основные сведения о печати Введение в печать В ActionScript 3.0 класс PrintJob служит для создания снимков содержимого на экране, которое преобразуется в представление для печати. В некотором смысле подготовка содержимого для печати — это то же самое, что и подготовка для отображения на экране: элементы требуется разместить и подогнать по размеру под требуемый макет. Однако печать имеет особенности, отличающие ее от раскладки на экране. Например, разрешение принтеров отличается от разрешения компьютерных мониторов. Содержимое экрана является динамическим и может изменяться, а напечатанное содержимое статично по определению. При планировании печати необходимо учитывать возможность многостраничной печати.

Несмотря на очевидность этих отличий, о них следует постоянно помнить, настраивая печать с помощью ActionScript. Поскольку качество печати зависит от комбинации заданных вами значений и характеристик принтера пользователя, класс PrintJob включает свойства, позволяющие определить важные характеристики принтера, которые должны учитываться при печати.

–  –  –

Важные понятия и термины Ниже приводится список важных терминов, которые используются в данной главе.

• Спулер — это компонент операционной системы или ПО драйвера принтера, который отслеживает страницы, ожидающие печати, и отправляет их принтеру, когда он свободен.

• Ориентация страницы — это поворот печатаемого содержимого относительно страницы. Ориентация может быть горизонтальной (альбомной) и вертикальной (книжной).

• Задание печати — это страница или группа страниц, представляющая собой один отпечаток.

Работа с примерами из главы Работая с этой главой, вы можете тестировать приведенные в ней примеры кодов. Многие из примеров, использованных в главе, представляют собой небольшие фрагменты кода, а не полные рабочие примеры печати или кода, проверяющего значения. Для тестирования примеров необходимо создать элементы для печати и использовать их при работе с кодом. Последние два примера охватывают полный процесс печати.

Они включают код, определяющий содержимое для печати, а также выполняющий задания печати.

Для тестирования примеров кодов необходимо выполнить следующие действия.

1 Создайте новый документ Flash.

2 Выберите ключевой кадр в Кадре 1 временной шкалы и откройте панель «Действия».

3 Скопируйте код на панель «Сценарий».

4 В главном меню выберите «Управление» «Тестировать ролик», чтобы создать SWF-файл и протестировать пример.

Печать страницы Управлять печатью можно с помощью экземпляра класса PrintJob.

Чтобы напечатать простую страницу через проигрыватель Flash Player или AIR, необходимо последовательно вызвать четыре метода:

• new PrintJob(): создает новый экземпляр задания печати с указанным именем;

• PrintJob.start(): запускает процесс печати в операционной системе, вызывая диалоговое окно печати для пользователя, которое заполняется свойствами задания печати, доступными только для чтения.

• PrintJob.addPage(): содержит сведения о содержимом задания печати, включая объект Sprite (и всех его потомков), размер области печати и тип печати (векторный или растровый). Можно несколько раз вызывать метод addPage() для печати нескольких спрайтов на отдельных страницах;

• PrintJob.send(): отправляет страницу принтеру операционной системы.

–  –  –

package { import flash.printing.PrintJob;

import flash.display.Sprite;

public class BasicPrintExample extends Sprite { var myPrintJob:PrintJob = new PrintJob();

var mySprite:Sprite = new Sprite();

–  –  –

Примечание. Этот пример демонстрирует основные элементы сценария задания печати и не включает обработки ошибок. Чтобы создать сценарий, правильно реагирующий на отмену задания печати пользователем, см. раздел «Работа с исключениями и возвращаемыми значениями» на странице 705.

Если по какой-либо причине требуется очистить свойства объекта PrintJob, задайте переменной PrintJob значение null (например, myPrintJob = null).

Задачи проигрывателя Flash Player или AIR и системная печать Так как проигрыватель отправляет страницы интерфейсу печати операционной системы, необходимо разобраться в спектре задач, управляемых Flash Player и AIR, и задач, управляемых собственным интерфейсом печати операционной системы. Проигрыватель Flash Player или AIR может запустить задание печати, считывать некоторые параметры страницы с принтера, передавать содержимое задания печати в операционную систему и проверять, не отменено ли задание печати пользователем или системой. Другие процессы, такие как отображение диалоговых окон принтера, отмена отправленного задания печати или сообщение состояния принтера, управляются операционной системой. Проигрыватель Flash Player или AIR может реагировать на возникновение проблем, связанных с запуском или форматированием задания печати, но не может сообщать обо всех свойствах или условиях интерфейса печати операционной системы, так как он имеет доступ только к некоторым из них. Код необходимо разработать таким образом, чтобы он реагировал на эти доступные свойства и условия.

–  –  –

Если PrintJob.start() имеет значение true, то есть пользователь нажал кнопку «Печать» или проигрыватель Flash Player или AIR инициировал команду «Печать»), значит, можно вызывать методы addPage() и send().

Кроме того, чтобы облегчить управление процессом печати, проигрыватель Flash Player или AIR выдает исключения для метода PrintJob.addPage(), чтобы можно было перехватывать ошибки и предоставлять пользователю сведения и возможные пути решения. Если выполнение метода PrintJob.addPage() завершается ошибкой, можно вызвать другую функцию или остановить текущее задание печати. Для перехвата таких исключений нужно внедрить вызовы addPage() в оператор try..catch, как показано ниже.

В этом примере [params] — это место для параметров, которые определяют фактическое содержимое, предназначенное для печати.

if (myPrintJob.start()) { try { myPrintJob.addPage([params]);

} catch (error:Error) { // Handle error, } myPrintJob.send();

} После запуска задания печати можно добавлять содержимое с помощью метода PrintJob.addPage() и следить за появлением исключений (например, если пользователь отменил задание печати). Если выдается ошибка, можно добавить в инструкцию catch логику, которая будет предоставлять пользователю (или проигрывателю Flash Player или AIR) сведения и возможные решения, или же можно отменить текущее задание печати. В случае успешного добавления страницы можно перейти к отправке страниц принтеру с помощью метода PrintJob.send().

Если Flash Player или AIR сталкивается с проблемой при отправке задания печати принтеру (например, если принтер отключен), такое исключение также можно перехватить и предоставить пользователю (или проигрывателю Flash Player или AIR) сведения или возможные решения (например, путем вывода текстового сообщения или показа предупреждения в рамках анимации). Например, можно присвоить новое содержимое текстовому полю, внедренному в оператор if..else, как показано ниже.

if (myPrintJob.start()) { try { myPrintJob.addPage([params]);

} catch (error:Error) { // Handle error.

} myPrintJob.send();

} else { myAlert.text = "Print job canceled";

} ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 707 Печать Рабочий пример см. в разделе «Пример: масштабирование, обрезка и динамическая настройка» на странице 712.

Работа со свойствами страницы Когда пользователь нажимает кнопку «ОК» в диалоговом окне «Печать» и метод PrintJob.start() возвращает значение true, можно получить свойства, определенные параметрами принтера. К таким параметрам относится ширина и высота бумаги (pageHeight и pageWidth), а также ориентация содержимого на бумаге. Так как настройки принтера не контролируются проигрывателем Flash Player или AIR, их нельзя изменять. Однако их можно использовать для согласования содержимого, отправляемого принтеру, с текущими настройками. Дополнительные сведения см. в разделе «Настройка размера, масштаба и ориентации страницы» на странице 708.

Выбор векторной или растровой визуализации Задание печати можно настроить вручную так, чтобы каждая страница передавалась спулеру как векторная графика или как растровое изображение. В некоторых случаях векторная печать генерирует меньший по размеру файл подкачки и позволяет получить более качественное изображение, чем при растровой печати.

Однако, если содержимое включает растровое изображение и требуется сохранить альфа-прозрачность и цветовые эффекты, страницу необходимо печатать как растровое изображение. Кроме того, если принтер не использует драйвер PostScript, он автоматически преобразует векторную графику в растровое изображение.

Примечание. Adobe AIR не поддерживает печать векторной графики в операционной системе Mac OS.

Растровую печать можно задать в третьем параметре метода PrintJob.addPage(), передав объект PrintJobOptions со свойством printAsBitmap в значении true, как показано ниже.

var options:PrintJobOptions = new PrintJobOptions();

options.printAsBitmap = true;

myPrintJob.addPage(mySprite, null, options);

Если третий параметр не определен, задание печати будет использовать значение по умолчанию, то есть векторную визуализацию.

Примечание. Если вы не хотите определять второй параметр (printArea), но требуется задать растровую печать, передайте значение null для printArea.

Время ожидания инструкций задания печати ActionScript 3.0 не ограничивает объект PrintJob одним кадром (как это было в предыдущих версиях программы ActionScript). Однако поскольку операционная система отображает информацию о состоянии печати пользователю после нажатия кнопки «ОК» в диалоговом окне «Печать», необходимо как можно быстрее вызвать методы PrintJob.addPage() и PrintJob.send(), чтобы отправить страницы в спулер печати. Задержка при обращении к кадру, содержащему вызов PrintJob.send(), приведет к задержке процесса печати.

В ActionScript 3.0 установлен предел времени ожидания, равный 15 секундам. Поэтому время между двумя значимыми инструкциями в последовательности задания печати не может превышать 15 секунд.

Другими словами, предел времени ожидания сценария (15 секунд) применяется к следующим интервалам:

• между вызовом PrintJob.start() и первым вызовом PrintJob.addPage();

• между одним вызовом PrintJob.addPage() и следующим вызовом PrintJob.addPage();

• между последним вызовом PrintJob.addPage() и вызовом PrintJob.send().

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 708 Печать Если любой из этих интервалов длится более 15 секунд, следующий вызов метода PrintJob.start() для экземпляра PrintJob возвращает значение false, а следующее обращение к методу PrintJob.addPage() для этого экземпляра PrintJob вызывает в проигрывателе Flash Player или AIR исключение при выполнении.

Настройка размера, масштаба и ориентации страницы В разделе «Печать страницы» на странице 704 подробно описываются действия для выполнения базового задания печати, где вывод является непосредственным печатным эквивалентом размера экрана и позиции заданного спрайта. Однако принтеры имеют другое разрешение, и их настройки могут отрицательно сказаться на внешнем виде напечатанного спрайта.

Проигрыватель Flash Player или AIR может считывать параметры печати операционной системы, но эти свойства доступны только для чтения: их можно использовать в ходе настройки печати, но нельзя изменять.

Например, можно узнать настройку принтера для размера страницы и соответствующим образом отформатировать содержимое. Также можно получить настройки принтера для полей и ориентации страницы. Чтобы адекватно реагировать на настройки принтера, можно попробовать указать область печати, внести изменения с учетом разницы между разрешением экрана и принтера или преобразовать содержимое с учетом настроек принтера для размера или ориентации страницы.

Использование прямоугольников ограничения области печати Метод PrintJob.addPage() позволяет указывать область спрайта, предназначенную для печати. Второй параметр, printArea, задается как объект Rectangle. Передать значение для этого параметра можно тремя способами.

• Можно создать объект Rectangle с определенными свойствами, а затем использовать полученный прямоугольник в вызове addPage(), как показано ниже.

private var rect1:Rectangle = new Rectangle(0, 0, 400, 200);

myPrintJob.addPage(sheet, rect1);

• Если объект Rectangle еще не определен, это можно сделать в вызове метода, как показано ниже.

myPrintJob.addPage(sheet, new Rectangle(0, 0, 100, 100));

• Если требуется передать значения для третьего параметра в вызове addPage(), а прямоугольник определять не нужно, можно задать второму параметру значение null, как показано ниже.

myPrintJob.addPage(sheet, null, options);

Примечание. Если требуется указать прямоугольник для определения области печати, не забудьте импортировать класс flash.display.Rectangle.

–  –  –

Можно использовать следующие соответствия для преобразования дюймов или сантиметров в твипы или точки (твип равен 1/20 части точки):

• 1 точка = 1/72 дюйма = 20 твипов • 1 дюйм = 72 пункта = 1440 твипов • 1 сантиметр = 567 твипов Если параметр printArea пропущен или неверно передан, распечатывается вся область спрайта.

Масштабирование Если перед печатью требуется отмасштабировать объект Sprite, установите свойства масштабирования (см.

«Изменение размера и масштабирование объектов» на странице 316), прежде чем вызывать метод PrintJob.addPage(), а затем верните их в исходное состояние после выполнения печати. Масштаб объекта Sprite не связан со свойством printArea. Другими словами, если задать область печати размером 50 х 50 пикселов, будет напечатано 2500 пикселов. Если объект Sprite масштабируется, распечатываются те же 2500 пикселей, но объект Sprite при этом печатается в отмасштабированном размере.

Пример см. в разделе «Пример: масштабирование, обрезка и динамическая настройка» на странице 712.

Печать страницы с альбомной или книжной ориентацией Поскольку проигрыватель Flash Player и AIR может обнаруживать параметры ориентации, в код ActionScript можно добавить логику для изменения размера содержимого или его поворота в соответствии с настройками принтера, как показано в следующем примере.

if (myPrintJob.orientation == PrintJobOrientation.LANDSCAPE) { mySprite.rotation = 90;

} Примечание. Если планируется считывать системные настройки для ориентации содержимого на странице, необходимо импортировать класс PrintJobOrientation. Класс PrintJobOrientation содержит константы, определяющие ориентацию содержимого на странице. Для импорта класса используется следующая инструкция:

import flash.printing.PrintJobOrientation;

Настройка высоты и ширины страницы Используя стратегию, подобную обработке настроек принтера для ориентации, можно считывать настройки для высоты и ширины страницы и учесть их, внедрив логику в инструкцию if.

В качестве примера можно привести следующий код:

if (mySprite.height myPrintJob.pageHeight) { mySprite.scaleY =.75;

}

–  –  –

Пример: многостраничное задание печати Если печатается две и более страницы содержимого, можно связать каждую страницу с отдельным спрайтом (в данном случае sheet1 и sheet2) и вызвать для каждого спрайта метод PrintJob.addPage().

Этот прием демонстрируется в следующем примере:

package { import flash.display.MovieClip;

import flash.printing.PrintJob;

import flash.printing.PrintJobOrientation;

import flash.display.Stage;

import flash.display.Sprite;

import flash.text.TextField;

import flash.geom.Rectangle;

public class PrintMultiplePages extends MovieClip { private var sheet1:Sprite;

private var sheet2:Sprite;

–  –  –

private function createSheet(sheet:Sprite, str:String, imgValue:Object):void { sheet.graphics.beginFill(0xEEEEEE);

sheet.graphics.lineStyle(1, 0x000000);

sheet.graphics.drawRect(0, 0, 100, 200);

sheet.graphics.endFill();

–  –  –

Пример: масштабирование, обрезка и динамическая настройка В некоторых случаях может потребоваться изменить размер (или другие свойства) экранного объекта при печати, чтобы компенсировать различия между тем, как он отображается на экране и печатается на бумаге.

Настраивая свойства экранного объекта перед печатью (например, свойства scaleX и scaleY), помните, что если отмасштабированный объект становится больше прямоугольника, определенного для области печати, он будет обрезан. Кроме того, после печати страниц, вероятно, потребуется восстановить исходные свойства.

Следующий код масштабирует размеры экранного объекта txt (но не зеленого фонового окна), в результате чего текстовое поле обрезается по размерам определенного прямоугольника. После печати размер текстового поля восстанавливается для отображения на экране. Если пользователь отменит задание печати через диалоговое окно «Печать» операционной системы, содержимое в проигрывателе Flash Player или AIR изменится, чтобы сообщить пользователю о том, что задание отменено.

package { import flash.printing.PrintJob;

import flash.display.Sprite;

import flash.text.TextField;

import flash.display.Stage;

import flash.geom.Rectangle;

public class PrintScaleExample extends Sprite { private var bg:Sprite;

private var txt:TextField;

–  –  –

Глава 31. Использование внешнего API Внешний API в ActionScript 3.

0 позволяет ActionScript и приложению контейнера, в котором запущен проигрыватель Adobe Flash Player, напрямую обмениваться информацией. Существует ряд ситуаций, в которых может потребоваться использование внешнего API. Например, это может происходить при создании взаимодействия между документом SWF и JavaScript на странице HTML или при создании приложения для настольной системы, где для показа SWF-файла используется проигрыватель Flash Player.

В этой главе описывается метод использования внешнего API для взаимодействия с приложением контейнера, способ передачи данных между ActionScript и JavaScript на странице HTML, а также метод установки подключения и обмена данными между ActionScript и настольным приложением.

Примечание. В этой главе описывается только связь между ActionScript в SWF-файле и приложением контейнера, включающем ссылку на Flash Player или экземпляр, в который загружен SWF-файл. Любое другое использование Flash Player в приложении находится вне области действия этой документации. Flash Player разработан для использования в качестве подключаемого модуля веб-обозревателя или проектора (автономное приложение). Другие сценарии применения могут иметь ограниченную поддержку.

Основы использования внешнего API Вводные сведения об использовании внешнего API Хотя в некоторых случаях SWF-файл может выполняться самостоятельно (например, при создании проектора SWF-файлов), в большинстве ситуаций приложение SWF выполняется как элемент внутри другого приложения. Как правило, контейнер, который включает SWF-файл, является файлом HTML. Несколько менее часто SWF-файл используется для всего пользовательского интерфейса приложения для настольной системы или для ее части.

Так как вы работаете над более сложными приложениями, возможно, потребуется установить связь между SWF-файлом и приложением-контейнером. Например, зачастую на веб-странице текст и другая информация показаны в виде HTML, а SWF-файл включен для показа динамического визуального содержимого (например, диаграммы или видеофайла). В данном случае может быть необходимо сделать так, что если пользователи нажимают кнопку на веб-странице, что-то изменяется в SWF-файле. ActionScript содержит механизм, который называется внешним API и который упрощает этот тип связи между ActionScript в SWFфайле и другим кодом в приложении контейнера.

–  –  –

Важные понятия и термины Ниже приводится список важных терминов, которые используются в данной главе.

• Контейнер ActiveX: приложение контейнера (не веб-обозреватель), включающее экземпляр элемента управления ActiveX для Flash Player, применяемое в целях показа содержимого SWF-файла в приложении.

• Приложение контейнера: приложение, в котором Flash Player выполняет SWF-файл (например, вебобозреватель и HTML-страница, включающая содержимое Flash Player).

• Проектор: SWF-файл, который был преобразован в автономный исполняемый файл, включающий Flash Player, а также содержимое SWF-файла. Проектор можно создать в Adobe Flash CS4 Professional или с помощью автономного проигрывателя Flash Player. Проекторы обычно применяются для распределения SWF-файлов по компакт-дискам или в иных ситуациях, когда размер загрузки неважен, а автор SWF-файла хочет быть уверен, что пользователь сможет выполнить SWF-файл независимо от того, установлен ли Flash Player на компьютере пользователя.

• Прокси-сервер: приложение-посредник или код, который вызывает код в одном приложении («внешнем приложении») со стороны другого приложения («вызывающего приложения») и возвращает значения вызывающему приложению. Прокси-сервер можно использовать в различных целях.

• Чтобы упростить процесс выполнения вызовов внешней функции путем преобразования исходных вызовов функции в формат, который понимается внешним приложением.

• Чтобы обойти ограничения безопасности или другие ограничения, которые не позволяют вызывающему напрямую связываться с внешним приложением.

• Сериализация: преобразование объектов или значений данных в формат, который может использоваться для передачи значений в сообщениях между двумя системами программирования (например, по Интернету или между двумя приложениями, запущенными на одном и том же компьютере).

Работа с примерами из главы Работая с этой главой, вы можете тестировать приведенные в ней примеры кодов. Многие примеры кода в этой главе являются небольшими примерами, созданными в демонстрационных целях, а не полными рабочими примерами кода, проверяющего значения. Поскольку использование внешнего API требует (по определению) составления кода ActionScript, а также кода в приложении контейнера, проверка примеров включает создание контейнера (например, веб-страницы, содержащей SWF-файл) и использование распечаток кода для взаимодействия с контейнером.

Чтобы проверить пример связи между ActionScript и JavaScript, выполните следующие действия.

1 Создайте новый документ в инструменте разработки Flash и сохраните его на компьютере.

2 В основном меню выберите «Файл» «Параметры публикации».

3 В диалоговом окне «Параметры публикации» на вкладке «Форматы» убедитесь в том, что установлены флажки Flash и HTML.

4 Нажмите кнопку «Опубликовать». Это приводит к созданию SWF-файла и HTML-файла в той же папке и с тем же именем, которое использовалось для сохранения документа Чтобы закрыть диалоговое окно «Параметры публикации», нажмите кнопку «OК».

5 Снимите флажок «HTML». После того, как HTML-страница создана, необходимо изменить ее, чтобы добавить соответствующий код JavaScript. Снятие флажка «HTML» приводит к тому, что после изменения HTML-страницы Flash не станет перезаписывать ваши изменения, показывая новую HTML-страницу при публикации SWF-файла.

6 Чтобы закрыть диалоговое окно «Параметры публикации», нажмите кнопку «OК».

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 716 Использование внешнего API 7 Откройте в текстовом редакторе или редакторе HTML файл HTML, созданный Flash при публикации SWFфайла.

В исходном коде HTML добавьте начальный и завершающий тег script, а затем скопируйте в них код JavaScript из примера кода:

8 Сохраните файл HTML и вернитесь в программу Flash.

9 Выберите ключевой кадр в Кадре 1 временной шкалы и откройте панель «Действия».

10 Скопируйте код ActionScript на панель «Сценарий».

11 Выберите в основном меню «Файл» «Опубликовать», чтобы обновить SWF-файл, внеся в него изменения.

12 Откройте с помощью веб-обозревателя HTML-страницу, которую вы отредактировали, для просмотра страницы и проверьте связь между ActionScript и страницей HTML.

Чтобы проверить пример связи между контейнерами ActionScript, выполните следующие действия.

1 Создайте новый документ в инструменте разработки Flash и сохраните его на компьютере. Его можно сохранить в той папке, где ваше приложение контейнера обычно ищет SWF-файл.

2 В основном меню выберите «Файл» «Параметры публикации».

3 В диалоговом окне «Параметры публикации» на вкладке «Форматы» убедитесь в том, что установлен только флажок Flash.

4 В поле «Файл», расположенном возле флажка «Flash», щелкните значок папки, чтобы выбрать папку, в которой следует опубликовать SWF-файл. Выбрав местоположение своего SWF-файла, можно, например, сохранить документ Flash в одной папке, а опубликованный SWF-файл в другой папке (допустим, в папке, содержащей исходный код приложения контейнера).

5 Выберите ключевой кадр в Кадре 1 временной шкалы и откройте панель «Действия».

6 Скопируйте код ActionScript из примера на панель «Сценарий».

7 Выберите в основном меню «Файл» «Опубликовать», чтобы заново опубликовать SWF-файл.

8 Создайте и выполните свое приложение контейнера, чтобы проверить связь между ActionScript и приложением контейнера.

В конце этой главы приведены два полных примера использования внешнего API для обмена данными между страницей HTML и приложением для настольной системы на C# соответственно. Эти экземпляры содержат полный код, включая ActionScript и код проверки контейнера, который необходимо применять при создании кода с помощью внешнего API. Еще один полноценный случай с применением внешнего API приведен в примере класса ExternalInterface из справочника по языку ActionScript 3.0 и компонентам.

Требования к внешнему API и преимущества Внешний API является частью ActionScript, которая обеспечивает механизм для связи между ActionScript и кодом, запущенным во «внешнем приложении», который выступает в роли контейнера для Flash Player (обычно это веб-обозреватель или автономное приложение проектора). В ActionScript 3.0 функциональные возможности внешнего API обеспечиваются классом ExternalInterface. В версиях, появившихся перед версией Flash Player 8, действие fscommand() использовалось для осуществления связи с приложением контейнера.

Класс ExternalInterface заменяет fscommand(), и его рекомендуется применять для любых видов связи между JavaScript и ActionScript.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 717 Использование внешнего API Примечание. Если потребуется воспользоваться старой функцией fscommand() (например, для сохранения совместимости со старыми приложениями или взаимодействия со сторонним приложением контейнера SWF или автономным проигрывателем Flash Player), она остается доступна на уровне пакета в пакете flash.system.

Класс ExternalInterface является подсистемой, которая позволяет легко связываться из ActionScript и Flash Player с кодом JavaScript на странице HTML или с любым приложением для настольных систем, включающим экземпляр Flash Player.

Класс ExternalInterface доступен только при следующих условиях:

• во всех поддерживаемых версиях Internet Explorer для Windows (5.0 и выше);

• в приложении контейнера (например, в качестве приложения для настольных систем) с помощью экземпляра элемента управления ActiveX для Flash Player;

• в любом обозревателе, который поддерживает интерфейс NPRuntime, включая на данный момент версии, начиная с Firefox 1.0, Mozilla 1.7.5, Netscape 8.0 и Safari 1.3.

Во всех остальных ситуациях (например, при запуске в автономном проигрывателе) свойство ExternalInterface.available возвращает значение false.

Из ActionScript можно вызвать функцию JavaScript на странице HTML.

Внешний API предлагает следующие усовершенствованные функции по сравнению с fscommand():

• Можно воспользоваться любой функцией JavaScript, а не только функциями, которые можно применять вместе с функцией fscommand().

• Можно передать любое количество аргументов с любыми именами, не ограничиваясь передачей команды и однострочного аргумента. Это придает внешнему API гораздо больше гибкости, чем методу fscommand().

• Передавать можно различные типы данных (например, Boolean, Number и String), а не только параметры String.

• Можно получить значение вызова, и это значение немедленно вернется в ActionScript (как возвращаемое значение выполняемого вызова).

Важная информация. Если имя, присвоенное экземпляру Flash Player на странице HTML (атрибут id для тега object), включает дефис (-) или другие символы, определенные в качестве операторов в JavaScript (например, +, *, /, \,. и т. д.), вызовы ExternalInterface из ActionScript не будут работать, если веб-страница контейнера просматривается в Internet Explorer.Кроме того, если теги HTML, определяющие экземпляр Flash Player (теги object и embed), вложены в тег HTML form, вызовы ExternalInterface из ActionScript не сработают.

Использование класса ExternalInterface Обмен данными между ActionScript и приложением контейнера может принимать две формы: ActionScript может вызвать код (как в функции JavaScript), определенный в контейнере, либо код в контейнере может вызвать функцию ActionScript, которая была разработана с учетом возможности вызова. В любом случае информацию можно отправить к вызываемому коду, а результаты вернуть коду, который совершил вызов.

Чтобы упростить обмен данными, класс ExternalInterface включает два статических свойства и два статических метода. Эти свойства и методы используются для получения информации о подключении внешнего интерфейса, для выполнения кода в контейнере из ActionScript и для того, чтобы функции ActionScript можно было бы вызвать с помощью контейнера.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.

0 В FLASH 718 Использование внешнего API Получение сведений о внешнем контейнере Свойство ExternalInterface.available указывает, находится ли текущий Flash Player в контейнере, имеющем внешний интерфейс. Если внешний интерфейс имеется, свойство принимает значение true; в противном случае — false. Перед использованием любых других функций в классе ExternalInterface необходимо всегда проверять, что текущий контейнер поддерживает обмен данными с внешним интерфейсом.

Это делается следующим образом:

if (ExternalInterface.available) { // Perform ExternalInterface method calls here.

} Примечание. Свойство ExternalInterface.available говорит о том, принадлежит ли текущий контейнер типу, поддерживающему возможность подключения ExternalInterface. Оно не предназначено для информирования о том, включен ли JavaScript в текущем обозревателе.

Свойство ExternalInterface.objectID позволяет определить уникальный идентификатор экземпляра Flash Player (особенно атрибут id тега object в Internet Explorer или атрибут name тега embed в обозревателях с помощью интерфейса NPRuntime). Этот уникальный идентификатор представляет текущий SWF-документ в обозревателе. Его можно использовать для ссылок на SWF-документ (например, при вызове функции JavaScript на странице HTML контейнера). Когда контейнер Flash Player не является веб-обозревателем, этому свойству присваивается значение null.

Вызов внешнего кода из ActionScript Метод ExternalInterface.call() выполняет код в приложении контейнера. Он требует наличия по крайней мере одного параметра (строки, содержащей имя функции, которую необходимо вызвать в приложении контейнера). Любые дополнительные параметры, переданные методу ExternalInterface.call(), передаются в контейнер как параметры вызова функции.

// calls the external function "addNumbers" // passing two parameters, and assigning that function's result // to the variable "result" var param1:uint = 3;

var param2:uint = 7;

var result:uint = ExternalInterface.call("addNumbers", param1, param2);

Если контейнер является страницей HTML, этот метод запускает функцию JavaScript с указанным именем, которая должна быть определена в элементе script на той странице HTML, где он содержится. Возвращаемое значение функции JavaScript передается обратно в ActionScript.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 719 Использование внешнего API Если контейнер находится в каком-либо другом контейнере ActiveX, этот метод заставляет элемент управления ActiveX для Flash Player отправить событие FlashCall. Flash Player преобразует имя функции и имеющиеся параметры в строку XML. Контейнер может выполнять доступ к этой информации в свойстве request объекта события и использовать его для определения метода выполнения собственного кода. Чтобы вернуть значение в ActionScript, код контейнера вызывает метод SetReturnValue() объекта ActiveX, передавая результат (последовательно представленный в виде строки XML) в качестве параметра этого метода. Дополнительные сведения о формате XML, использованном для этой связи, см. в разделе «Формат XML внешнего API» на странице 720.

Независимо от того, является ли контейнер веб-обозревателем или другим контейнером ActiveX, если вызов неудачен или метод контейнера не указывает возвращаемое значение, возвращается null. Метод ExternalInterface.call() выдает исключение SecurityError, если содержащая его среда принадлежит к изолированной программной среде, к которой не имеет доступа вызывающий код. Эту проблему можно обойти, установив соответствующее значение allowScriptAccess в среде, содержащей метод. Например, чтобы изменить значение allowScriptAccess на странице HTML, вам необходимо изменить соответствующий атрибут в тегах object и embed.

Вызов кода ActionScript из контейнера Контейнер может вызвать только тот код ActionScript, который находится в функции — он не может вызвать никакой другой код ActionScript. Чтобы вызвать функцию ActionScript из приложения контейнера, необходимо сделать две вещи: зарегистрировать функцию в классе ExternalInterface, а затем вызвать ее из кода контейнера.

Во-первых, необходимо зарегистрировать вашу функцию ActionScript, чтобы указать, что она должна быть доступна контейнеру.

Воспользуйтесь методом ExternalInterface.addCallback() следующим образом:

function callMe(name:String):String { return "busy signal";

} ExternalInterface.addCallback("myFunction", callMe);

Метод addCallback() принимает два параметра. Первый из них — это имя функции в виде объекта String. Это имя, под которым функция будет известна в контейнере. Второй параметр — это фактическая функция ActionScript, которая будет выполняться при вызове контейнером определенного имени функции. Поскольку это разные имена, можно указать имя функции, которое будет использоваться в качестве контейнера, даже если фактическая функция ActionScript имеет другое имя. Это особенно полезно, если имя функции неизвестно (например, если указывается анонимная функция или если подлежащая вызову функция определяется во время выполнения).

После регистрации функции ActionScript в классе ExternalInterface контейнер может вызвать эту функцию.

Метод вызова зависит от типа контейнера. Например, код JavaScript в веб-обозревателе вызывает функцию ActionScript с помощью зарегистрированного имени функции, как если бы это был метод объекта обозревателя Flash Player (то есть, метод объекта JavaScript, отражающий тег object или embed). Иными словами, передаются параметры, а результат возвращается так, как если бы вызывалась локальная функция.

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 720 Использование внешнего API

...object id="flashObject"...... embed name="flashObject"...//object

Кроме того, при вызове функции ActionScript в SWF-файле, запущенном в приложении для настольных систем, зарегистрированное имя функции и любые параметры должны быть представлены в виде строки формата XML. Затем вызов выполняется путем обращения к метолу CallFunction() элемента управления ActiveX, где в качестве параметра выступает строка XML. Дополнительные сведения о формате XML, использованном для этой связи, см. в разделе «Формат XML внешнего API» на странице 720.

В любом случае значение, возвращаемое функцией ActionScript, передается обратно в код контейнера.

Передача осуществляется напрямую в виде значения, когда вызывающей стороной является код JavaScript в обозревателе, либо в виде значения в формате XML, когда вызов выполняется контейнером ActiveX.

Формат XML внешнего API Связь между ActionScript и приложением, в котором находится элемент управления ActiveX для Shockwave Flash, реализуется с помощью формата XML, используемого для кодирования вызовов функции и значений.

Существует две части формата XML, использованного внешним API. Один формат применяется для представления вызовов функции. Другой формат применяется для представления отдельных значений. Этот параметр используется для обозначения параметров в функциях, а также значений, возвращаемых функциями. Формат XML для вызовов функций применяется для вызовов кода ActionScript и из самого кода ActionScript. При вызове функции из ActionScript Flash Player передает XML в контейнер. Если вызов осуществляется из контейнера, Flash Player ожидает, что приложение контейнера передаст строку XML в этом формате.

В следующем фрагменте XML показан пример вызова функции в формате XML:

invoke name="functionName" returntype="xml" arguments... (individual argument values) /arguments /invoke Корневой узел носит имя invoke. У него есть два атрибута: name указывает на имя вызываемой функции, а returntype всегда присваивается значение xml. Если вызов функции включает параметры, узел invoke имеет дочерний узел arguments, чьи дочерние узлы являются значениями параметров, имеющими формат отдельных значений, как указано ниже.

Отдельные значения, включая параметры функций и возвращаемые ими значения, используют схему форматирования, которая включает сведения о типе данных помимо фактических значений. В следующей таблице перечислены классы ActionScript. Для кодирования значений с этим типом данных применяется формат XML.

–  –  –

Примечание. В качестве примера в этой таблице указаны эквивалентные классы C# помимо классов ActionScript. Однако внешний API можно использовать для связи с любым языком программирования или средой выполнения, которая поддерживает элементы управления ActiveX и не ограничивается приложениями на C#.

При составлении собственных приложений с применением внешнего API и приложения контейнера ActiveX, вы, возможно, сочтете удобным создание прокси-сервера, который осуществит задачу преобразования собственных вызовов функции в последовательный формат XML. Пример класса прокси-сервера, написанного на C#, представлен в разделе «Подробно о классе ExternalInterfaceProxy» на странице 731.

Пример: использование внешнего API с контейнером веб-страницы Этот образец приложения демонстрирует применение подходящих методов обмена данными между ActionScript и JavaScript в веб-обозревателе в контексте приложения для мгновенного обмена сообщениями, которое позволяет человеку участвовать в чате с самим собой (отсюда и имя приложения: Introvert IM).

Пересылка сообщений между формой HTML на веб-странице и интерфейсом SWF выполняется с помощью внешнего API.

В этом примере показаны, например, следующие методы:

• Правильная инициация обмена данными путем проверки готовности обозревателя к связи перед установкой подключения

• Проверка наличия у контейнера поддержки внешнего API ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 722 Использование внешнего API

• Вызов функций JavaScript из ActionScript, передача параметров и получение в ответ значений

• Предоставление возможности вызова с помощью JavaScript методов ActionScript и выполнение этих вызовов Чтобы загрузить файлы приложения для этого образца, перейдите на сайт www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы приложения Introvert IM находятся в папке Samples/IntrovertIM_HTML. Приложение состоит из следующих файлов.

–  –  –

Подготовка связи между ActionScript и обозревателем Одно из наиболее частых применений внешнего API состоит в том, чтобы позволять приложениям ActionScript связываться с обозревателем. С помощью внешнего API методы ActionScript могут вызывать код, написанный на языке JavaScript, и наоборот. Из-за сложности обозревателей и их метода внутренней визуализации страниц не существует метода, гарантирующего, что документ SWF зарегистрирует обратные вызовы перед тем, как будет запущен первый код JavaScript на HTML-странице. По этой причине перед вызовом функций в SWF-документе из JavaScript ваш SWF-документ должен всегда вызывать HTMLстраницу, чтобы уведомить ее о том, что SWF-документ готов к приему подключений.

Например, выполнив ряд действий с применением класса IMManager, Introvert IM определяет, готов ли обозреватель для связи, и подготовить SWF-файл для связи. Первый шаг состоит в определении времени, когда обозреватель готов для связи.

Он выполняется в конструкторе IMManager следующим образом:

ПРОГРАММИРОВАНИЕ НА ACTIONSCRIPT 3.0 В FLASH 723 Использование внешнего API public function IMManager(initialStatus:IMStatus) { _status = initialStatus;

–  –  –

Первым делом код проверяет, доступен ли внешний API в текущем контейнере с помощью свойства ExternalInterface.available. При этом он приступает к установке подключения. Поскольку исключения, связанные с безопасностью, и другие ошибки могут происходить при попытке связи с внешним приложением, код упакован в блок try (соответствующие блоки catch были пропущены при перечислении для краткости).

Затем код вызывает метод isContainerReady():

private function isContainerReady():Boolean { var result:Boolean = ExternalInterface.call("isReady");

return result;

}

–  –  –

Функция isReady() просто возвращает значение переменной jsReady. Этой переменной исходно присвоено значение false; после запуска события onload на веб-странице переменная принимает значение true. Другим словами, если ActionScript вызывает функцию isReady() перед загрузкой страницы, JavaScript возвращает false для ExternalInterface.call("isReady"), а метод ActionScript isContainerReady() возвращает соответственно значение false. После завершения загрузки страницы функция JavaScript isReady() возвращает значение true. Поэтому метод isContainerReady() в ActionScript также возвращает true.

В конструкторе IMManager происходит одно из двух событий в зависимости от готовности контейнера. Если isContainerReady() возвращает true, код просто вызывает метод setupCallbacks(), который завершает процесс установки связи с JavaScript. С другой стороны, если isContainerReady() возвращает false, процесс по существу откладывается. Создается объект Timer, которому дается инструкция вызывать метод

timerHandler() раз в 100 миллисекунд:

private function timerHandler(event:TimerEvent):void { // Check if the container is now ready.

var isReady:Boolean = isContainerReady();

if (isReady) { // If the container has become ready, we don't need to check anymore, // so stop the timer.

Timer(event.target).stop();

// Set up the ActionScript methods that will be available to be // called by the container.

setupCallbacks();

} }

–  –  –

Предоставление методов ActionScript JavaScript Как показано в предыдущем примере, после того, как код определяет, что обозреватель готов, вызывается метод setupCallbacks().

Этот метод готовит ActionScript для принятия вызовов со стороны JavaScript, как указано ниже:

private function setupCallbacks():void { // Register the SWF client functions with the container ExternalInterface.addCallback("newMessage", newMessage);

ExternalInterface.addCallback("getStatus", getStatus);

// Notify the container that the SWF is ready to be called.

ExternalInterface.call("setSWFIsReady");

} Метод setCallBacks() завершает задачу подготовки связи с контейнером путем вызова метода ExternalInterface.addCallback() для регистрации двух методов, которые можно будет вызвать из JavaScript. В этом коде первый параметр (имя, под которым этот метод известен JavaScript ("newMessage" и "getStatus") идентичен имени метода в ActionScript. В данном случае использование других имен не давало преимущества, поэтому для простоты повторно применялось одно и то же имя. В итоге метод ExternalInterface.call() использовался для вызова функции JavaScriptsetSWFIsReady(), которая уведомляет контейнер о том, что функции ActionScript были зарегистрированы.

Связь между ActionScript и обозревателем Приложение Introvert IM демонстрирует целый ряд примеров вызова функций JavaScript на странице контейнера. В простейшем случае (пример из метода setupCallbacks()) функция setSWFIsReady() в

JavaScript вызывается без передачи каких-либо параметров или получения в ответ значения:

ExternalInterface.call("setSWFIsReady");

В другом примере из метода isContainerReady() ActionScript вызывает функцию isReady() и получает в ответ логическое значение:

var result:Boolean = ExternalInterface.call("isReady");

Передать параметры функциям JavaScript можно также с помощью внешнего API.

Рассмотрим, к примеру, метод sendMessage() класса IMManager, который вызывается, когда пользователь отправляет новое сообщение своему «собеседнику»:

public function sendMessage(message:String):void { ExternalInterface.call("newMessage", message);

}

–  –  –

Вызов кода ActionScript из JavaScript Связь предполагает двусторонний обмен, и приложение Introvert IM не является исключением. Не только клиент системы мгновенного обмена сообщениями в проигрывателе Flash Player вызывает JavaScript для отправки сообщений. HTML-форма также вызывает код JavaScript для отправки сообщений и запроса информации из SWF-файла. Например, когда SWF-файл уведомляет контейнер о том, что он закончил устанавливать контакт и готов к связи, обозреватель первым делом вызывает метод getStatus() класса IMManager, чтобы узнать исходное состояние доступности пользователя из клиента системы мгновенного обмена сообщениями SWF.

Это выполняется на веб-странице функции updateStatus() следующим образом:

Код проверяет значение переменной swfReady, которая следит за тем, уведомил ли SWF-файл обозреватель о том, что он зарегистрировал свои методы в классе ExternalInterface. Если SWF-файл готов к приему связи, следующая строка (var currentStatus =...) фактически вызывает метод getStatus() в классе IMManager. В этой строке происходят три события.

• Вызывается функция getSWF() для JavaScript, которая возвращает ссылку на объект JavaScript, представляющий SWF-файл. Параметр, переданный getSWF(), определяет, какой объект обозревателя возвращается в том случае, если на HTML-странице имеется более одного SWF-файла. Значение, переданное этому параметру, должно соответствовать атрибуту id тега object и атрибуту name тега embed, используемым для включения SWF-файла.

• С помощью ссылки на SWF-файл метод getStatus() вызывается так, как если бы он был методом объекта SWF. В данном случае применяется имя «getStatus», потому что это то имя, под которым зарегистрирована функция ActionScript с помощью метода ExternalInterface.addCallback().

• Метод getStatus() для ActionScript возвращает значение, и это значение присваивается переменной currentStatus, которая затем назначается в качестве содержимого (свойство value) текстового поля status.

Примечание. Если вы внимательно отслеживаете код, то, вероятно, заметили, что в исходном коде для функции updateStatus() строка кода, вызывающая функцию getSWF(), на самом деле записана следующим образом: var currentStatus = getSWF("${application}").getStatus(). Текст ${application} является местозаполнителем в шаблоне страницы HTML. Когда Adobe Flex Builder 3 создает конкретную страницу HTML для приложения, этот местозаполнитель заменяется тем же текстом, который используется в качестве атрибута id тега object и атрибута name тега embed (в данном примере это текст IntrovertIMApp). Именно это значение и ожидается функцией getSWF().

–  –  –

Метод newMessage() для ActionScript ожидает один параметр. Поэтому переменная message для JavaScript передается в ActionScript. Она служит в качестве параметра при вызове метода newMessage() в коде JavaScript.

Определение типа обозревателя Из-за различий в методе доступа обозревателей к содержимому важно всегда применять JavaScript, чтобы определить выбранный пользователем обозреватель и вызвать ролик в соответствии с синтаксисом для конкретного обозревателя с помощью объекта окна или документа, как показано в функции getSWF() для

JavaScript в этом примере:

Если в вашем сценарии не определен тип обозревателя пользователя, пользователь может столкнуться с неожиданным поведением при воспроизведении SWF-файлов в контейнере HTML.

–  –  –

Приложение для настольной системы в этом примере написано на языке C# с помощью Microsoft Visual Studio.NET. Предметом обсуждения служат конкретные методы работы с внешним API с помощью элемента управления ActiveX. Этот пример предполагает следующее.

• Вызов функций ActionScript из приложения для настольных систем, в котором содержится элемент управления Flash Player ActiveX

• Получение вызовов функции из ActionScript и их обработка в контейнере ActiveX

• Использование класса прокси-сервера для скрытия сведений об упорядоченном формате XML, который используется Flash Player для сообщений, отправленных в контейнер ActiveX Чтобы загрузить файлы приложения для этого образца, перейдите на сайт www.adobe.com/go/learn_programmingAS3samples_flash_ru. Файлы Introvert IM C# находятся в папке Samples/IntrovertIM_CSharp. Приложение состоит из следующих файлов.

–  –  –

Обзор приложения Introvert IM на языке C# Этот образец при

Pages:     | 1 |   ...   | 11 | 12 ||
Похожие работы:

«ПРАВИТЕЛЬСТВО МОСКВЫ ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ г. МОСКВЫ СЕВЕРО-ЗАПАДНОЕ ОКРУЖНОЕ УПРАВЛЕНИЕ ОБРАЗОВАНИЯ ГОУ СОШ № 1298 125466, г. Москва, ул. Юровская, д. 97, тел./факс: 8-499-501-28-92 (94) www.school1298.ru E-mail: school1298@yandex.ru Конкурс "Лучшая школьная библиотека"Номинация: "Созд...»

«Крылова И.В, Пивоварова Л.М., Савина А.В., Ягунова Е.В. Исследование новостных сегментов российской "снежной революции": вычислительный эксперимент и интуиция лингвистов // Понимание в коммуникации: Человек в информацио...»

«Известия высших учебных заведений. Поволжский регион МАШИНОСТРОЕНИЕ И МАШИНОВЕДЕНИЕ УДК 004.8:621.923. А. А. Игнатьев, А. В. Каракозова АНАЛИЗ ИНФОРМАТИВНОСТИ ВИБРОАКУСТИЧЕСКИХ ПАРАМЕТРОВ ПРИ КОНТРОЛЕ ДИНАМИЧЕСКОГО СОСТОЯНИЯ СТАНКОВ Аннотация. Актуальность и цели. Системе мониторинга технологического...»

«Встречайте: новый ПЛК110. ОВЕН ПЛК110 NEW.ПРЕДПОСЫЛКИ ПОЯВЛЕНИЯ НОВОГО КОНТРОЛЛЕРА. Почему компания ОВЕН решила делать новый ПЛК110 1. Существовал ряд пожеланий к выпускаемому контроллеру 2. Удовлетворить новые требованиями рынка ПЛК:• Увеличение вычислительных мощностей кон...»

«Что такое основные средства Основные средства это здания, сооружения, различные приборы, вычислительная техника, автомашины и многие другие объекты, которые не потребляются в ходе производства, хотя участвуют в нем. Например, в столярной мастерской стоит токарный станок, с помощью...»

«Всеволод Несвижский Санкт-Петербург "БХВ-Петербург" УДК 681.3.068 ББК 32.973.26-018.1 Н55 Несвижский В. Н55 Программирование аппаратных средств в Windows. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2008. —...»

«ИНФОРМАЦИОННО-ВЫЧИСЛИТЕЛЬНЫЕ СИСТЕМЫ И КОМПЛЕКСЫ УДК 519.6 В.И. Агошков, М.В. Ассовский, С.В. Гиниатулин, Н.Б. Захарова, Г.В. Куимов, И.Е. Пармузин, В.В. Фомин Институт вычислительной математики Российской академии наук, г. Москва ИНФОРМАЦИОННО-ВЫЧИСЛИТЕЛЬНАЯ СИСТЕМА ВАРИАЦИОННОЙ АССИМИЛЯЦИИ ДАНН...»

«Муниципальное бюджетное общеобразовательное учреждение средняя общеобразовательная школа №10 с углубленным изучением отдельных предметов Щёлковского муниципального района Московской области УТ...»

«Российская академия наук ИНСТИТУТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ Информационно-вычислительная система вариационной ассимиляции данных измерений ИВС-T2 Агошков В.И., Ботвиновский Е.А., Гусев А.В., Кочуров А.Г., Лебед...»

«Федеральное агентство связи Федеральное государственное бюджетное образовательное учреждение высшего образования "Сибирский государственный университет телекоммуникаций и информатики" (СибГУТИ) Кафедра Вычислительных систем Допустить к защите Зав.каф. _Мамойленко С.Н. ВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТА МАГИСТРА Исследование инструменто...»

«Министерство образования и науки Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования "Владимирский государственный университет имени Александра Григорьевича и Николая Григорьевича Столетовых" (ВлГУ) Институт прикладной математики и информатики биои нано...»

«Информационные процессы, Том 14, № 1, 2014, стр. 87–107. 2014 Лопес-Мартинес, Кобер, Карнаухов. c МАТЕМАТИЧЕСКИЕ МОДЕЛИ, ВЫЧИСЛИТЕЛЬНЫЕ МЕТОДЫ Восстановление изображений с помощью микросканирующей изображающей системы Х.Л.Лопес-Мартинес, В.И.Кобер, В.Н.Карнаухов Школа математики...»

«Оселедец Иван Валерьевич УДК 519.6 Нелинейные аппроксимации матриц 01.01.07 Вычислительная математика ДИССЕРТАЦИЯ На соискание учёной степени кандидата физико-математических наук Научный руководитель чл.-корр. РАН, проф. Тыртышников Е. Е. Москва 2007 Содержание Введение 2 i.1 Нелинейные аппроксимации матриц: зачем и как......»

«УДК 620.19 : 622.83 ФИЗИЧЕСКИЕ И МЕТОДОЛОГИЧЕСКИЕ АСПЕКТЫ АКУСТОЭМИССИОННОГО КОНТРОЛЯ НАПРЯЖЕННО-ДЕФОРМИРОВАННОГО СОСТОЯНИЯ МАССИВА ГОРНЫХ ПОРОД Аркадий Васильевич Леонтьев Федеральное государствен...»

«1 Открытый урок по математике в 5 классе по теме: Деление десятичных дробей на натуральные числа Тема: "Деление десятичных дробей на натуральные числа"Цели: 1. Продолжить работу над формированием умения выполнять деление десятичных дробей на натуральное число; вспомнить примы проверки д...»

«МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РОССИЙСКОЙ ФЕДЕРАЦИИ Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования КУБАНСКИЙ ГОСУДАРСТВЕННЫЙ АГРАРНЫЙ УНИВЕРСИТЕТ РАБОЧАЯ ПРОГРАММА "РЫНОК ЦЕННЫХ...»

«МИНИСТЕРСТВО СЕЛЬСКОГО ХОЗЯЙСТВА РФ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "РЯЗАНСКИЙ ГОСУДАРСТВЕННЫЙ АГРОТЕХНОЛОГИЧЕСКИЙ УНИВЕРСИТЕТ ИМЕНИ П.А.КОСТЫЧЕВА" ИНЖЕНЕРНЫЙ ФАКУЛЬТЕТ Кафедра Эле...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ РЕСПУБЛИКИ БЕЛАРУСЬ Учебно-методическое объединение по образованию в области информатики и радиоэлектроники УТВЕРЖДАЮ Первый заместитель Министра образования Республики Беларусь _В.А.Богуш 04.02.2015 Регистрационный № ТД-I.1171/тип. ОСНО...»

«ИНФОРМАЦИОННЫЕ ТЕХНОЛОГИИ Е. В. Баранова, профессор кафедры информатики И. К. Елизарова, программист учебно-методического управления ИНФОРМАЦИОННОЕ СОПРОВОЖДЕНИЕ ИНДИВИДУАЛЬНО-ОРИЕНТИРОВАННОГО УЧЕБНОГО ПРОЦЕССА Индивидуально-ориентированная организация уч...»

«4 МЕТОДИКА КУРСОВОГО ПРОЕКТИРОВАНИЯ ПО ДИСЦИПЛИНЕ "АРХИТЕКТУРА КОМПЬЮТЕРОВ И ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ" (на примере операции умножения) 4.1 Кодирование чисел 4.1.1 Кодирование знака числа. Кодирование чисел п...»

«5. Программирование 1.Для программирования параметров войдите в сервисный режим. Для этого после набора [0] [0] [0] [0] [0] [0] подождите, пока не погаснет светодиод(5сек), далее наберите мастер-код( в случае ошибки при наборе шести нулей подождите 5сек после последней набранной цифры и повторите набор). При прав...»








 
2017 www.lib.knigi-x.ru - «Бесплатная электронная библиотека - электронные матриалы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.