2008-08-14 16 views
5

एक बार जब मैंने DragManager.acceptDrag कहा है तो ड्रैग को "अस्वीकार्य" करने का कोई तरीका है? कहें कि मेरे पास एक ऐसा दृश्य है जो ड्रैग और ड्रॉप स्वीकार कर सकता है, लेकिन केवल कुछ क्षेत्रों में। एक बार जब उपयोगकर्ता इन क्षेत्रों में से किसी एक पर ड्रैग करता है तो मैं DragManager.acceptDrag(this) (DragEvent.DRAG_OVER हैंडलर से) पर कॉल करता हूं, लेकिन यदि उपयोगकर्ता इस क्षेत्र से बाहर निकलता है तो मैं ड्रैग की स्थिति को स्वीकार नहीं करता और DragManager.NONE फीडबैक दिखाता हूं। हालांकि, DragManager.acceptDrag(null) पर न तो DragManager.showFeedback(DragManager.NONE) पर कोई प्रभाव नहीं पड़ता है। एक बार जब मैंने ड्रैग स्वीकार कर लिया है तो एक फीडबैक प्रकार सेट करें, मैं इसे बदल नहीं सकता।फ्लेक्स में मैं ड्रैग को "अस्वीकार्य" कैसे कर सकता हूं?

बस इसे स्पष्ट करने के लिए: जिन क्षेत्रों में उपयोगकर्ता ड्रॉप करने में सक्षम होना चाहिए वे घटकों या यहां तक ​​कि वस्तुओं को प्रदर्शित नहीं कर सकते हैं, वास्तव में वे केवल टेक्स्ट फ़ील्ड (चयन की तरह) के पाठ में हैं। अगर वे स्वयं के घटक होते थे तो मैं उनमें से प्रत्येक को अलग-अलग ड्रैग इवेंट स्वीकार कर इसे हल कर सकता था। मुझे लगता है कि मैं प्रॉक्सी घटकों को बना सकता हूं जो इसे अनुकरण करने के लिए पाठ पर तैरते हैं, लेकिन अगर यह आवश्यक नहीं है तो मैं नहीं चाहूंगा।


मैं इसे केवल पाठ की सीमाओं जहां आप चीजों को ड्रॉप करने में सक्षम होना चाहिए की चोटी पर प्रॉक्सी घटक रख कर अब दोनों आकाशवाणी और ब्राउज़र में काम कर रहे है, लेकिन पाने के लिए प्रबंधित किया है। इस तरह से मुझे सही प्रतिक्रिया मिलती है और ड्रॉप ड्रैग निकास पर स्वचालित रूप से अस्वीकार्य होते हैं।

यह आकाशवाणी में के बारे में डी & डी oddest बात है:

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

में ब्राउज़र आधारित फ्लेक्स, offsetX और offsetY नकारात्मक होना चाहिए (ताकि प्रलेखन कहते हैं, और यह ठीक काम करता है)। हालांकि, चलाते समय एआईआर में ठीक उसी कोड आपको ऑफसेट सकारात्मक बनाना होगा। वही संख्या, लेकिन सकारात्मक। वह बहुत अजीब है।


मैं कुछ और अधिक और क्या काम करता है @maclema परीक्षण किया है, लेकिन अगर आप आकाशवाणी में नहीं चला। ऐसा लगता है कि एआईआर में ड्रैग और ड्रॉप अलग है। यह वास्तव में, वास्तव में अजीब है क्योंकि न केवल प्रतिक्रिया सही ढंग से दिख रही है, और यह अस्वीकार्य नहीं है, लेकिन निर्देशांक भी पूरी तरह से बंद हैं। मैंने अभी एआईआर के बजाए ब्राउज़र में अपने एप्लिकेशन की कोशिश की और ड्रैगिंग और ड्रॉपिंग पूरी तरह टूट गई है।

इसके अलावा, dragEnter हैंडलर को छोड़कर एआईआर में ठीक काम करता है, लेकिन ब्राउज़र में चलते समय सब कुछ तोड़ देता है।

उत्तर

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

+0

अच्छी तरह से, जो शुरुआतकर्ता को एक लक्ष्य भी बना देगा, + जब उपयोगकर्ता उस घटक पर ड्रैग करेगा (जो निश्चित रूप से नहीं होना चाहिए क्योंकि यह बूंदों को स्वीकार नहीं करता है)। तो यह या तो काम नहीं करता है। – Theo

0

ठीक है, मैं अब समस्या देखते हैं। शून्य की बजाय, इसे ड्रैगइनिटरेटर पर सेट करने का प्रयास करें।

इसे देखें।

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

हाँ, खींचें और ड्रॉप एआईआर में अलग है। मुझे उससे नफरत है! फ्लेक्स में बनाए गए कस्टम डीएनडी के समान काम करने के तरीके को समझने के लिए यह बहुत कुछ खेलता है।

निर्देशांक के लिए, शायद स्थानीयToContent, और स्थानीय ToGlobal विधियों के साथ खेलें। वे कुछ उपयोगी के लिए निर्देशांक का अनुवाद करने में मदद कर सकते हैं।

शुभकामनाएं। अगर मैं किसी और चीज के बारे में सोचता हूं तो मैं आपको बता दूंगा।

1

यदि आपको एआईआर में मूल ड्रैग और ड्रॉप की आवश्यकता नहीं है, तो आप विंडोएड एप्प्लिकेशंस को उप-वर्गीकरण करके और ड्रैगनमेनर सेट करके फ्लेक्स ड्रैग और ड्रॉप व्यवहार प्राप्त कर सकते हैं। अधिक जानकारी के लिए एडोब जिरा पर यह पोस्ट देखें: https://bugs.adobe.com/jira/browse/SDK-13983

1

आप अवधारणा को गलत समझ रहे हैं। ड्रैगओवरहैंडलर को कार्यान्वित करके और "डेटा को अस्वीकार करने" के संकेत से आपका "अस्वीकार्य" हासिल किया जाता है।

  1. dragEnterHandler रजिस्टर या पहले से ही पंजीकृत विधि ओवरराइड:

    यहाँ मूल अवधारणा है।

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

    यह आपके कंटेनर को और संदेश प्राप्त करने में सक्षम बनाता है (ड्रैगओवर/ड्रैगएक्सिट)। लेकिन यह यह तय करने के लिए स्थान है कि किस प्रकार का माउस कर्सर प्रदर्शित किया जाना चाहिए।

    ड्रैगमैनेजर.एसेप्ट ड्रैगड्रॉप (यह); अन्य हैंडलर नहीं कहा जाता है।

  2. ड्रैगओवरहैंडलर पंजीकृत करें या पहले से ही पंजीकृत विधि को ओवरराइड करें।

    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. ड्रैगएक्सिट हैंडलर पंजीकृत करें या पहले से ही पंजीकृत विधि को ओवरराइड करें।

    function dragOverHandler(event: DragEvent):void { 
        // handle the recieved data as you like. 
    } 
    
संबंधित मुद्दे

 संबंधित मुद्दे