2008-08-14 5 views
5

일단 내가 DragManager.acceptDrag을 호출했다면 드래그를 "허용하지 않는"방법이 있습니까? 드래그 앤 드롭을 허용 할 수있는 뷰가 있지만 특정 영역에서만 볼 수 있습니다. 사용자가이 영역들 중 하나를 드래그하면 (DragEvent.DRAG_OVER 핸들러에서)이라고하지만, 사용자가이 영역 밖으로 이동하면 허용되지 않는 드래그 상태를 변경하고 DragManager.NONE 피드백을 표시하고 싶습니다. 그러나 DragManager.acceptDrag(null)이나 DragManager.showFeedback(DragManager.NONE)을 호출해도 아무런 효과가 없습니다. 일단 드래그를 받아 들인 후에는 피드백 유형을 변경하지 못했습니다.어떻게 Flex에서 드래그를 "수락"할 수 있습니까?

사용자가 드롭 할 수 있어야하는 영역은 구성 요소가 아니거나 심지어 개체를 표시하는 영역이 아니라 실제로 선택 영역과 같은 텍스트 필드의 범위입니다. 그들이 자신의 구성 요소 였다면 각자가 드래그 이벤트를 개별적으로 받아들임으로써 해결할 수있었습니다. 나는 그것을 에뮬레이트하기 위해 텍스트 위로 떠 다니는 프록시 구성 요소를 만들 수 있다고 생각하지만 필요하지 않은 경우에는 그렇지 않을 것입니다.


나는 지금 AIR 브라우저 모두에서 작동하지만 당신이 일을 드롭 할 수 있어야 텍스트의 범위의 상단에 프록시 구성 요소를 넣어 얻을 관리했습니다. 그렇게하면 올바른 피드백을 얻을 수 있고 드랍스는 드래그 종료시 자동으로 수용되지 않습니다. 브라우저 기반의 플렉스에서

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

offsetXoffsetY 부정적인해야한다 (그래서 설명서를 말한다, 그리고 그것을 잘 작동) :

이 AIR에서 D & D에 대한 이상한 일이다. 그러나 을 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

단지 상황을 악화 있습니다. 드래그를 거부 할 수 없습니다 (DragManager.acceptDragDrop (null) 호출은 효과가 없습니다. 최소한 눈에 보이는 결과는 없습니다). 그리고 Enter 키를 눌러 드래그를 허용하면 내가 가지고있는 작은 컨트롤이 제거됩니다. 사용자가 특수 영역을 드래그했을 때 표시하기 시작하는 대신 마우스가 구성 요소에 들어가 자마자 포인터 아래의 +가 표시됩니다. – Theo

+0

글쎄, 초보자도 대상으로 만들 것이고, 사용자가 그 구성 요소 위로 드래그하면 + 표시가 나타납니다 (드롭을 허용하지 않기 때문에 분명히해서는 안됩니다). 그래서 그것도 작동하지 않습니다. – Theo

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에서 다릅니다. 나는 그것을 싫어한다! flex로 빌드 된 커스텀 dnd와 같은 일을하는 법을 알아내는 데는 많은 시간이 걸립니다.

좌표에 대해서는 localToContent 및 localToGlobal 메소드를 사용하여 재생할 수 있습니다. 좌표를 유용한 것으로 변환하는 데 도움이 될 수 있습니다.

행운을 빈다. 내가 다른 것을 생각하면 내가 알려주지.

1

AIR에서 기본 드래그 앤 드롭이 필요하지 않은 경우 WindowedApplication을 서브 클래 싱하고 DragManager를 설정하여 Flex 드래그 앤 드롭 동작을 얻을 수 있습니다. 자세한 내용은 Adobe Jira의이 게시물을 참조하십시오. https://bugs.adobe.com/jira/browse/SDK-13983

1

개념을 오해하고 있습니다. "unaccept"는 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)를 호출; 트릭에서 "unaccept"를 표시합니다.

  3. 등록하거나 이미 등록 된 메서드를 재정의하십시오. 은`DRAG_ENTER` 처리기에서 드래그를 수락

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