Flex: дублирование экземпляра изображения

В моем приложении Flex есть обработчик перетаскивания. Прокси-сервер перетаскивания или «призрачное» изображение, которое будет отображаться при перетаскивании, необходимо загрузить перед перетаскиванием, а это займет некоторое время. Как сделать так, чтобы он загружался сразу или предварительно? Одним из решений является дублирование изображения, но, насколько мне известно, объекты изображения не могут быть дублированы без создания другой переменной, для загрузки которой все еще требуется некоторое время.

Возможно, этот код лучше это проиллюстрирует:

public function DragApp (e : MouseEvent) : void {
    var dragInitiator : Image = e.currentTarget as Image;
    var dragSource : DragSource = new DragSource ();

    var dragProxy : Image = new Image ();
    dragProxy.source = e.currentTarget.source; // Won't work unless image is embedded
    dragProxy.load (e.currentTarget.source); // Must load

    setTimeout (DragManager.doDrag, 350, dragInitiator, dragSource, e, dragProxy);
}

person Aethex    schedule 02.05.2009    source источник


Ответы (2)


Я считаю, что проблема в том, что вы не устанавливаете ширину и высоту изображения (как-то избыточно для встроенных изображений):

dragImage: IFlexDisplayObject (default = null) - Изображение для перетаскивания. Это необязательный аргумент. Если опущено, во время операции перетаскивания используется стандартный прямоугольник перетаскивания. Если вы указываете изображение, вы должны явно указать высоту и ширину изображения, иначе оно не появится.

Если вы определите ширину и высоту для прокси изображения в своем примере, он, вероятно, будет работать:

var dragProxy : Image = new Image ();
dragProxy.source = dragInitiator.source;
dragProxy.width = dragInitiator.width;
dragProxy.height = dragInitiator.height;
person Stiggler    schedule 02.05.2009
comment
Спасибо! Это решает мою проблему! Но почему изображение появляется, когда я помещаю doDrag в тайм-аут? Я думал, что нужно сначала создать еще один экземпляр изображения и загрузить его. У изображения автоматически устанавливается ширина и высота в какой-то момент? - person Aethex; 03.05.2009

Вам лучше использовать растровый захват изображения и использовать его в качестве вашего dragProxy. Вот простой код для захвата BitmpData из любого UIComponent:

private function getUIComponentBitmapData( target : UIComponent ) : BitmapData
{ 
    var bd : BitmapData = new BitmapData( target.width, target.height );
    var m : Matrix = new Matrix();
    bd.draw( target, m );
    return bd;  
}

Получив это, вы можете создать новое изображение Bitmap, используя BitmapData, и предоставить Bitmap в качестве источника компонента Image. Более подробная информация / примеры в этом сообщении блога:

http://www.cynergysystems.com/blogs/page/andrewtrice?entry=flex_2_bitmapdata_tricks_and

person cliff.meyers    schedule 02.05.2009