![]() |
|
||||||||||
|
|||||
|
Без отписки это "ой-ой", будет грузить проц все сильнее и сильнее по мере добавления кнопок, куда бы вы старые не девали, плюс старые будут висеть в памяти.
Плюс, зачем это слушать всем кнопкам, когда отжали только одну? Как-бы в PushButton из minimalcomps, кнопках из AsWing и Flex вся эта подписка-отписка стейджа одинаково и по-человечески решается. Я просто думал, вдруг кто знает способ без stage и без SimpleButton (у нас сейчас используется упрощенное поведение кнопки - вроде глаз не сильно режет - были проблемы во вконтактовском враппере, теперь, может быть, проблема не актуальна, в одном проекте даже кнопки на базе SimpleButton использовали, но по другой причине) Последний раз редактировалось expl; 13.11.2011 в 22:19. |
|
|||||
|
Правильно говоришь, вот пришлось дописать.
private var _iCounter:int=0; //Когда нада удалить кнопки. onButtonDelete(_mcButton); onButtonDelete(_mcButton1); private function onButtonDelete(But:MovieClip):void { _iCounter--; But.removeEventListener(MouseEvent.MOUSE_OVER, onMouseEvent); But.removeEventListener(MouseEvent.MOUSE_OUT, onMouseEvent); But.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseEvent); if (_iCounter==0) { stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseEvent); } removeChild(But); But=null; } private function onMouseEvent(event:MouseEvent):void { _iCounter++; } Цитата:
case MouseEvent.MOUSE_UP : if (!(event.target is Stage)) { event.target.gotoAndStop(2); } _bDown=false; break; создаётся несколько слушателей, скорей всего только один.
__________________
Книги и желание лучшие учителя. Последний раз редактировалось Vektor; 13.11.2011 в 23:19. |
|
|||||
|
Цитата:
создали бы класс-обвертку для одной-единственной кнопки, а потом var button:DisplayObject; button = new MyButton(_mcButton); button.x = 100; button.y = 100; addChild(button); button = new MyButton(_mcButton1); button.x = 100; button.y = 200; addChild(button); Ну и сам этот несчастный класс: package { import flash.display.Sprite; import flash.display.MovieClip; import flash.events.MouseEvent; public class MyButton extends Sprite { private var button:MovieClip; public function MyButton(button:MovieClip) { this.button = button; this.button.gotoAndStop(1); addEventListener(MouseEvent.ROLL_OVER, onRollOver); addEventListener(MouseEvent.ROLL_OUT, onRollOut); addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); } private var _isOver:Boolean = false; private var _isDown:Boolean = false; private function onRollOver(event:MouseEvent):void { _isOver = true; updateFrame(); } private function onRollOut(event:MouseEvent):void { _isOver = false; updateFrame(); } private function onMouseDown(event:MouseEvent):void { _isDown = true; updateFrame(); // Стейдж здесь уже будет, иначе как на кнопку смогли нажать? stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp); } private function onMouseUp(event:MouseEvent):void { // Сработает, даже если отжали за пределами флешки, т.е. отпишемся стопроцентно stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); _isDown = false; updateFrame(); } private function updateFrame():void { if (_isDown) { if (_isOver) { this.button.gotoAndStop(4); } else { this.button.gotoAndStop(3); } } else { if (_isOver) { this.button.gotoAndStop(2); } else { this.button.gotoAndStop(1); } } } } } Последний раз редактировалось expl; 13.11.2011 в 23:57. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Самый быстрый и безбажный код - тот, которого нет. Не прорабатывая и упрощая не важные вещи можно сильно ускорить разработку. Да, это весьма спорно именно про этот момент, ведь раз сделал и оно везде и всегда.
Vektor, если onMouseEvent не статик, то будет добавлено столько слушателей MOUSE_UP, сколько кнопок. Но убьется вашим кодом только последний. Мне нравится решение как в коде от expl - слушатель на ап добавляется только при нажатии. Таким образом он максимум один (если извратов не считать) будет активный. Удалять его при удалении всех других - тоже надо (не жалко, а он может остаться). Хотя вообще я не видел от такого тормозов никогда.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. Последний раз редактировалось -De-; 13.11.2011 в 23:53. |
|
|||||
|
Тестируйте, 4раза onButtonCreate(_mcButton0,100,100);
1раз onButtonDelete(_mcButton0); По вашим словам дожно быть 4шт( stage.addEventListener(MouseEvent.MOUSE_UP, onMouseEvent) ![]() package { import flash.display.MovieClip; import flash.display.Stage; import flash.events.MouseEvent; public class Cbut extends MovieClip { private var _mcButton0:mcButton=new mcButton ; private var _mcButton1:mcButton1=new mcButton1 ; private var _mcButton2:mcButton=new mcButton ; private var _mcButton3:mcButton1=new mcButton1 ; private var _bDown:Boolean=false; private var _oDownButon:Object=new Object ; //private var _iCounter:int=0; public function Cbut() { // constructor code onButtonCreate(_mcButton0,100,100); onButtonCreate(_mcButton1,200,100); onButtonCreate(_mcButton2,200,200); onButtonCreate(_mcButton3,100,200); onButtonDelete(_mcButton0); } private function onButtonCreate(But,x:int,y:int):void { //trace(But as MovieClip) addChild(But); But.stop(); But.x=x; But.y=y; this.addEventListener(MouseEvent.MOUSE_OVER, onMouseEvent); this.addEventListener(MouseEvent.MOUSE_OUT, onMouseEvent); this.addEventListener(MouseEvent.MOUSE_DOWN, onMouseEvent); stage.addEventListener(MouseEvent.MOUSE_UP, onMouseEvent); } private function onButtonDelete(But:MovieClip):void { But.removeEventListener(MouseEvent.MOUSE_OVER, onMouseEvent); But.removeEventListener(MouseEvent.MOUSE_OUT, onMouseEvent); But.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseEvent); stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseEvent); removeChild(But); But=null; } private function onMouseEvent(event:MouseEvent):void { //_iCounter++; switch (event.type) { case MouseEvent.MOUSE_OVER : if (_bDown&&_oDownButon==event.target) { _oDownButon.gotoAndStop(3); } else { event.target.gotoAndStop(2); } break; case MouseEvent.MOUSE_OUT : event.target.gotoAndStop(1); break; case MouseEvent.MOUSE_DOWN : //stage.addEventListener(MouseEvent.MOUSE_UP, onMouseEvent); _oDownButon=event.target; event.target.gotoAndStop(3); _bDown=true; break; case MouseEvent.MOUSE_UP : if (!(event.target is Stage)) { event.target.gotoAndStop(2); } trace("Не работает") //stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseEvent); _bDown=false; break; } } } }
__________________
Книги и желание лучшие учителя. |
|
|||||
|
У меня без stage ок было, может что-то не учел?
private var _up:DisplayObject; private var _over:DisplayObject; private var _down:DisplayObject; private var _disabled:DisplayObject; public function Button() { mouseChildren = false; addEventListener(MouseEvent.ROLL_OVER, mouseHandler); addEventListener(MouseEvent.ROLL_OUT, mouseHandler); addEventListener(MouseEvent.MOUSE_DOWN, mouseHandler); addEventListener(MouseEvent.MOUSE_UP, mouseHandler); } private function mouseHandler(event:MouseEvent):void { if(!enabled) return; switch(event.type) { case MouseEvent.ROLL_OUT: layerVisibles(true, false, false); break; case MouseEvent.ROLL_OVER: case MouseEvent.MOUSE_UP: layerVisibles(false, true, false); break; case MouseEvent.MOUSE_DOWN: layerVisibles(false, false, true); break; } } private function layerVisibles(up:Boolean, over:Boolean, down:Boolean):void { if(_down) _down.visible = down; if(_over) _over.visible = over; if(_up) _up.visible = up; if(!up) { if((!_down && down) || (!_over && over)) _up.visible = true; } }
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку. Последний раз редактировалось GBee; 14.11.2011 в 01:21. |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Vektor, вы эта, знаете, что ваш код делает вообще? %)
Я там мог ошибиться, да, с 4-мя, не зная, что такое But. Из страшного Во-первых, это не класс кнопки, похоже, а класс, который каким-то странным образом их содержит. Не советую так делать, морока. Потом:
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
Цитата:
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:59. |
|
|
« Предыдущая тема | Следующая тема » |
|
|