Руководство по PuppetMaster - Написание действий на JavaScript
Пожалуйста, обратите
внимание, что интерфейс JavaScript будет изменяться и дополняться по мере разработки
PuppetMaster.
Это руководство по
написанию действий на JavaScript для PuppetMaster. PuppetMaster доступен по адресу: http://www.lim.com.au/PuppetMaster
Один из путей настройки PuppetMaster -
использование JavaScript.
Это не учебник по JavaScript - есть много других учебников в интернете,
которые обучают синтаксису и возможностям языка. Это просто руководство о том,
как использовать JavaScript, чтобы обеспечить
точное управление от PuppetMaster.
Начнём с примера.
iTunesApp = new ActiveXObject("iTunes.Application");
iTunesApp.Play();
Этот скрипт приводит к
запуску iTunes и началу воспроизведения. Чтобы использовать это, перейдите в Preferences -> Menus -> Add Item
Выберите Visual Basic Script, задайте имя (напр.
“Play”) и
вставьте скрипт. Нажмите OK.
Действие будет добавлено
в Available items.
Чтобы отобразить его в телефоне, перенесите действие в левую панель. Оно отобразится
в телефоне немедленно, если он подключен.
Попробуйте, как это
действует! Убедитесь, что iTunes установлен, и тогда выберите “Play” на вашем телефоне.
Вы должны обнаружить, что iTunes запустился и играет, как задумано.
Этот пример
демонстрирует, как можно создавать простые неинтерактивные скрипты.
Создадим новое действие JavaScript, называющееся ‘Hello World’. Вставьте следующий скрипт.
etActivate = 1;
if(ExecuteData.type == 1)
{
RemoteController.ShowDialog("Hello World");
}
Когда вы используете этот
скрипт на вашем телефоне, он покажет ‘Hello World’. Нажатие кнопок OK или Back вернёт вас в предыдущее меню.
Когда PuppetMaster вызывает JavaScript, он предоставляет два объекта - ExecuteData и RemoteController. ExecuteData передаёт
информацию, почему был вызван скрипт.
Когда скрипт впервые
выбран из меню, он посылает событие типа etActivate. Если скрипт не сообщает RemoteController что-нибудь отобразить, то скрипт завершается.
Однако, если скрипт показывает что-то на дисплее RemoteController, то PuppetMaster присваивает скрипту активное состояние ('active'), и он будет
вызван позже.
RemoteController предоставляет методы для взаимодействия с
устройством. Здесь мы просто показали текст ‘Hello World’
PuppetMaster вызывает скрипт с ExecuteData.Type, установленным на etKeyPress, когда пользователь нажимает кнопку.
Попробуйте запустить следующий скрипт.
etActivate = 1; etKeyPress = 4;
switch(ExecuteData.Type)
{
case etActivate:
RemoteController.ShowDialog("Нажмите клавишу");
break;
case etKeyPress:
RemoteController.ShowDialog("Вы нажали " + ExecuteData.KeyID);
break;
}
Если вы посмотрите, как
работает этот скрипт, то обратите внимание, что нажатие клавиши передаётся как
часть ExecuteData.
Время от времени, вам может понадобиться дать скрипту знать, «что произошло раньше». Объект RemoteController обладает свойством ‘Store’, которому вы можете установить любое значение (или массив значений), которое будет сохраняться между вызовами. Попробуйте следующий пример
etActivate = 1; etKeyPress = 4;
switch(ExecuteData.Type)
{
case etActivate:
RemoteController.ShowDialog("Нажмите клавишу");
RemoteController.Store =
0;
break;
case etKeyPress:
RemoteController.Store =
RemoteController.Store + 1;
RemoteController.ShowDialog(RemoteController.Store
+ ": Вы нажали
" + ExecuteData.KeyID);
break;
}
Store инициализируется нулём в секции etActivate и увеличивается каждый раз при нажатии клавиши. Вы
должны увидеть это в текстовом выводе на вашем телефоне.
Перед продолжением
примеров скриптов, важно изучить разные типы событий…
Реальные цифровые
значения для типов событий можно найти в Справочнике
по Объектам.
etActivate посылается, когда пользователь впервые щёлкает по скрипту в меню. Если
скрипт НЕ использует ни одного из методов RemoteController.Show*, то нет событий, посылаемых скрипту, и меню
остаётся активным. Например, такой скрипт может просто запустить какое-то
приложение на компьютере, не требующее взаимодействия с пользователем. Чтобы
обеспечить интерактивность, скрипт должен обрабатывать событие etActivate.
etBegin посылается, когда скрипт впервые активизируется. EtEnd - когда скрипт деактивизируется. Чтобы сделаться активным, скрипт должен использовать метод RemoteController.Show* в ответ на etActivate
etKeyPress и etKeyRelease - это события, посылаемые скрипту, когда клавиши нажимаются и отпускаются.
Свойство ExecuteData.KeyID может быть использовано, чтобы определить,
какая клавиша нажата/отпущена.
etIntegerInput и etTextInput - события, посылаемые, когда пользователем
введено значение. Меню посылают 0-базовое целое значение, представляющее индекс
элемента, который был выбран.
etNext и etBack - специальные случаи пользовательского ввода, так как они могут
применяться очень разными путями в телефонах. Обычно они связаны с кнопками «OK» и «Назад». etNext и etBack требуют, чтобы вы
вызвали метод RemoteController.Show*, если хотите, чтобы скрипт остался активен.
Неперехваченные etNext/etBack
приведут к тому, что PuppetMaster отобразит предыдущее меню.
Событие etTimer посылается скрипту
периодически, чтобы обеспечить обновление на телефоне с течением времени.
Таймеры устанавливаются использованием RemoteController.StartTimer(миллисекунды) и останавливаются использованием RemoteController.StopTimer().
Чтобы позволить PuppetMaster периодически
вызывать ваш скрипт, вам нужно использовать метод RemoteController.StartTimer. Вы также должны оповестить об остановке
срабатывания периодических событий при выходе. Следующий пример использует встроенную
в JavaScript функцию Date
etActivate = 1, etBegin = 2, etEnd = 3, etTimer = 8;
switch(ExecuteData.Type)
{
case etActivate:
case etTimer:
RemoteController.ShowDialog(new Date());
break;
case etBegin:
RemoteController.StartTimer(1000);
break;
case etEnd:
RemoteController.StopTimer();
break;
}
RemoteController.StartTimer использует параметр в миллисекундах, который
определяет время между каждым событием etTimer. Запуск скрипта,
приведённого выше, должен привести к отображению системного времени в вашем
мобильном телефоне.
Следующий пример даёт
идею, как создавать скрипты с множеством состояний. Понимание, как это
работает, останется упражнением для читателя.
etActivate = 1; etIntegerInput = 6; etNext = 7; etBack = 9;
stMenu = 0; stDialog = 1; stPercentInput = 2;
function ShowMenu()
{
RemoteController.Store[0] = stMenu;
RemoteController.ShowMenu("Пример
Мультисостояний", new Array("Показ. диалог", " Показ. % ввода"));
}
function HandlePercentInput()
{
switch(ExecuteData.Type)
{
case etBack:
case etNext:
ShowMenu();
break;
case etIntegerInput:
RemoteController.Store[1] = ExecuteData.Input;
break;
}
}
function HandleDialog()
{
switch(ExecuteData.Type)
{
case etBack:
case etNext:
ShowMenu();
break;
}
}
function HandleMenu()
{
if(ExecuteData.Type ==
etIntegerInput)
{
switch(ExecuteData.Input)
{
case 0:
RemoteController.ShowDialog("Текущий
% " + RemoteController.Store[1]);
RemoteController.Store[0]
= stDialog;
break;
case 1:
RemoteController.ShowPercentInput("Введите процент",
RemoteController.Store[1]);
RemoteController.Store[0] = stPercentInput;
break;
}
}
}
if(ExecuteData.Type == etActivate)
{
RemoteController.Store =
new Array(2);
RemoteController.Store[0] = stMenu;
RemoteController.Store[1] = 50 // Просто даёт
проценту некоторое стартовое значение
ShowMenu();
}
switch(RemoteController.Store[0])
{
case stMenu:
HandleMenu();
break;
case stDialog:
HandleDialog();
break;
case stPercentInput:
HandlePercentInput();
break;
}
Объект ExecuteData предоставляет информацию, почему был запущен скрипт.
|
Имя |
Замечания |
|
Type |
Предоставляет значение
типа. Сейчас определены следующие: etActivate = 1 etBegin = 2 etEnd = 3 etKeyPress = 4 etKeyRelease = 5 etIntegerInput = 6 etBack = 7 etTimer = 8 etNext = 9 etTextInput = 10 Они обсуждаются в
разделе Типы событий. |
|
KeyID |
Строковое значение,
представляющее нажатую клавишу. “<” - Стрелка влево “>” - Стрелка вправо “^” - Стрелка вверх “v” - Стрелка вниз “0” – “9”, “#, *” - Клавиатура “u”, “d” - клавиши + и - на телефонах Sony Ericsson “f” - Кнопка меню (!abc) “c” - Кнопка C
(доступна не на всех телефонах) |
|
Input |
Целое значение для
меню, процент ввода Строковое значение для
текстового ввода. |
Объект RemoteController предоставляет
доступ к устройству дистанционного управления.
|
Имя |
Замечания |
|
CanShowImage |
Возвращает true или false в зависимости от
возможности устройства к показу изображений. |
|
Store |
Это значение используется
для хранения данных между многими исполнениями скрипта. См. раздел Устойчивые данные. |
|
ImageWidth |
Это ширина дисплея для
вывода рисунка в устройстве |
|
ImageHeight |
Это высота дисплея для вывода
рисунка в устройстве |
|
Имя |
Замечания |
|
ShowDialog(Текст); |
Показывает Текст на
устройстве. |
|
ShowImage ImageFileName, ImageFileType, TimeBeforeHighQuality |
ImageFileName должно быть полным путём к файлу рисунка поддерживаемого
типа. TimeBeforeHighQuality управляет временем активной деградации рисунка.
Если другой рисунок был показан в течение последнего TimeBeforeHighQuality (в миллисекундах), то рисунок будет преобразован с понижением качества
для улучшения интерактивности, если требуется. Чтобы всегда показывать
рисунки высокого качества, задайте этому параметру 0. Показ изображения с
размерами, иными чем ImageWidth и ImageHeight приводит к его ресэмплированию для умещения на
дисплее. ImageFileType - поддерживаемые типы изображений, на данный
момент: BMP, JPG, PCX, TGA. |
|
ShowMenu(Заголовок, МассивМеню); |
МассивМеню - это массив
строк. Посылает ввод посредством 0-базового etIntegerInput |
|
ShowPercentInput(Заголовок, НачПроцент); |
Показывает процентный ввод
на телефоне. События etIntegerInput генерируются для каждого изменения значения. |
|
ShowProgress(Текст); |
Показывает
прогрессивный диалог. |
|
ShowSortedMenu(Заголовок, МассивМеню); |
То же, что и ShowMenu, но сортирует
имена перед показом. |
|
ShowText(Заголовок, Текст); |
Показывает Текст на
устройстве. Если текст очень длинный и не помещается на экране, пользователь
может прокручивать его стрелками Вверх/Вниз |
|
ShowTextInput(Заголовок, НачТекст); |
Позволяет пользователю вводить
текст. Многие телефоны поддерживают T9 - метод ускоренного ввода
текста для этого. |
|
Store |
Это значение
используется для хранения данных между многими выполнениями скрипта. См.
раздел Устойчивые данные. |
|
Тип режима |
События, относящиеся
к режиму |
|
Dialog |
etKeyPress, etKeyRelease |
|
Text |
etKeyPress, etKeyRelease |
|
Percent Input |
etIntegerInput |
|
Progress |
etKeyPress, etKeyRelease |
|
Menu |
etIntegerInput |
|
Text Input |
etTextInput |
|
Image |
etKeyPress, etKeyRelease |
Комментарии,
исправления, вопросы? Пишите: jeff@lim.com.au