2008-08-14 9 views
5

Как только я позвонил DragManager.acceptDrag, есть ли способ «не принять» перетаскивание? Скажите, что у меня есть представление, которое может принимать перетаскивание, но только в определенных областях. Как только пользователь перетащит одну из этих областей, я вызываю DragManager.acceptDrag(this) (из обработчика DragEvent.DRAG_OVER), но если пользователь выйдет из этой области, я бы хотел изменить статус перетаскивания, чтобы он не был принят, и показать обратную связь DragManager.NONE. Тем не менее, ни вызов DragManager.acceptDrag(null), ни DragManager.showFeedback(DragManager.NONE), похоже, не имеет никакого эффекта. После того, как я принял перетаскивание, установите тип обратной связи, который я не могу изменить.Как я могу «отказаться» от перетаскивания в Flex?

Просто, чтобы дать понять: области, в которых пользователь должен иметь возможность отказаться, не являются компонентами или даже отображают объекты, на самом деле они всего лишь пробегают текст текстового поля (например, выбор). Если бы они были отдельными компонентами, я мог бы решить это, заставив каждого из них принимать события перетаскивания индивидуально. Думаю, я мог бы создать прокси-компоненты, которые плавают над текстом, чтобы подражать ему, но я бы предпочел, если это не обязательно.


мне удалось заставить его работать как в AIR и в браузере в настоящее время, но только поставив прокси-компоненты в верхней части диапазона текста, где вы должны быть в состоянии отказаться от вещей. Таким образом, я получаю правильную обратную связь, и капли автоматически не принимаются при перетаскивании.

Это странное дело о D & D в AIR:

DragManager.doDrag(initiator, source, event, dragImage, offsetX, offsetY); 

В основе браузера Flex, offsetX и offsetY должен быть отрицательным (так сказано в документации, и она отлично работает). Однако при запуске точно такой же код в AIR вы должны сделать положительные сдвиги. Те же цифры, но положительные. Это очень, очень странно.


Я проверил некоторые и какие @maclema работы, но если вы работаете в AIR. Кажется, что перетаскивание в AIR отличается. Это действительно, действительно странно, потому что не только обратная связь не отображается правильно, но и невозможно, но координаты также полностью отключены. Я просто попробовал свое приложение в браузере вместо AIR, и перетаскивание полностью нарушено.

Кроме того, пропуская обработчик dragEnter отлично работает в AIR, но прерывает все при работе в браузере.

ответ

6

Вы используете только метод dragEnter? Если вы пытаетесь отклонить перетаскивание при перетаскивании одного и того же компонента, вам нужно использовать методы dragEnter и dragOver.

Заканчивать этот пример:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.core.DragSource; 
      import mx.managers.DragManager; 
      import mx.events.DragEvent; 

      private function onDragEnter(e:DragEvent):void { 
       if (e.target == lbl) { 

        if (e.localX < lbl.width/2) { 
         trace("accept"); 
         DragManager.acceptDragDrop(this); 
        } 
        else { 
         DragManager.acceptDragDrop(null); 
        } 
       } 
      } 

      private function doStartDrag(e:MouseEvent):void { 
       if (e.buttonDown) { 
        var ds:DragSource = new DragSource(); 
        ds.addData("test", "text"); 

        DragManager.doDrag(btn, ds, e); 
       } 
      } 
     ]]> 
    </mx:Script> 
    <mx:Label id="lbl" text="hello world!" left="10" top="10" dragEnter="onDragEnter(event)" dragOver="onDragEnter(event)" /> 
    <mx:Button id="btn" x="47" y="255" label="Button" mouseMove="doStartDrag(event)"/> 
</mx:Application> 
+0

Принимая сопротивление в `обработчик DRAG_ENTER` только делает вещи хуже. Я все еще не могу отказаться от перетаскивания (вызов `DragManager.acceptDragDrop (null)` не имеет никакого эффекта, по крайней мере, никакого видимого эффекта), и принятие перетаскивания на входе удаляет небольшой элемент управления, который у меня был. Теперь указатель + под указателем отображается, как только мышь входит в компонент, вместо того, чтобы показывать, когда пользователь перетаскивает специальные области. – Theo 2008-08-14 16:26:15

