Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   Некорректная отработка drag & drop (http://www.flasher.ru/forum/showthread.php?t=142658)

Ivanaka 27.07.2010 17:40

Некорректная отработка drag & drop
 
Здравствуйте!
У меня следующая проблема:
Есть список объектов (пусть будут "юзеры"). Для этого списка есть функция удаления юзеров путем перетаскивания на кнопку. Для перетаскивания висит событие MOUSE_MOVE. Проблема в том, что слушатель ловит данные последнего юзера в списке (так как неизбежно протаскивается над ним) и его же удаляет. Т.е. тащишь на удаление первого юзера в списке, а удаляется последний.
Проблема решается сменой MOUSE_MOVE на MOUSE_DOWN, Но! У меня на том же объекте висит событие CLICK которое не срабатывает если есть листнер по MOUSE_DOWN, какой-то конфликт возникает непонятный. Хотелось бы спросить как решить проблему одим из путей:
1) вместо CLICK повесить другой листнер (какой?)
2) Что то сделать с MOUSE_MOVE
P.s. пробовал ставить stopImmediatePropagation(), но эффекта нет (или я что-то не так делал)

GBee 29.07.2010 02:45

1) MouseDown - запоминаете на ком - пихаете в _temp, например.
2) MouseMove - если с зажатой кнопкой и таргет совпадает с _temp (или _temp!=null), то пихаете все что нужно в DragSource и работаете с DragManager;
3) _temp = null;
4) Кнопка, на которую тянете, ловит DragEnter, DragDrop и работает с DragSource этих событий.

Ivanaka 29.07.2010 16:11

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

GBee 29.07.2010 17:57

Я вам предложил использовать ДрагМенеджер, так как у меня создается ощущение, что вы делаете за него работу.

Клик = Даун + Ап на одном объекте, поэтому клика нет.

Запоминайте кого тянете к помойке в локальную переменную, только если она = нулл. Тогда последний элемент будет в обломе.

Ivanaka 29.07.2010 23:20

GBee, спасибо за совет, заработало. Сделал так:

Код AS3:

private var tempObj:Object;
......
        target.addEventListener(MouseEvent.MOUSE_DOWN, clickFunc);
......
        public function clickFunc(e:MouseEvent):void {
                if (e.buttonDown == true){
                        tempObj = e.currentTarget
                }
                e.currentTarget.addEventListener(MouseEvent.MOUSE_MOVE, dragIt);
                e.currentTarget.addEventListener(MouseEvent.MOUSE_UP, clickUp);
        }
 
        private function dragIt(e:MouseEvent):void {
                if (e.buttonDown == true && tempObj != null){
 
                //манипуляции с DragManager
 
                }
                tempObj=null;
                e.currentTarget.removeEventListener(MouseEvent.MOUSE_MOVE, dragIt);
                e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, clickUp)
        }
 
        private function clickUp(e:MouseEvent):void {
 
                //функция для клика
 
                e.currentTarget.removeEventListener(MouseEvent.MOUSE_MOVE, dragIt);
                e.currentTarget.removeEventListener(MouseEvent.MOUSE_UP, clickUp)
        }


GBee 30.07.2010 00:02

На здоровье :о))

Тока еще два замечания - совета:
1) Вы подписываетесь на два события, а потом отписываетесь от одного. Если человек, просто кликнет , останется подпись на драгИт и тп
2) (MouseEvent.MOUSE_UP, clickUp); для системменеджера добавьте, подписку и отписку. Чтобы когда утянули что то за флэшку и бросили там не было глюков

Ivanaka 30.07.2010 01:00

Цитата:

Сообщение от GBee (Сообщение 925828)
На здоровье :о))

Тока еще два замечания - совета:
1) Вы подписываетесь на два события, а потом отписываетесь от одного. Если человек, просто кликнет , останется подпись на драгИт и тп
2) (MouseEvent.MOUSE_UP, clickUp); для системменеджера добавьте, подписку и отписку. Чтобы когда утянули что то за флэшку и бросили там не было глюков

Спасибо еще раз, про №1 тупанул :) А по поводу №2 можно поподробней?
Я так понимаю в clickFunc добавить
Код AS3:

systemManager.addEventListener(MouseEvent.MOUSE_UP, clickUp);

и отписаться вместе с остальными?

GBee 30.07.2010 01:11

Попробовать было бы быстрее ;о)


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

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