BeeToo API для интерфейсов создан для минимизации количества кода и повышения его повторной используемости (reusability). Сложная 3х уровневая структура графической части проекта управляется простым API. Который остается неизменным от проекта к проекту. Таким образом, минимизируется количество "специфичного" кода, который должен быть написан для каждого последующего помещения в проекте.
Фреймворк анимации
Фреймворк анимации является специализированным интерфейсом, оберткой стандартного интерфейса iRidium Script API IR.Tween: https://wiki2.iridiummobile.ru/Systems_API/IR.Tween
Фреймворк позволяет программисту в простом виде запускать процесс анимации, задавая субъект анимации (объект, свойства которого будут меняться в процессе) и свойства субъекта, значения которых будут меняться.
Метод и внешний вид запуска процесса анимации схож с функцией animate фреймворка jQuery: https://api.jquery.com/animate
Типичный вызов нашего интерфейса анимации выглядит следующим образом:
Animation.run(IR.GetPopup('FoobarPopup').GetState(0), 'Opacity', {start: 0, finish: 255}, PLAN_POPUP_SHOW_TIME);
Синтаксис:
Animation.run(uiObject, uiProperty, {start: startValue, finish: finishValue}, time, [tweenFunction]);
Параметры функции:
{ start: startValue, finish: finishValue }
startValue, finishValue
uiProperty=='X'
А значения start и finish определим как:
{start: 400, finish: 600}
uiObject будет двигаться слева 400px направо 600px.
Также, вы можете задать анимацию в противоположном направлении:
{start: 600, finish: 400}
и uiObject будет двигаться справа 600px налево 400px.
Что внутри класса Animation?
Когда вы запускаете процесс анимации, ваш текущий поток выполнения просматривает пул потоков анимации и выбирает свободный.
Первый свободный поток получает все необходимые параметры для отрисовки анимации.
На этом все, ваш текущий поток свободен от процесса анимации и продолжает свое выполнение. Потому что каждый поток анимации выполняется независимо в отдельном неблокирующем потоке посредством IR.EVENT_WORK: https://wiki2.iridiummobile.ru/Systems_API/IR.EVENT_WORK
Пул поток анимации ограничен тремя потоками. Почему именно три? Потому что каждый отдельный поток создает значительную нагрузку на клиент iRidium (в особенности при выполнении на мобильной платформе).
Если запустить одновременно от 5 до 10 потоков при помощи IR.EVENT_WORK, произойдет ощутимое увеличение времени отклика интерфейса, упадет скорость работы интферйса i2next/i2control приложений.
При попытке старта анимации, когда все потоки анимации уже окажутся заняты, тогда изменяемое свойство субъекта изменится мгновенно, без анимации.
В лог будет выведена соответствующая строчка:
[12:45:02.453] Animation: failed to run animation. Cause: all animation threads are busy!
Особую роль играет глобальная переменная EVENT_WORK_PAUSED типа Boolean Все потоки анимации приостанавливают процесс анимации, пока
EVENT_WORK_PAUSED==true
О назначении данной переменной в прочитаете в разделе "Фреймворк управления видимостью страниц". Пожалуйста, не изменяйте значение глобальной переменной EVENT_WORK_PAUSED в вашем коде. Используйте для доступа и работы с ней только метод setEventWorkPaused.
Фреймворк управления видимостью страниц (popup)
В проекте Project.irp используются страницы (popup), которые никогда не должны быть скрыты. Например, BeeToo_background_popup. Эта страница содержит симпатичные бэкграунды, каждый предназначен для своего помещения.
Поэтому мы не можем использовать IR.HideAllPopups (смотрите https://wiki2.iridiummobile.ru/GUI_API/IR.HideAllPopups). Потому что вызов этой функции скроет бэкграунд и нарушит внешний вид приложения.
Необходимо показывать попапы при помоши метода showPopup и скрывать при помощи метода hidePopup. Процедура hidePopup каждый раз при вызове проверяет: зарегистрировано ли имя страницы (popupName параметр) в списке SHOWED_POPUPS.
Подобным образом, метод hideAllShowOnePopup не вызывает IR.HideAllPopups, а производит вызов процедуры hidePopup для каждой страницы, которая должна быть скрыта.
Перейдем к описанию всех методов API управления видимостью попапов, которые определены в файле скриптов BeeToo_show_hide_popups.js
Функция возвращает Boolean - true если страница с указанным именем показана.
Если упомянутая страница не показана или она не существует в принципе, функция вернет значение false.
Процедура задает глобальной переменной EVENT_WORK_PAUSED значение true до тех пор, пока не наступит timeout через время равное значение аттрибута timeout.
Пока EVENT_WORK_PAUSED равняется истине[true], все потоки Анимации находятся в состоянии "паузы".
Данный фукнционал используется для плавного отображения анимации скрытия и показа страниц. Потоки анимации на время скрытия/показа страниц находятся в паузе и не влияют на анимацию страниц.
В xml далее по тексту приведен пример объявления группы с id=1.
<Effects>
<Effect Delay="0" Duration="900" Group="1" SlideType="1" TweenType="20" Type="slide"/>
<Effect Delay="0" Duration="900" Group="1" TweenType="20" Type="fade"/>
</Effects>
setEventWorkPaused(AVERAGE_POPUP_SHOW_TIME+150);
Процедура showPopup - обертка для стандартной функции iRidium Script API IR.ShowPopup (смотрите вики: https://wiki2.iridiummobile.ru/GUI_API/IR.ShowPopup). Процедура показывает страницу, имя которой передается в параметре popupName.
Дополнительно, функция showListener будет вызвана, если определена в параметрах. Главное отличие данной обертки от оригинальной функции IR.ShowPopup: в списке показанных страниц SHOWED_POPUPS.
Каждая страница, показанная при помощи вызова showPopup будет зарегистрирована в списке.
<Effects>
<Effect Delay="0" Duration="900" Group="2" SlideType="0" TweenType="20" Type="slide"/>
<Effect Delay="0" Duration="900" Group="2" TweenType="20" Type="fade"/>
</Effects>
setEventWorkPaused(AVERAGE_POPUP_SHOW_TIME+150);
Процедура hidePopup - обертка для стандартной функции iRidium Script API IR.HidePopup (смотрите вики: https://wiki2.iridiummobile.ru/GUI_API/IR.HidePopup). Процедура показывает страницу, имя которой передается в параметре popupName.
Дополнительно, функция showListener будет вызвана, если определена в параметрах. Главное отличие данной обертки от оригинальной функции IR.HidePopup: в списке показанных страниц SHOWED_POPUPS.
Каждая страница, скрытая при помощи вызова hidePopup будет удалена из списка. За исключением случаев, когда передано значение параметра do_not_remove_arr_item с истинным значением.
Если false (стандартный случай), страницы, которые были скрыты и показываются, движутся слева (из-за экрана) направо. И страницы, которые скрываются, движутся также слева направо (за область экрана). Если reverseEffect равняется true, движение производится в противоположном направлении: справа налево.
Если true, будет применены замедленные эффекты анимации движения для скрытия и показа страниц.
Для детального понимания, сравните эффекты RIGHT_SLIDENFADE_EFFECT_GROUP[id=1] и RIGHT_SLOW_SLIDENFADE_EFFECT_GROUP[id=3], зарегистрированные в Project.irp, в тэгах <Effects>.
Данный метод скрывает текущую страницу сценария (и страницу с планом помещения, которая может быть встроена на страницу сценария). Затем показывает основную страницу помещения. Где представлены все сценарии, доступные для запуска.
К показу и скрытию страниц применяются соотвествующие эффекты, которые опеределяют плавность и динамичность интерфейса.
Процедура скрывает текущую страниц. Это может быть главная страница помещения или страница текущего запущенного сценария. В то же время показывается страница с именем, переданным в значении параметра scenarioPopupName. Сразу после окончания анимации показа, функция из параметра scenarioStartFunction будет вызвана. В общем случае, эта функция содержит код, непосредственно связанный с запуском сценария. Также, в момент окончания анимации показа страницы сценария, страница с именем, указанным в значении параметра planPopupName будет показана с применением плавного эффекта "проявления". Когда аттрибут "прозрачность" плавно изменяет свое значение от 0% до 100%.
Процедура скрывает все показанные страница (зарегистрированные в списке SHOWED_POPUPS) и показывает только одну страницу с именем, переданным в значении параметра popupToShow.
Вы можете определять эффекты, при помощи которых будут скрыты и показаны страница через значение параметров showEffectGroup и hideEffectGroup.
Более того, вы можете задать callback-функции, которые будут вызваны после скрытия/показа страниц. Для этого, функции должны быть указаны в качестве значений параметров showListener и hideListener, соотвественно.
Если true, тогда страница с сообщением будет показана немедленно. В противном случае, сообщение будет сохраненно на странице сообщения. Вы можете отобразить страницу позднее.
Процедура показывает страницу BeeToo_info_popup в центре ГИ с сообщением, расположенном на странице.
По умолчанию, страница сообщения не имеет кнопок. Любое нажатие пользователя по странице скрывает ее. Страница скрывается автоматически через 4 секунды (4000ms) после показа.
Объявление массива BACKGROUNS_POPUPS выглядит следующим образом:
BACKGROUNS_POPUPS = {
'room1': 0,
'room2': 1,
'room3': 2,
'room4': 3,
'room5': 4,
'room6': 5,
'room8': 6,
'room7': 7,
'room9': 8,
'room10': 9,
'room11': 10
}
Где room1 - имя бэкграунда, 0 - индекс фона. Индекс совпадает с номером состояния (state) элемента ГИ Background, который расположен на странице BeeToo_background_popup (смотрите содержимое Project.irp).
Объявление массива BACKGROUNS_POPUPS для реального проекта может выглядеть следующим образом:
BACKGROUNS_POPUPS = {
'cinhall': 0,
'gymnasium': 1,
'relaxroom': 2,
'livingroom': 3,
'platon_bedroom': 4,
'daniil_bedroom': 5,
'tatiana_bedroom': 6,
'cabinet': 7,
'bedroom': 8,
'playroom': 9,
'bathroom': 10
}
Страница BeeToo_background_popup всегда отображается. Метод изменяет текущий статус (state) элемента ГИ Background. Для каждого состоянии данного элемента задано свое изображение. Которое служит фоном для каждого из помещений.
Кто отображает главную страницу помещения и её background при старте?
При запуске проекта отображается главная страница конкретного помещения и соответствующий ей фон. Данный код всегда располагается в скриптовом модуле BeeToo_onstart_show_popups.js, который, например, содержит следующий код:
IR.AddListener(IR.EVENT_START, 0,
function () {
showBackground('room1');
showPopup("BeeToo_room1_main_popup");
});