Событие Flex DRAG_DROP - возможно ли получить доступ к перетаскиваемому изображению? - PullRequest
3 голосов
/ 20 октября 2008

Когда вы запускаете действие перетаскивания Flex, вы передаете прокси-изображение, которое будет отображаться при перетаскивании по экрану. Когда происходит сброс, я хочу иметь возможность получить этот прокси, но не могу найти путь к объекту DragEvent.

Возможно ли это? Что я хочу, так это на самом деле отбрасывать перетаскиваемое изображение при отпускании кнопки мыши ... Flex автоматически выполняет приятную анимацию сжатия прокси-сервера, но я этого не хочу.

Примеры Flex показывают, чего я не хочу - прокси удален и добавлено новое изображение, но не в нужном месте ...

Дополнительная информация: я попытался добавить свое изображение прокси в качестве элемента данных в DragSource. Я смог получить к нему доступ, когда произошло падение, и увидел, что существует класс mx.managers.dragClasses.DragProxy, который, кажется, содержит всю необходимую мне информацию ... но этот класс не задокументирован?

Итак, на самом деле есть два вопроса ... как получить прокси и выяснить положение курсора мыши внутри прокси и как отключить анимацию отбрасывания Flex.

Ответы [ 9 ]

2 голосов
/ 20 октября 2008

DragProxy является статическим геттером в DragManager и имеет область действия mx_internal. Поэтому, чтобы сослаться на это, вам нужно сделать что-то вроде этого:

import mx_internal;

А в обработчике события перетаскивания:

var p:* = DragManager.mx_internal::dragProxy;

Я не уверен, как можно предотвратить анимацию. Если я узнаю, я дам вам знать.

2 голосов
/ 13 октября 2011

Чтобы отключить анимацию в списке s: List, в переопределении dragCompleteHandler вы можете «взломать» DragManager, чтобы получить dragProxy и скрыть его.

override protected function dragCompleteHandler(e:DragEvent):void
{
  DragManager.mx_internal::dragProxy.visible = false; // <- MAGIC!
  super.dragCompleteHandler(e);
}

Вероятно, применимо в других ситуациях.

1 голос
/ 16 мая 2009

Чтобы получить координаты мыши для прокси-сервера, чтобы он отбросил его в правильном месте, попробуйте следующее:

при условии, что вы инициируете перетаскивание на mouseDown, получите координаты, используя e.currentTarget.contentMouseX и e.currentTarget.contentMouseY в своем обработчике. затем добавьте их в dragSource (я сделал это как объект) как:

var drgSrc:DragSource = new DragSource();
drgSrc.addData( { x:e.currentTarget.contentMouseX, y:e.currentTarget.contentMouseY }, 'drgXY' );

затем в вашем обработчике отбрасывания (при условии, что вы помещаете его в холст с именем drpCvs):

var newImg:Image = new Image();
newImg.x = drpCvs.contentMouseX - e.dragSource.dataForFormat( 'drgXY' ).x;
newImg.y = drpCvs.contentMouseY - e.dragSource.dataForFormat( 'drgXY' ).y;

Я нашел это, когда искал способ избавиться от анимации сжатия, так что спасибо за это. Я думал, что RTF.

1 голос
/ 06 января 2009

Единственный способ предотвратить анимацию:

-Вы должны пропатчить патч класса DragProxy (то есть создать новый класс с идентичным именем, кодом и структурой пакета) и удалить код эффектов из mouseUpHandler ().

Насколько мне известно, другого способа переопределить его нет, хотя проблема была передана в качестве ошибки в Adobe более года назад.

0 голосов
/ 25 октября 2010

Настройка

event.dragInitiator.visible = false;

у меня в обработчике перетаскивания работает!

0 голосов
/ 18 октября 2010

Моим решением отключить анимацию было установить visible = 0 onMouseUp в моем пользовательском компоненте ListItemDragProxy.

0 голосов
/ 14 октября 2010

Мое решение состоит в том, чтобы удалить MouseUp-Handler в SandboxRoot и прикрепить собственный MouseUp-Handler в dragEnterHandler целевого объекта следующим образом:

protected function dragEnterHandler(event:DragEvent):void{

        DragManager.acceptDragDrop(this);

        this.dragProxy = DragManager.mx_internal::dragProxy;// get drag proxy

        var sm:ISystemManager = event.dragInitiator.systemManager.topLevelSystemManager as ISystemManager;
        var ed:IEventDispatcher = sm.getSandboxRoot();
        this.sandboxRoot = sm.getSandboxRoot();
        //remove
        ed.removeEventListener(MouseEvent.MOUSE_UP, dragProxy.mouseUpHandler, true);

        //attach own
        ed.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler, true);
        ed.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

        this.dragInitiator = event.dragInitiator;}

В mouseUpHandler я реализовал копию функции mouseUpHandler из оригинального DragProxy.as и удалил Drop-Effect.

0 голосов
/ 10 марта 2010

@ ykessler: Спасибо, патч обезьяны работал как шарм. SDK: DragProxy.as

@ Альваро: Я считаю, что такой подход приводит к состоянию гонки. Я попробовал, и это работало только иногда.

0 голосов
/ 29 апреля 2009

Если вы просто хотите предотвратить анимацию, самый простой (самый хакерский) способ заключается в следующем: создайте свой собственный прокси и добавьте обработчик MOUSE_UP на сцену, которая при запуске устанавливает видимое свойство вашего прокси в false. На самом деле он не остановит анимацию, он просто скроет прокси во время анимации. Примерно так:

var proxy:UIComponent = new UIComponent();
proxy.graphics.lineStyle(1);
proxy.graphics.beginFill(0xccddff);
proxy.graphics.drawRect(0, 0, main.width, main.height);
stage.addEventListener(MouseEvent.MOUSE_UP, function (e:MouseEvent):void {
  proxy.visible = false;
});
...