Опубликован: 07.11.2006 | Уровень: специалист | Доступ: платный
Лекция 5:

Компоненты

Реализация дополнительных требований для подсказки

  1. Наша функция будет состоять из трех частей. Мы добавим ее над функцией clearTooltip. Сначала мы удалим параметр tooltip из конечного фильма и снимем наблюдение (unwatch) с управляющих элементов событий. Наконец, мы реализуем проверку oldRollOver, oldRollOut и oldDragOut либо удаляя управляющие элементы, если старая функция не была определена (т.е. не было функции rollOver ), либо возвращаясь к предыдущей функции:
    tooltip.prototype.clearTooltipInfо = function() {
            // delete reference to tooltip
            delete this.targetMovie.tooltip;
            // stop watching the button handlers
            this.targetMovie.unwatch("onRollOver");
            this.targetMovie.unwatch("onRollOut");
            this.targetMovie.unwatch("onDragOut");
            // if the button handlers are undefined delete them
            if (this.oldRollOut == undefined) {
                delete this.targetMovie.onRollOut;
            } else {
                this.targetMovie.onRollOut = this.oldRollOut;
            }
            if (this.oldDragOut == undefined) {
                delete this.targetMovie.onDragOut;
            } else {
                this.targetMovie.onDragOut = this.oldDragOut;
            }
            if (this.oldRollOver == undefined) {
                delete this.targetMovie.onRollOver;
            } else {
                this.targetMovie.onRollOver = this.oldRollOver;
            }
        };
  2. Мы могли бы создать свой собственный метод deleteTooltip для вызова этой функции и затем удалить подсказку, однако вместо этого мы будем просто позволять пользователю использовать removeMovieClip, так как это кажется более понятным. Каждый раз при удалении фильма вызывается его управляющий элемент unload, который мы и будем использовать здесь, над только что добавленной функцией clearTooltipInfo
    tooltip.prototype.onUnload = function() {
            this.clearTooltipInfo();
        };
  3. Нам также понадобится вызывать функцию clearTooltip, если targetMovie уже определен при вызове setTarget. Новый код выделен жирным шрифтом.
    tooltip.prototype.setTarget = function(me) {
            // if targetMovie is already defined, disassociate the
            // tooltip from it
            if (this.targetMovie) {
                this.clearTooltipInfo();
            }
            this.targetMovie = me;
            this.targetMovie.tooltip = this;
            this.targetMovie.watch("onRollOver", this.addToRollOver);
            this.targetMovie.watch("onRollOut", this.addToRollOut);
            this.targetMovie.watch("onDragOut", this.addToDragOut);
            this.targetMovie.onRollOut = this.targetMovie.onRollOut;
            this.targetMovie.onRollOver = this.targetMovie.onRollOver;
            this.targetMovie.onDragOut = this.targetMovie.onDragOut;
        };

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

    targ_mc.onRollOver = function() {
            this._alpha = 50;
        };
        targ_mc.onRollOut = function() {
            this._alpha = 100;
        };
        targ_mc.onPress = function () {
            this.tooltip.removeMovieClip();
        };
        _root.attachMovie "tooltipMc", "nootool", 2);
        _root.nootool.setTarget(targ_mc);
  4. Сохраните фильм в файле finalTooltipDone.fla. При запуске кода вы увидите, что подсказка работает должным образом до тех пор, пока вы не щелкнете на targ_mc, после чего исчезнет. Если вы выберете Debug > List Variables, вы увидите, что мы удалили все следы подсказки, и что rollover по-прежнему функционирует корректно.

    Код данной программы достаточно велик, чтобы приводить его в книге, однако вы можете обратиться к полному коду в исходном файле finalTooltipDone.fla. Имеется также дополнительный файл FLA (finalTooltipImplemented.fla) с несколькими вариантами применения подсказки, включая ее динамическое создание, применение к рабочему месту и к вложенному фильму.

    Существуют и другие элементы, которые вы можете добавить в фильм. Вы можете реализовать управление цветом, которое будет добавляться так же, как и параметр text, или добавить параметры для указания глубины тени подсказки и ее яркости.

    Можно превратить tooltipText в параметр конечного фильма, чтобы пользователь мог использовать выражение myMovie.tooltiptext вместо mymovie.tooltip.tooltiptext. Это делается либо с помощью watch, либо посредством addProperty. Можно превратить maxWidth в получатель/установщик, если нужно осуществлять управление во время выполнения, а также добавить проверку изменения размера фильма, содержащего подсказку. Если изменения есть, то размер подсказки изменялся бы с сохранением пропорций. При таком подходе лучше создать подсказку на главном рабочем месте, а не в фильме. Итак, мы изучили подход к созданию компонента - самостоятельного программного продукта.

    Напоследок настроим отображение компонента подсказки на панели Components. Создайте новый файл FLA с одним компонентом подсказки внутри него. Откройте диалоговое окно Component Definition и отметьте опцию Display in Components Panel. После этого разместите этот FLA в папке, где Flash осуществляет поиск компонентов при запуске. Путь будет выглядеть примерно так: Program Files/Macromedia/Flash MX/First Run/Components. При закрытии Flash и повторном его открытии, компонент должен будет появиться на панели Components. Помните, что можно помещать несколько компонентов внутри FLA, в случае чего они будут отображаться в виде набора (так же, как отображаются компоненты Flash UI).

Игорь Хан
Игорь Хан

у меня аналогичная ситуация. Однако, если взять пример из приложения (ball_motion_04_click for trial.fla) то след остается. при этом заметил, что в моем проекте в поле "One item in library" виден кружок, в то время как в приложенном примере такого кружка нет.

Вопрос знатокам, что не так?

Александр Коргапольцев
Александр Коргапольцев

объект созданый мной упорно не желает оставлять след(единственное что добился, так это то что шарик резво гоняется за курсором) функция duplicateMovieClip остаётся не активной, т.е. следа от объекта не остаётся, но если я тоже самый код вбиваю в учебный файл всё работает, не могу понять где я ошибаюсь и почему в документе созданном заново, не работает код начиная от функции duplicateMovieClip? 

Тамара Ионова
Тамара Ионова
Россия, Нижний Новгород, НГПУ, 2009
Магомед Алисултанов
Магомед Алисултанов
Россия, Волгоград, лицей 2