Работа с событиями в DroidScript происходит легко, что будет рассмотрено на примере компоновщика.
Компоновщики могут реагировать на действия пользователей. Для этого они имеют следующие методы:
В качестве единственного параметра в них задаётся функция обратного вызова (ФОВ), в которую, в зависимости от источника и вида события, могут передаваться или не передаваться параметры.
До версии DroidScript 1.42 в качестве функции обратного вызова callback в DroidScript для любого метода-обработчика можно было указать только название глобальной функции или имя глобальной функции в кавычках в качестве параметра метода eval:
SetOnTouch( myFunction );
или
SetOnTouch( eval ('myFunction') );
Любые другие способы задания параметра callback, включая обращения к анонимным функциям, функциям-выражениям, функциям с параметрами и т.п. приводили к ошибке времени выполнения. Это создавало трудности, так как была невозможна явная передача параметров обработчику и приходилось создавать большое количество глобальных функций для каждого элемента управления.
Начиная с версии 1.42 в качестве обработчика событий можно указывать также анонимную функцию:
myObject.SetOnTouch( function(){
app.ShowPopup( 'Произошло касание объекта' );
});
и функциональное выражение:
var
myFunc = function(){ alert(); }
myObject.SetOnTouch( myFunc );
});
Если объект не имеет методов SetOnTouchDown, SetOnTouchMove и SetOnTouchUp, то при вызове ФОВ в метода SetOnTouch аргументы ей не передаются:
btn.SetOnTouch( AS );
function AS( t ){
alert( t ); // undefined
}
Если объект имеет методы SetOnTouchDown, SetOnTouchMove, SetOnTouchUp, то в случае использования вместе с ними метода SetOnTouch последний будет перехватывать события down, move, up, получая от системы объект события со следующими полями:
Скопируйте пример и посмотрите работу событий.
Пример 1. Работа с событиями.
В этом примере определены обработчики SetOnTouchDown, SetOnTouchMove, SetOnTouchUp, но их вызов не производится из-за перехвата всех событий обработчиком SetOnTouch.
Для группировки реакции на события от многих объектов можно использовать функцию роутера событий, как это показано в примере ниже.
Пример 2. Функция-роутер событий.
В этом примере каждому объекту добавлено по два свойства - параметр и действие, благодаря которым в роутере можно определить источник события и вызвать для него требуемон действие.
При использовании функции-роутера событий необходимо проверять входные параметры. Без данной проверки возможны ошибки, так как в одних случаях аргумент будет объектом, в других строкой или числом, а в третьих аргумента вообще не будет.
При помощи опции конструктора компоновщика TouchThrough ему можно запретить захват событий. В этом случае события будут проходить сквозь него, что позволит создать многослойный интерфейс путем наложения компоновщиков друг на друга и обработки событий на нижних слоях.