Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   disable и enable методы для кнопки меню (http://www.flasher.ru/forum/showthread.php?t=179425)

in4core 14.05.2012 22:37

disable и enable методы для кнопки меню
 
Собственно очень странная проблема, и мне стыдно задавать такой вопрос,но я в лоб не вижу где косяк.

Имеется меню ( несколько кнопок ) часть из них как заголовки и при создании не подписываются на события ( на всяк случай говорю об этом, хотя понимаю краем глаза, что это не имеет значения к вопросу ) , другие же как реальные кнопки и подписываются на события мыши.

И так

Код AS3:

MenuButton.as
 
private static var _currentSelected:MenuButton = null;
 
private function onClick(e:MouseEvent):void
                {       
                        if(_currentSelected) trace(_currentSelected._header.text);
 
                        this._header.textColor = 0x990000;
 
                        this.removeEventListener(MouseEvent.MOUSE_OVER , onOver);
                        this.removeEventListener(MouseEvent.MOUSE_OUT , onOut);
                        this.removeEventListener(MouseEvent.CLICK , onClick);
 
                        if (_currentSelected)
                        {
                                _currentSelected.addEventListener(MouseEvent.MOUSE_OVER , onOver);
                                _currentSelected.addEventListener(MouseEvent.MOUSE_OUT , onOut);
                                _currentSelected.addEventListener(MouseEvent.CLICK , onClick);
                                _currentSelected._header.textColor = 0x000000;
                        }
 
                        _currentSelected = e.currentTarget as MenuButton;
 
                }

Таким кодом, я обрабатываю большинство менюшек, которые создаю. Всегда все окей, и щас я не вижу проблемы, но работает криво.
Описываю :
Нажимаю первую кнопку, выделилась, события овера и аута не работают, другие функционируют в обычном режиме. Все окей.
Нажимаю на другую, предидущая *вроде как* разблокируется , а эта переходи в состояние блокировки. , но
когда перевожу мышку на предидущую ( которая ВРОДЕ как разблокировалась) , блокированная кнопка диспатчит событие OVER , а при отведении мышки диспатчит OUT.
Не могу понять, где я ошибаюсь...

Добавлено через 13 минут
Код AS3:

_currentSelected.addEventListener(MouseEvent.MOUSE_OVER , _currentSelected.onOver);
                                _currentSelected.addEventListener(MouseEvent.MOUSE_OUT , _currentSelected.onOut);
                                _currentSelected.addEventListener(MouseEvent.CLICK , _currentSelected.onClick);

тема закрыта, реально туплю

silin 14.05.2012 23:17

вместо батареи add\remove листенеров ( которые к тому еще и публичными должны быть в этом раскладе) реально удобнее выставить mouseEnabled = true\false, не?

in4core 14.05.2012 23:28

Цитата:

вместо батареи add\remove листенеров ( которые к тому еще и публичными должны быть в этом раскладе) реально удобнее выставить mouseEnabled = true\false, не?
Ну видимо не приходилось вам никогда создавать такие кнопки.
1. Методы публичными делать не надо. Они все приватные, как описано выше. Почему ?! Сам первый раз задумался об этом, но если ты в классе А имеющий приватные методы, создаешь статическую переменную B того же класса, то все приватные методы B видны, как публичные для этого класса.
2. Удобнее в сто раз, но не получится сделать через моусЕнаблед вот почему
Код AS3:

function onClick():void
{
  this.mouseEnabled = false;
  // и тут же сразу полетит событие OUT , поэтому от него приходится отписываться полюбому, ну а уж от одного отписались, то и от других не лень
}


silin 14.05.2012 23:46

ага, возможно так и складнее/понятнее
хотя как по мне, так MOUSE_OUT здесь не помеха вовсе: кнопка просто уходит в нейтральное (или какое-то выделенное) состояние при клике, что и логично какбе

in4core 14.05.2012 23:52

Цитата:

хотя как по мне, так MOUSE_OUT здесь не помеха вовсе: кнопка просто уходит в нейтральное (или какое-то выделенное) состояние при клике, что и логично какбе
Over - gotoAndStop(2);
Out - gotoAndStop(1);
Click - gotoAndStop(3);
Все 3 кадра ПОЛНОСТЬЮ разные. Ну и как быть ? Аут все портить будет полюбому

silin 15.05.2012 00:08

дада, будут портить
я просто игрался на таком примере
Код AS3:

public class MenuButton extends Sprite
{
        private static var _currentSelected:MenuButton;
        public function MenuButton()
        {
                draw(0xC0C0C0);
                addEventListener(MouseEvent.CLICK, onClick);
                addEventListener(MouseEvent.ROLL_OVER, onOver);
                addEventListener(MouseEvent.ROLL_OUT, onOut);
 
        }
        private function draw(clr:uint):void
        {
                graphics.clear();
                graphics.beginFill(clr);
                graphics.drawRect(0, 0, 60, 20);
        }
        private function onOut(e:MouseEvent):void
        {
                draw(0xC0C0C0);
        }
 
        private function onOver(e:MouseEvent):void
        {
                draw(0x808080);
        }
 
        private function onClick(e:MouseEvent):void
        {
                filters = [new GlowFilter()];
                mouseEnabled = false;
 
                if (_currentSelected)
                {
                        _currentSelected.mouseEnabled = true;
                        _currentSelected.filters = [];
                }
                _currentSelected = this;
 
        }
}

как-то не подумал, что это совсем уж узкий случай, твой вариант универсальнее, согласен

Wolsh 15.05.2012 00:53

Есть еще одна причина кстати. Есть такой принцип дизайна интерфейсов для списков, который гласит, что на маусовер должны визуально реагировать все элементы списка, даже дизабленные. Нажмите на обычное меню приложения в винде, например пункт Edit, или любой другой, в котором есть дизабленные пункты, и проведите мышью. Дизабленные кнопки тоже отрабатывают ховер, но конечно в своей стилевой гамме. Это нужно по одной простой причине, о которой многие флэш-дизайнеры GUI забывают: меню и прочие списки листаются клавиатурой, а не только мышью. При этом курсор мыши остается стоять на месте, а выделение переходит с элемента на элемент. Если дизабленные пункты никак не будут визуализировать выделение, юзер может его потерять из виду.


Часовой пояс GMT +4, время: 16:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.