Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.05.2012, 22:37
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 1  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
По умолчанию 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);
тема закрыта, реально туплю
__________________
Марк Tween

Старый 14.05.2012, 23:17
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 2  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
вместо батареи add\remove листенеров ( которые к тому еще и публичными должны быть в этом раскладе) реально удобнее выставить mouseEnabled = true\false, не?

Старый 14.05.2012, 23:28
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 3  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
вместо батареи add\remove листенеров ( которые к тому еще и публичными должны быть в этом раскладе) реально удобнее выставить mouseEnabled = true\false, не?
Ну видимо не приходилось вам никогда создавать такие кнопки.
1. Методы публичными делать не надо. Они все приватные, как описано выше. Почему ?! Сам первый раз задумался об этом, но если ты в классе А имеющий приватные методы, создаешь статическую переменную B того же класса, то все приватные методы B видны, как публичные для этого класса.
2. Удобнее в сто раз, но не получится сделать через моусЕнаблед вот почему
Код AS3:
function onClick():void
{
   this.mouseEnabled = false;
   // и тут же сразу полетит событие OUT , поэтому от него приходится отписываться полюбому, ну а уж от одного отписались, то и от других не лень
}
__________________
Марк Tween

Старый 14.05.2012, 23:46
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
ага, возможно так и складнее/понятнее
хотя как по мне, так MOUSE_OUT здесь не помеха вовсе: кнопка просто уходит в нейтральное (или какое-то выделенное) состояние при клике, что и логично какбе

Старый 14.05.2012, 23:52
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
хотя как по мне, так MOUSE_OUT здесь не помеха вовсе: кнопка просто уходит в нейтральное (или какое-то выделенное) состояние при клике, что и логично какбе
Over - gotoAndStop(2);
Out - gotoAndStop(1);
Click - gotoAndStop(3);
Все 3 кадра ПОЛНОСТЬЮ разные. Ну и как быть ? Аут все портить будет полюбому
__________________
Марк Tween

Старый 15.05.2012, 00:08
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 6  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
дада, будут портить
я просто игрался на таком примере
Код 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;
 
	}
}
как-то не подумал, что это совсем уж узкий случай, твой вариант универсальнее, согласен

Старый 15.05.2012, 00:53
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Есть еще одна причина кстати. Есть такой принцип дизайна интерфейсов для списков, который гласит, что на маусовер должны визуально реагировать все элементы списка, даже дизабленные. Нажмите на обычное меню приложения в винде, например пункт Edit, или любой другой, в котором есть дизабленные пункты, и проведите мышью. Дизабленные кнопки тоже отрабатывают ховер, но конечно в своей стилевой гамме. Это нужно по одной простой причине, о которой многие флэш-дизайнеры GUI забывают: меню и прочие списки листаются клавиатурой, а не только мышью. При этом курсор мыши остается стоять на месте, а выделение переходит с элемента на элемент. Если дизабленные пункты никак не будут визуализировать выделение, юзер может его потерять из виду.
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:14.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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