2008-08-14 10 views
5

Una vez que he llamado al DragManager.acceptDrag, ¿hay alguna forma de "no aceptar" el arrastre? Supongamos que tengo una vista que puede aceptar arrastrar y soltar, pero solo en ciertas áreas. Una vez que el usuario se arrastra sobre una de estas áreas llamo al DragManager.acceptDrag(this) (desde un controlador DragEvent.DRAG_OVER), pero si el usuario se muda de esta área, me gustaría cambiar el estado del arrastre para que no se acepte y muestre la retroalimentación DragManager.NONE. Sin embargo, ni llamar DragManager.acceptDrag(null) ni DragManager.showFeedback(DragManager.NONE) parece tener ningún efecto. Una vez que acepté el arrastre y establecí el tipo de comentario, parece que no puedo cambiarlo.¿Cómo puedo "eliminar" un arrastre en Flex?

Solo para aclararlo: las áreas donde el usuario debería poder caídas no son componentes o incluso objetos de visualización, de hecho son solo rangos en el texto de un campo de texto (como la selección). Si hubieran sido sus propios componentes, podría haberlo resuelto haciendo que cada uno de ellos aceptara los eventos de arrastre individualmente. Creo que podría crear componentes de proxy que floten sobre el texto para emularlo, pero prefiero no hacerlo si no es necesario.


he conseguido que funcione tanto en el aire y el navegador ahora, pero sólo al someter los componentes del proxy en la parte superior de los rangos de texto en el que debe ser capaz de dejar caer las cosas. De esa forma obtengo la respuesta correcta y las gotas no se aceptan automáticamente en la salida de arrastre.

Esto es lo más curioso de D & D en AIR:

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

En Flex basado en el navegador, y offsetXoffsetY debe ser negativo (lo que dice la documentación, y funciona muy bien). Sin embargo, cuando ejecuta exactamente el mismo código en AIR, tiene que hacer que los desplazamientos sean positivos. Los mismos números, pero positivos. Eso es muy, muy raro.


He probado un poco más y lo @maclema obras, pero no si se ejecuta en AIR. Parece que arrastrar y soltar en AIR es diferente. Es realmente, muy raro porque no solo la retroalimentación no se muestra correctamente, y no es posible dejar de recibirla, pero las coordenadas también están completamente apagadas. Acabo de probar mi aplicación en un navegador en lugar de AIR y arrastrar y soltar está completamente roto.

Además, omitir el controlador dragEnter funciona bien en AIR, pero lo rompe todo cuando se ejecuta en un navegador.

Respuesta

6

¿Está utilizando solo el método dragEnter? Si intenta rechazar el arrastre mientras arrastra sobre el mismo componente, necesita usar los métodos dragEnter y dragOver.

Salida este ejemplo:

<?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

Al aceptar el arrastre en la 'manejador DRAG_ENTER' sólo empeora las cosas. Todavía no puedo rechazar el arrastre (llamar a 'DragManager.acceptDragDrop (null) 'no tiene ningún efecto, al menos no tiene efecto visible) y aceptar el arrastre al entrar elimina el poco control que tenía. Ahora, el + debajo del puntero se muestra tan pronto como el mouse ingresa al componente, en lugar de comenzar a mostrar cuando el usuario arrastró las áreas especiales. – Theo

+0

bien, eso haría que el iniciador también sea un objetivo, mostrando el + cuando el usuario arrastra sobre ese componente (que definitivamente no debería, ya que no acepta caídas). Entonces eso tampoco funciona. – Theo

0

bien, veo el problema ahora. En lugar de nulo, intente configurarlo en el ArranqueInitiador.

Mira esto.

<?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

Sí, arrastrar y soltar es diferente en AIR. ¡Odio eso! Se necesita mucho juego para descubrir cómo hacer que las cosas funcionen de la misma manera que la personalizada que se creó en flex.

En cuanto a las coordenadas, tal vez juegue con los métodos localToContent y localToGlobal. Pueden ayudar a traducir las coordenadas a algo útil.

Buena suerte. Te dejaré saber si pienso en otra cosa.

1

Si no necesita arrastrar y colocar nativo en AIR, puede obtener el comportamiento de arrastrar y soltar de Flex al crear una subclase de WindowedApplication y configurar el DragManager. Consulte esta publicación en Adobe Jira para obtener más información: https://bugs.adobe.com/jira/browse/SDK-13983

1

Está malinterpretando el concepto. Su "inacepcion" se logra implementando el dragOverHandler e indicando que los datos no son necesarios.

Aquí es el concepto básico:

  1. registrar el dragEnterHandler o reemplazar el método ya registrado.

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

    Esto permite que su contenedor reciba más mensajes (dragOver/dragExit). Pero esto es NO la ubicación para decidir qué tipo de cursor del mouse debería mostrarse.

    Sin DragManager.acceptDragDrop (this); los otros controladores no son llamados.

  2. registre el dragOverHandler o anule el método ya registrado.

    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 
    } 
    

    Calling DragManager.showFeedback (DragManager.NONE); hace el truco para mostrar la "inaceptable".

  3. registre dragExitHandler o anule el método ya registrado.

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