Просмотр полной версии : Как программно нажать symbol Button?
vikingcompany
19.05.2009, 13:17
Нарисовал прямоугольник, конвертировал его в symbol button,
в "Actions - Button" прописал обработчик on (release) { ... };
Подскажите, как нажать эту кнопку программно?
Искал по форуму. Да, вопрос неоднократно поднимался, но чёткого ответа нет.
on (событие) использовался 7(!) лет назад. Что вас заставляет использовать его сейчас, учитывая, что вероятность получить ответа гораздо меньше?
vikingcompany
19.05.2009, 13:25
... Что вас заставляет использовать его сейчас ... ?
Элементарно, Ватсон - незнание альтернатив!
ОльгаЮрьевна
19.05.2009, 13:36
сделайте не Button, а MovieClip(модно сейчас):)... в отдельном слое в первом кадре код:
MovieClip.onPress = function() {
действие при нажатии
}
не забудьте мувику прописать Instance Name
... или вы хотите программно с эмитировать нажатие?... тогда анимацией отрабатывайте нажатие-отпускание...
Вы уже год как на форуме! Есть же поиск, хелп. Вы так 10 лет основы будет изучать.
В панели Properties пишется имя для инстанса объекта. По этому имени идет обращение. Код пишут только в кадрах, забудь про написание кода на клипах и кнопках.
Код на кадре
имяИнстанса.onRelease () {
//действие
}
lexa2000lexa
19.05.2009, 13:50
имяИнстанса.onRelease () {
//действие
}
iNils а разве так будет работать? Вроди как нужно делать такbut.onPress = function() {
trace("нажали програмно")
}
but.onPress()
Вообще-то предполагалось, что это будет вторая фаза обучения.
lexa2000lexa
19.05.2009, 14:32
Тогда извеняюсь что залез, в процесс обуцения.:)
vikingcompany
19.05.2009, 18:43
В панели Properties пишется имя для инстанса объекта. По этому имени идет обращение.
Ну приехали. Очень смешно.
Спасибо, что верите в меня, ребята.
... вроди как нужно делать такbut.onPress = function() {
trace("нажали програмно")
}
but.onPress()
Вызов события but.onPress () с предварительным заданием обработчика but.onPress = function() { ... }
действительно выполняет те же функции, что и при нажатии на кнопку.
Вот только кнопка при этом всё равно остаётся не нажатой. Я ясно выразился?
ОльгаЮрьевна
19.05.2009, 19:08
vikingcompany можете меня конечно игнорить, но я ответила на ваш вопрос... вроде:)
Вызов события but.onPress () с предварительным заданием обработчика but.onPress = function() { ... }
действительно выполняет те же функции, что и при нажатии на кнопку.
Вот только кнопка при этом всё равно остаётся не нажатой. Я ясно выразился?
Так вам шашечки или ехать? :)
Жень Шень
19.05.2009, 19:41
Ну приехали...
Вот только кнопка при этом всё равно остаётся не нажатой.
Привет!
Сделайте вместо кнопки клип из двух кадров(отжатое состояние и нажатое). В каждом поставте стоп().
Далееbut.onPress = function() {
trace("нажали програмно")
this.play()
}
but.onRelease = function() {
trace("Отжали програмно")
this.play()
}
Вызываем нажатие - but.onPress()
Соответственно отжатие - but.onRelease()
vikingcompany
20.05.2009, 01:46
Уважаемые ОльгаЮрьевна, GAIKER, Жень Шень! Благодарю вас за участливость!
В своих постах вы описали не только много способов создания кнопок,
но и много способов задания обработчиков их событий.
К сожалению (или к счастью) со всеми ими я уже знаком.
Да и, по сути, нет никакой разницы каким образом будет создана кнопка.
Я же хотел выяснить
ни как программно вызвать обработчик события кнопки, а как программно НАЖАТЬ на неё.
А это, согласитесь, два разных действия.
Например: при вызове обработчика, фокусы (ну или что-то там) остаются на своих местах.
А при нажатии кнопки - переходят к ней.
Selection.setFocus(yourButton);
Объясните, что вы имеете в виду под нажатием?
Создаем кнопку, делаем ей 4 состояния, конвертим ее из кнопки в мувиклип.
И пишем что то вроде:
myButton.gotoAndStop(3);
myButton.onPress=function(){};
Ну и в принципе обычную кнопку заменяет такой наборчик:
myButton.stop();
myButton.onRollOut=function(){myButton.gotoAndStop(1)};
myButton.onRollOver=function(){myButton.gotoAndStop(2)};
myButton.onPress=function(){myButton.gotoAndStop(3)};
myButton.onRelease=function(){myButton.gotoAndStop(4)};
myButton.onReleaseOutside=function(){myButton.gotoAndStop(4)};
vikingcompany
20.05.2009, 09:03
Объясните, что вы имеете в виду под нажатием?
Ну мышкой, что ли ... )))
Попробую объяснить, зачем это нужно.
На подгружаемом клипе есть кнопка, обращающаяся к прелоадеру в _root.
Так вот при нажатии мышкой прелоадер срабатывает, а при простом вызове обработчика - нет.
Но почему?!
А всё потому, что обработчик вызывается компонентом v2, который в тот момент держит на себе выделение.
Природа проблемы, как мне кажется, кроется где-то в FocusManager.
Однако я не уверен, что с этой стороны её будет решить проще. Вот и бьюсь с кнопкой.
Жень Шень
20.05.2009, 11:04
Привет!
vikingcompany, все-таки надо выражаться яснее. Например из фразыВот только кнопка при этом всё равно остаётся не нажатой я понял, что надо графически отразить процесс нажатия, но программно.
Если трудно сформулировать вопрос, приложите упрощенный исходник, что бы общественность не гадала на кофейной гуще.
А проблемы, в свете последнего сообщения, мне кажется, и в области видимости.
Волгоградец
20.05.2009, 11:47
Не знаю - правильно ли понял...
Если имеется такое:
but.onRelease = function():Void{
doSomething();
}
То программно нажать кнопку можно так:
but.onRelease();
Если используется компонент Button, то так:
this.click = function(eventObj:Object){
doSomething();
};
but.addEventListener("click", this);
but.dispatchEvent({type:"click"});
Вы последние сообщение автора читали?
А всё потому, что обработчик вызывается компонентом v2, который в тот момент держит на себе выделение.
Тут лучше кодик увидеть.
vikingcompany
20.05.2009, 15:34
Тут лучше кодик увидеть.
Да не вопрос - http://www.samora.tut.su/code.rar
Как видно, в разных случаях прелоадер работает по-разному.
lexa2000lexa
20.05.2009, 15:40
А версию попроше можно а то не у всех CS4 есть.
vikingcompany
20.05.2009, 15:47
Любой каприз - http://www.samora.tut.su/code_CS3.rar
насколько я понимаю аффтор желает увидеть визуально эффект нажатой кнопки. делаем муви клип, делаем в нем нужное количество кадров, задаем метки кадров(по сути названия состояний кнопки - слегка нажата, совсем-совсем нажата итд). Внутри каждого кадра пихаем отрисованую графику нажатой кнопки и скачем по ним при помощи гоутуэндстоп(метка кадра). если совсем совсем програмно - тогда вам в эффекты(можно програмно или нет) обычный бевел(выпуклость) как стэйт кнопки отжатой и его отсутствие как стэйт кнопки нажатой.
Добавлено через 1 час 15 минут
сорри сорсов не заметил. на мой взгляд вам просто не хочется разбираться со своими же исходниками. если бы вы протрейсили отклик на нажатие, вызвав его из загружаемой флешки - вы бы увидили что он приходит. сделать это можно было даже самым топорным способом:
//в руте
function press_btn()
{
trace("press_btn")
_root.loaded_path = "_content.swf";
_root.gotoAndPlay("preloading");
}
//на кадре содержащем кнопку
путь_к_кнопке.onRelease = _root.press_btn;
вобщем все там путем с откликами. а вот в мц_лоадере, слой 2 кадр 2 надо было протрейсить percentLoaded. он приходит в NaN. в отличие от случая нажатия на кнопку. дальше думаю разберетесь. очевидно есть разница между нажатием на кнопку и нажатием на ветку. функция trace рекомендед. П.С. дружеский совет от того кто тоже так делал когда то - бессмысленные названия слоев и тем паче код на символах - это первородное зло, помните об этом:)
Жень Шень
20.05.2009, 20:18
Любой каприз...[/URL]
Ваш "каприз" в стиле АS1, но(!), будучи написанныь в CS3-CS4 у меня таки работает - пергружается и от кнопки и от ветки Tree.
Если конвертнуть его в 8 флеш и откомпилить - не работает в 8-м плеере, но 9-10 переваривают его на "Ура".
или вы хотите программно с эмитировать нажатие?
Ольга Юрьевна, эмитируют только дырки в n-полупроводниках. хехе. По-русски звучит как сымитировать [поведение].
vikingcompany
21.05.2009, 01:39
... у меня таки работает - перегружается и от кнопки и от ветки Tree.
Смотрящий да увидит.
Перегружаться-то перегружаеться, вот только прелоадер во втором случае не срабатывает.
... вам просто не хочется разбираться со своими же исходниками.
Оригинально.
... если бы вы протрейсили отклик на нажатие ... - вы бы увидили что он приходит.
Да протрейсил я всё на свете! Первым делом протрейсил. Только что с того?
... очевидно есть разница между нажатием на кнопку и нажатием на ветку.
Вообще-то мы об этом уже говорили. Вот только причина остаёться неизвестной!
Жень Шень
21.05.2009, 11:22
Я, право, не знаю, зачем в локалке предзагрузчик. Я не успеваю увидеть его работу. В самом флеше это видно. Ну, да ладно.
А не работает из ветки по той причине, что он (клип) уже загружен.
Поменяйте строчку кода "_root.gotoAndPlay("preloading");" на "_root.gotoAndPlay(1);" и почувствуйте разницу: клип перезаписался, все началось с нуля и ваша "полоска" стала бегать.
vikingcompany
21.05.2009, 17:09
Я, право, не знаю, зачем в локалке предзагрузчик. Я не успеваю увидеть его работу.
Это сейчас он локально. А будет - глобально )))
Поменяйте строчку кода "_root.gotoAndPlay("preloading");" на "_root.gotoAndPlay(1);" и почувствуйте разницу ...
Вы правы. Удивительно. Стоило переадресовать всего на 1 кадр ранее - и всё заработало.
А я тут с нажатием кнопки мучался!
Хотя мне до конца не понятно, почему при нажатии на неё всё работало и без отступа в 1 кадр.
Ребята, всем огромное спасибо!!!
Жень Шень
21.05.2009, 20:33
Хотя мне до конца не понятно, почему при нажатии на неё всё работало и без отступа в 1 кадр.
Дык, трейс в помощь!!!
percentLoaded = Math.round(_root.content.content_in.getBytesLoaded() / _root.content.content_in.getBytesTotal() * 100);
trace("1 "+percentLoaded) - выводит NAN
trace("2 "+_root.content_mc.content_in.getBytesLoaded()) - выводит 0
trace("3 "+_root.content_mc.content_in.getBytesTotal()) - выводит 0
Когда вы отсылали с ветки на второй кадр, клип не успевает загрузиться (хотя с кнопки успевает!) в коде:
_root.content_mc.content_in.loadMovie(_root.loaded_path);
Достаточно добавить лишний кадр и может работать код "_root.gotoAndPlay("preloading");"
Почему это так - "а флеша его знает".
Но, я уверен что в будущем вы будете иметь еще те проблемы, и дополнительный кадр не спасет.
Используйте для загрузки класс MovieClipLoader. Там есть всё! И % загрузки, и обработчик конца загрузки, и ...
И еще совет. Не используйте в качестве названия своих переменных названия свойст и методов, применяемых в AS (percentLoaded, content). Не используйте AS1 - тяжело копаться в коде.
Успеха!
vikingcompany
22.05.2009, 01:06
Когда вы отсылали с ветки на второй кадр, клип не успевает загрузиться (хотя с кнопки успевает!) ...
Так вот это и непонятно!
... я уверен что в будущем вы будете иметь еще те проблемы, и дополнительный кадр не спасет.
Я залил мувики на сервак.
Интересная хрень: под IE всё работает, а под Оперой - не работает. Проскакивает и всё!
КАК ТАКОЕ ВООБЩЕ ВОЗМОЖНО?
vikingcompany
25.05.2009, 08:28
Как сказал Жень Шень - а Флеш его знает!
Просто Опера быстее - и всё )))
А ещё, я в первый кадр прелоадера добавил:
var loadListener = new Object();
var myMovieClipLoader = new MovieClipLoader();
myMovieClipLoader.addListener(loadListener);
myMovieClipLoader.loadClip("_content.swf", _root.content.content_in);
loadListener.onLoadStart = function()
{
gotoAndPlay("preloading")
};
stop();
Здесь при помощи MovieClipLoader.onLoadStart прелоадер ожидает начала загрузки.
Теперь, думаю, проскакивать не должен.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.