![]() |
|
||||||||||
|
|||||
|
ситуация: есть два компонента (один в одном). на них можно перетащить другой компонент (инициатор). только необходимо организовать различное поведение при отпускани инициатора.
подписался на события DRAG_ENTER и DRAG_DROP. при наведении на вложеный компонент DRAG_ENTER сробатывает для обоих компонентах, но при отпускании DRAG_DROP срабатывает только для родительского (контейнера). необходимо, чтобы при наведении на пустое место (надпись "test" в прилагаемом файле) срабатывал обработчик контейнера, а при наведение на вложенный компонент (ораньжевый прямоугольник в прилагаемом файле) срабатывал обработчик этого компонента. может я что-то не так сделал?
__________________
я могу стать всем, если только захочу |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Предположительно криво работает драг-менеджер.
|
|
|||||
|
просмотрел исходники драгменеджера. работает он нормально. он просто диспатчит событие DRAG_ENTER всем компонентам начиная с самого глубокого. при этом он запоминает самый верхний компонент. именно ему он и диспатчит событие DRAG_DROP при отпускании.
хотя наверно логичнее было бы диспатчить наиболее глубокому компоненту. привожу свое решение. //поиск родительского UIComponent для DisplayObject protected function getUIComponentFromDisplayObject(target:DisplayObject):UIComponent { var curObject:DisplayObject = target; while (curObject) { if (curObject is UIComponent) { return curObject as UIComponent; } curObject = curObject.parent; } return null; } //возвращает самый вложеный объект, который подписан на DRAG_DROP protected function testOther(x:Number, y:Number):UIComponent { var point:Point = new Point(x, y); point = DisplayObject(this).localToGlobal(point); point = DisplayObject(this.systemManager.topLevelSystemManager).globalToLocal(point); var mouseX:Number = point.x; var mouseY:Number = point.y; //получаем список всех компонентов под курсором var targetList:Array = DisplayObjectContainer(this.systemManager.topLevelSystemManager).getObjectsUnderPoint(new Point(mouseX, mouseY)); var uiTarget:UIComponent = null; var rez:UIComponent = null; for each (var tmpTarget:DisplayObject in targetList) { uiTarget = getUIComponentFromDisplayObject(tmpTarget); if (uiTarget && uiTarget.hasEventListener(DragEvent.DRAG_DROP)) { rez = uiTarget; } } return rez; } protected function dragDropHandler(event:DragEvent):void { _title.setStyle("borderStyle","none"); _title.setStyle("borderThickness","0"); var otherObject:UIComponent = testOther(event.localX, event.localY); if (otherObject && (otherObject !== this)) { otherObject.dispatchEvent(event.clone()); return; } /* ... */ }
__________________
я могу стать всем, если только захочу Последний раз редактировалось Felicast; 30.05.2009 в 15:22. |
![]() |
![]() |
Часовой пояс GMT +4, время: 03:33. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| dragManager |
|
|