0

нормально, я вижу проблему сейчас. Вместо значения null попробуйте установить его на dragInitiator.

Проверьте это.

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 
    <mx:Script> 
     <![CDATA[ 
      import mx.controls.Alert; 
      import mx.events.DragEvent; 
      import mx.managers.DragManager; 
      import mx.core.DragSource; 

      private function doStartDrag(e:MouseEvent):void { 
       if (e.buttonDown && !DragManager.isDragging) { 
       var ds:DragSource = new DragSource(); 
       ds.addData("test", "test"); 

       DragManager.doDrag(btn, ds, e); 
       } 
      } 

      private function handleDragOver(e:DragEvent):void { 
       if (e.localX < cvs.width/2) { 
        //since null does nothing, lets just set to accept the drag 
        //operation, but accept it to the dragInitiator 
        DragManager.acceptDragDrop(e.dragInitiator); 
       } 
       else { 
        //accept drag 
        DragManager.acceptDragDrop(cvs); 
        DragManager.showFeedback(DragManager.COPY); 
       } 
      } 

      private function handleDragDrop(e:DragEvent):void { 
       if (e.dragSource.hasFormat("test")) { 
        Alert.show("Got a drag drop!"); 
       } 
      } 
     ]]> 
    </mx:Script> 
    <mx:Canvas x="265" y="66" width="321" height="245" backgroundColor="#FF0000" id="cvs" dragOver="handleDragOver(event)" dragDrop="handleDragDrop(event)"> 
    </mx:Canvas> 
    <mx:Button id="btn" x="82" y="140" label="Drag Me" mouseDown="doStartDrag(event)"/> 
</mx:WindowedApplication> 
0

Да, перетаскивание отличается от AIR. Я ненавижу это! Требуется много игр, чтобы понять, как заставить вещи работать так же, как пользовательский dnd, который был встроен в flex.

Что касается координат, возможно, поиграйте с методами localToContent и localToGlobal. Они могут помочь в переводе координат на что-то полезное.

Удачи. Я дам вам знать, если я подумаю о чем-нибудь еще.

1

Если вам не нужно самонастраиваемое перетаскивание в AIR, вы можете получить поведение перетаскивания Flex путем подкласса WindowedApplication и установки DragManager. См. Это сообщение на Adobe Jira за дополнительной информацией: https://bugs.adobe.com/jira/browse/SDK-13983

1

Вы недопонимаете концепцию. Ваше «неприемлемость» достигается путем внедрения dragOverHandler и сигнализации о том, что данные не нужны.

Вот основная концепция:

  1. зарегистрировать dragEnterHandler или переопределить уже зарегистрированный метод.

    function dragEnterHandler(event: DragEvent):void { 
        if (data suites at least one location in this component) 
         DragManager.acceptDragDrop(this); 
    } 
    

    Это позволяет вашему контейнеру получать дополнительные сообщения (dragOver/dragExit). Но это NOT местоположение, чтобы определить, какой вид указателя мыши должен отображаться.

    Без DragManager.acceptDragDrop (this); другие обработчики не вызываются.

  2. зарегистрировать dragOverHandler или переопределить уже зарегистрированный метод.

    function dragOverHandler(event: DragEvent):void { 
        if (data suites at least no location in this component) { 
         DragManager.showFeedback(DragManager.NONE); 
         return; 
        } 
    
        ... // handle other cases and show the cursor/icon you want 
    } 
    

    Вызов DragManager.showFeedback (DragManager.NONE); делает трюк, чтобы отобразить «неприемлемость».

  3. зарегистрировать dragExitHandler или переопределить уже зарегистрированный метод.

    function dragOverHandler(event: DragEvent):void { 
        // handle the recieved data as you like. 
    }