2009-05-02 3 views
0

У меня есть обработчик перетаскивания в моем приложении 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); 
} 

ответ

3

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

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

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

var dragProxy : Image = new Image(); 
dragProxy.source = dragInitiator.source; 
dragProxy.width = dragInitiator.width; 
dragProxy.height = dragInitiator.height; 
+0

Спасибо! Это решает мою проблему! Но почему изображение появляется, когда я помещаю doDrag в таймаут? Я подумал, что нужно создать другой экземпляр изображения и загрузить его в первую очередь. В какой-то момент изображение автоматически устанавливает ширину и высоту изображения? – Aethex

2

Вы лучше с помощью растрового захвата изображения и использования, что, как ваш 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, используя растровое и поставить Bitmap в качестве источника компонента изображения. Подробнее/примеры в этом блоге:

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

Смежные вопросы