Перед тем, как приступить к работе, нужно непосредственно спланировать наше приложение: выяснить, чего мы хотим добиться от приложения и как при помощи имеющихся у нас средств это реализовать. Проектирование является одним из самых важных (если не самым важным) этапов создания приложения. Основное правило разработки гласит:
Если ваша программа не работает на бумаге, то она вообще не будет работать.
Это возвращает нас к традиционным представлениям о разработке программного обеспечения, но это неоспоримая правда для случая с Flash-приложениями для интернета. Если вы не знаете, куда нужно идти (т.е. не проектируете ваше приложение), как же вы доберетесь туда, куда вам нужно?
Довольно теоретического материала, приступим к разработке. Главной целью нашего приложения является выбор данных из фильма Flash (т.е. данных, вводимых пользователем) и отправка их по указанному адресу электронной почты. Вот возможности, которые должны быть в нашем приложении. Приложение должно:
Идем дальше!
Перед тем как приступить к созданию фильма Flash, нужно создать компонент кнопки, который мы сможем использовать для построения части пользовательского интерфейса. Компоненты были рассмотрены в "Компоненты" этой книги, так что у вас не должно возникнуть больших проблем при выполнении следующих шагов. Не забывайте, что вы можете в любой момент свериться с исходными файлами для этой лекции, если вы запутались на каком-либо этапе.
На данный момент я просто скажу вам, что мы не собираемся особо "наворачивать" этот компонент, и что здесь мы не будем добавлять его на панель Component в среде разработки Flash MX.
Наш компонент использует новую возможность Flash MX для реализации "кнопочных" действий, и в этом непосредственную роль играют метки кадров _up, _over и _down. Также возможно добавление кадра _hit для определения области щелчка для кнопки, однако здесь эта возможность не используется.
Когда фильму присвоен управляющий элемент onPress или onRelease, он действует, как кнопка и будет автоматически отображен в соответствующем кадре временной шкалы, изображенной на рисунке выше. Это немного сократит количество необходимого кода, поэтому я решил использовать здесь эту возможность, хотя выключенное состояние придется создавать вручную, так как оно не является одним из состояний стандартной кнопки.
#initclip 1 // Constructor FSimpleButton = function(){ // Initialise component this.init(); }; // Inherit from MovieClip object FSimpleButton.prototype = new MovieClip(); // Register component class Object.registerClass("FSimpleButton", FSimpleButton);
Весь этот код почти в точности повторяет реализацию компонента Tool Tip в "Компоненты" . Не будем больше на этом останавливаться. Если вам что-то непонятно, обратитесь к "Компоненты" .
// Initialise component FSimpleButton.prototype.init = function(){ // Set caption text and color this.caption_txt.text = this.captionText; this.caption_txt.textColor = this.captionColor; // Setup cursor and disable tabbing this.useHandCursor = this.showHand; this.tabEnabled = false; // Set event handlers this.onRollOut = this.myRollOut; this.onRollOver = this.myRollOver; this.onPress = this.myPress; this.onRelease = this.myRelease; this.onDragOut = this.myDragOut; this.onDragOver = this.myDragOver; this.onReleaseOutside = this.myReleaseOutside; };
Здесь мы устанавливаем текст и цвет текста для текстового поля caption_txt. Использованные для этого переменные находятся среди параметров, установленных в предыдущем шаге.
Далее, мы устанавливаем указатель мыши согласно параметрам компонента showHand и после этого прерываем прием кнопкой входного фокуса с использованием ключа TAB. Так было сделано потому, что раздражающий желтый прямоугольник фокуса портит внешний вид приложения, но это не обязательно.
Наконец, мы устанавливаем управляющие элементы событий мыши для нашего компонента, и, так как осуществляется наследование из объекта MovieClip, нужно предусмотреть немало деталей. Мы, на самом деле, не будем здесь обрабатывать все события, но я включил их на тот случай, если вы захотите реализовать нечто отличное с применением вашего компонента кнопки.
FSimpleButton.prototype.myRollOut = function() { this._parent [this.statusVar] = _global.oldStatusText; }; FSimpleButton.prototype.myRollOver = function() { _global.oldStatusText = this._parent[this.statusVar]; this._parent[this.statusVar] = this.statusText; };
Переменная состояния указывается в виде еще одного параметра компонента, как и непосредственный текст состояния. Мы используем глобальную переменную oldStatusText для хранения и получения предыдущего текста состояния. Причина этому станет ясна, когда мы перейдем к работе над фильмом Flash.
FSimpleButton.prototype.myPress = function() { }; FSimpleButton.prototype.myRelease = function() { // Execute callback this._parent[this.clickHandler](this); };
Управляющий элемент onRelease, вероятно, наиболее важный элемент управления во всем компоненте. Это элемент управления, вызывающий функцию, указанную в параметре компонента clickHandler.
Здесь мы передаем ссылку на текущий объект функции обратной связи. Это полезно в том случае, если у вас есть одна функция обратной связи для нескольких кнопок, и необходимо определять, какой кнопкой была инициализирована обратная связь. Мы не будем использовать это непосредственно в нашем приложении, но, тем не менее, иметь такую возможность достаточно полезно.
FSimpleButton.prototype.myDragOut = function() { this.gotoAndStop("_up"); };
Я использовал его для устранения одного небольшого препятствия при реализации работы кнопок во Flash. В наиболее распространенных операционных системах, когда вы удерживаете кнопку мыши в момент нахождения указателя над кнопкой, и затем перетаскиваете указатель за пределы кнопки и отпускаете ее, это действие не воспринимается как нажатие кнопки. Однако во Flash кнопка останется в "нажатом" состоянии _down. Чтобы обойти эту особенность, я реализовал возврат кнопки в кадр _up при перетаскивании мыши за пределы области кнопки. Вам решать, применят этот способ здесь или нет, однако я бы на вашем месте не отказывался от этого дополнения.
FSimpleButton.prototype.myDragOver = function() { }; FSimpleButton.prototype.myReleaseOutside = function() { };
FSimpleButton.prototype.disable = function() { this.caption_txt.textColor = this.captionDisabledColor; this.gotoAndStop("disabled"); this.enabled = false; };
Из этого кода видно, что здесь мы всего лишь меняем цвет текста метки на текст, указанный в параметре компонента captionDisabledColor, переходя к кадру выключения и выключая компонент. При выключенном компоненте события не будут обрабатываться, и компонент будет оставаться в указанном кадре.
FSimpleButton.prototype.enable = function() { this.enabled = true; this.gotoAndStop("_up"); this.caption_txt.textColor = this.captionColor; };
Метод enable просто обращает изменения, сделанные в методе disable, включая кнопку, перемещая ее обратно в кадр _up и заново устанавливая цвет текста метки.
// Public: isEnabled FSimpleButton.prototype.isEnabled = function() { return this.enabled; }; #endinitclip stop();
Мы закончили определение компонента, и он готов к использованию. Переименуйте компонент в библиотеке, если вы еще этого не сделали. Назовите его FSimpleButton и установите его связи следующим образом.