Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flex (http://www.flasher.ru/forum/forumdisplay.php?f=84)
-   -   вложеные компоненты и dragManager (http://www.flasher.ru/forum/showthread.php?t=125684)

Felicast 29.05.2009 21:23

вложеные компоненты и dragManager
 
Вложений: 1
ситуация: есть два компонента (один в одном). на них можно перетащить другой компонент (инициатор). только необходимо организовать различное поведение при отпускани инициатора.
подписался на события DRAG_ENTER и DRAG_DROP.
при наведении на вложеный компонент DRAG_ENTER сробатывает для обоих компонентах, но при отпускании DRAG_DROP срабатывает только для родительского (контейнера).

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

может я что-то не так сделал?

etc 29.05.2009 22:52

Предположительно криво работает драг-менеджер.

Felicast 30.05.2009 00:39

просмотрел исходники драгменеджера. работает он нормально. он просто диспатчит событие DRAG_ENTER всем компонентам начиная с самого глубокого. при этом он запоминает самый верхний компонент. именно ему он и диспатчит событие DRAG_DROP при отпускании.
хотя наверно логичнее было бы диспатчить наиболее глубокому компоненту.

привожу свое решение.
Код AS3:

//поиск родительского 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;
        }
        /* ... */
}



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

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