![]() |
|
||||||||||
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Господа, немедленно сбросьте пылкость речей. На форуме запрещено переходить на личности.
Frost47rus, не надо придумывать свои правила подсчета. Событие одно — MouseEvent.CLICK. Оно не бывает "внутренним" или "внешним". Эти определения можно отнести к слушателям, да. Слушателей может быть сколько угодно, даже у "здравомыслящего" разработчика. Вот чего бы мне никогда не пришло в голову, так это диспатчить "как правило такое же" событие из собственного обработчика кнопки. "Как правило" кнопка подписывается на клик по себе исключительно для собственных целей, "как правило" — отображения своей реакции на клик: анимации или другого визуального эффекта. Можно, конечно, завести для этих целей специальный интерактивный объект, и слушать внутри кнопки клик по этому объекту (хитАреа). Но далеко не всегда это целесообразно, поскольку описанной ТС проблемы вообще-то никогда не существовало, и городить лишние механизмы в кнопке никакого смысла нет (если конечно нет нужды в назначении в качестве хитАреа какого-то внешнего объекта). Так что два Слушателя на одно событие Клик — это вполне нормальная ситуация и не надо делать вид, что собственная подписка кнопки "не считается".
__________________
Reality.getBounds(this); |
|
|||||
|
[+4 08.09.13]
Регистрация: May 2012
Сообщений: 131
|
я всё-таки исходил из мнения, что кнопка как объект и её hitArea как объект - два разных объекта.
то, что вся кнопка целиком может быть как одна hitArea - и вся подписана на событие внутри себя же - лишь частный случай. зачастую приходится работать с кнопками, которые художники рисуют в фш. и кнопка сама по себе будет png с прозрачностью. и если заглянуть в тот же широкоизвестный Interactive PNG - найдём там то же самое - отрисовку hitArea, но попиксельно. Wolsh, а насчёт диспетча - я не понял, что имеется в виду тут: "так это диспатчить "как правило такое же" событие из собственного обработчика кнопки"? А какое же тогда? От самой hitArea передавать тот же? Это будет эвент не от кнопки в таком случае, а от её части и доступа к полям нужного event - получено не будет. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Непонятно, зачем писать диспатч клика, если он происходит "автоматически", то есть это стандартное поведение InteractiveObject, наследником которого является Ваша кнопка. Проще говоря, она ИТАК продиспатчит клик, зачем это дублировать дополнительно? Чтобы было два диспатча?
Добавлено через 3 минуты Interactive PNG — да, хороший пример внутренней подписки на все возможные мышиные события с целью их проанализировать и решить, диспатчить клик "наружу" или нет. Но тоже весьма частный случай))
__________________
Reality.getBounds(this); |
|
|||||
|
[+4 08.09.13]
Регистрация: May 2012
Сообщений: 131
|
Wolsh, прочтите, пожалуйста, код, который я написал на первой странице темы.
Этот эвент не дублируется. Эвент "внутри" - относится к hitArea кнопки, т.е. event.target - [object MovieClip]. Новый же эвент - он для внешних слушателей и относится к экземпляру [object MyButton]. Вы, видимо, поторопились с выводами. |
|
|||||
|
[+4 06.05.14]
|
Frost47rus
if (layout.getChildByName('hit') == null) dispatchEvent(new MouseEvent(MouseEvent.CLICK)); (_enabled == true) ? turnOn() : turnOff(); Wolsh, Silin - ну тогда давай те я приведу полный код, своей сборки и мы вместе выясним где же я косячу. Вот код любой кнопки package pro.clonez.slots { import flash.display.MovieClip; import flash.events.MouseEvent; import flash.text.TextField; /** * ... * @author in4core lab */ public class EvaluteButton extends MovieClip { public var tf:TextField; private var _isEnabled:Boolean = true; public function EvaluteButton() { this.mouseChildren = false; this.buttonMode = true; this.tabChildren = false; this.tabEnabled = false; this.addEventListener(MouseEvent.MOUSE_OVER , this.over); this.addEventListener(MouseEvent.MOUSE_OUT , this.out); this.addEventListener(MouseEvent.CLICK , this.release); this.addEventListener(MouseEvent.MOUSE_DOWN , this.down); } public function down(e:MouseEvent):void { this.gotoAndStop('down'); } public function release(e:MouseEvent):void { if (stage) { if (this.hitTestPoint(stage.mouseX , stage.mouseY)) { this.over(e); } else { this.out(e); } } } public function out(e:MouseEvent):void { this.gotoAndStop('simple'); } public function over(e:MouseEvent):void { this.gotoAndStop('over'); } public function disable():void { this.removeEventListener(MouseEvent.CLICK , this.release); this.removeEventListener(MouseEvent.MOUSE_OVER , this.over); this.removeEventListener(MouseEvent.MOUSE_OUT , this.out); this.removeEventListener(MouseEvent.MOUSE_DOWN , this.down); this.mouseEnabled = false; this.buttonMode = false; this.gotoAndStop("inactive"); this._isEnabled = false; } public function enable():void { this.addEventListener(MouseEvent.MOUSE_OVER , this.over); this.addEventListener(MouseEvent.MOUSE_OUT , this.out); this.addEventListener(MouseEvent.CLICK , this.release); this.addEventListener(MouseEvent.MOUSE_DOWN , this.down); this.mouseEnabled = true; this.out(null); this.buttonMode = true; this._isEnabled = true; } public function get isEnabled():Boolean { return _isEnabled; } } } Имеем 2 кнопки. - и + . При определенных условиях нажатия 1й или второй, одна из них блокируется, либо не блокируется ни одна. Смотрим this._hud.mline.addEventListener(MouseEvent.CLICK , minusLine); this._hud.pline.addEventListener(MouseEvent.CLICK , plusLine); private function minusLine(e:MouseEvent):void { this.dispatchEvent(new HUDViewEvent(HUDViewEvent.MINUS_LINE)); } private function plusLine(e:MouseEvent):void { this.dispatchEvent(new HUDViewEvent(HUDViewEvent.PLUS_LINE)); } private function updateCurrentLine(e:HUDModelEvents):void { if (this._hudModel.currentLine === this._hudModel.numLines) { //this._hud.pline.removeEventListener(MouseEvent.CLICK , plusLine); this._hud.pline.disable(); } else if (this._hudModel.currentLine === 1) { //this._hud.mline.removeEventListener(MouseEvent.CLICK , minusLine); this._hud.mline.disable(); } else { if (!this._hud.pline.isEnabled) { this._hud.pline.enable(); //this._hud.pline.addEventListener(MouseEvent.CLICK , plusLine); } if (!this._hud.mline.isEnabled) { this._hud.mline.enable(); //this._hud.mline.addEventListener(MouseEvent.CLICK , minusLine); } } } Видно - что кнопка подписана на 2 клика, первый происходит сразу же, второй(логика) по событию от модельки . Я специально унес в комментарии удаление второго слушателя, так было изначально - и при таком подходе мы получали следующее - over , down , disable (!!! сняли клик) , release , over . При подходе 2 ( убрав комментарии , тоесть снимая и второго слушателя ) - over , down , disable ! - все верно. Где же я косячу?
__________________
Марк Tween |
|
|||||
|
in4core, вот ты пишешь
Цитата:
а вот минималистичный пример проблемы, который можно просто взять и запустить, был бы в тему, да |
|
|||||
|
[+4 06.05.14]
|
silin - ну вроде как пример довольно минималистичный. Тут даже достраивать ничего не надо. Класс кнопки есть ( показал ) , а кнопки допустим подпишем на
- вот и готов пример. Видим код кнокпи и код *внешнего* слушателя
__________________
Марк Tween |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Frost47rus, Ваш клипопреобразователь имеет какое-то отношение к данной теме?
in4core, Вам надо выйти из телепатического транса и почувствовать, как мыслят обычные флэш-обыватели. Хотя бы покажите место, откуда Вы получаете свой изумительный трейс. По какому конкретно событию он происходит. Что Вы делаете с кнопками, отчет. А вот в коде Модели Вам бы самому покопаться — боюсь другим будет лень, даже догадываясь, что причина где-то там.. Добавлено через 2 минуты От Ваших thisов уже глаза щиплет..
__________________
Reality.getBounds(this); |
|
|||||
|
[+4 08.09.13]
Регистрация: May 2012
Сообщений: 131
|
приватные переменные обозначаются в конструкторе.
private var _isEnabled:Boolean = true; и тут же public function get isEnabled():Boolean { return _isEnabled; } либо пропишите нормальные гетеры-сетеры, либо просто сделайте публичной переменную. поясните, зачем? совершенно не ясна проверка на наличие стейджа. если его не было бы - не было бы события. if (this.hitTestPoint(stage.mouseX , stage.mouseY)) { this.over(e); } else { this.out(e); } это не надо проверять - такое поведение пользователя не приведёт к событию MouseEvent.CLICK - проверьте сами. public function enable():void { this.addEventListener(MouseEvent.MOUSE_OVER , this.over); this.addEventListener(MouseEvent.MOUSE_OUT , this.out); this.addEventListener(MouseEvent.CLICK , this.release); this.addEventListener(MouseEvent.MOUSE_DOWN , this.down); this.mouseEnabled = true; this.out(null); а если активация будет во время пребывания мыши над кнопкой? получите кашу. мышиный эвент хэндлер назван совсем как не хэндлер. вы сами в своём коде не путаетесь? вы - ладно, другим его читать - давать нельзя. if (this._hudModel.currentLine === this._hudModel.numLines) { //this._hud.pline.removeEventListener(MouseEvent.CLICK , plusLine); this._hud.pline.disable(); } else if (this._hudModel.currentLine === 1) { //this._hud.mline.removeEventListener(MouseEvent.CLICK , minusLine); this._hud.mline.disable(); } else Вам стоит сделать свой код более прозрачным и понятным. И путаться не будете. А ещё есть дебагер, где можно поставить брейкпойнт и посмотреть как работает последовательность событий. if (layout.getChildByName('hit') == null) dispatchEvent(new MouseEvent(MouseEvent.CLICK)); (_enabled == true) ? turnOn() : turnOff(); ![]() Добавлено через 3 минуты да, непосредственно имеет. мы разбирались в том, что у кнопки нет двух одинаковых слушателей. |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:34. |
|
|
« Предыдущая тема | Следующая тема » |
|
|