Cum pot "să nu accept" o tragere în Flex?

Odată ce am sunat DragManager.acceptDrag , există vreo modalitate de a "nu accepta" dragul? Spuneți că am o viziune care poate accepta drag and drop, dar numai în anumite zone. Odată ce utilizatorul trage peste una dintre aceste zone, sună DragManager.acceptDrag (aceasta) (dintr-un handler DragEvent.DRAG_OVER ), dar dacă utilizatorul se îndepărtează din această zonă Aș dori să schimbe starea tragerii pentru a nu fi acceptat și să afișeze feedbackul DragManager.NONE . Cu toate acestea, niciunul dintre numerele DragManager.acceptDrag (null) și DragManager.showFeedback (DragManager.NONE) pare să nu aibă niciun efect. Odată ce am acceptat tragerea și setarea tipului de feedback nu se pare că o schimb.

Doar pentru a clarifica: zonele în care utilizatorul ar trebui să fie capabil să renunțe nu sunt componente sau chiar obiecte de afișare, de fapt, acestea sunt doar intervale în textul unui câmp de text (cum ar fi selecția). Dacă ar fi fost componente ale lor, aș fi putut rezolva, făcându-i pe fiecare să accepte evenimente individuale. Cred că aș putea crea componente proxy care să plutească peste text pentru al emula, dar nu aș prefera dacă nu este necesar.


Am reușit să-l ajut să funcționeze atât în ​​browserul AIR, cât și în browser, dar numai prin punerea componentelor proxy pe partea de sus a gamei de text în care ar trebui să poți renunța la lucruri. În acest fel primesc feedback-ul corect și picăturile sunt automat inacceptabile la ieșirea din tragere.

This is the oddest thing about D&D in AIR:

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

În Flex, offsetX și offsetY ar trebui să fie negative (așa se spune în documentație și funcționează bine). Cu toate acestea, atunci când executați exact același cod în AIR, trebuie să efectuați offseturile pozitive. Același număr, dar pozitiv. Asta este foarte, foarte ciudat.


Am testat ceva mai mult și ce @maclema dar nu dacă alergi în AIR. Se pare că drag and drop în AIR este diferit. Este într-adevăr, cu adevărat ciudat, deoarece nu numai că feedback-ul nu apare corect și că nu este posibil să nu acceptați, dar și coordonatele sunt complet dezactivate. Tocmai am încercat aplicația mea într-un browser în loc de AIR și tragerea și picurarea sunt complet rupte.

De asemenea, sărind peste manipularea dragEnter funcționează bine în AIR, dar rupe totul când rulează într-un browser.

0
fr hi bn

5 răspunsuri

Folosești numai metoda dragEnter? Dacă încercați să respingeți tragerea în timp ce încă glisați peste aceeași componentă, trebuie să utilizați ambele metode dragEnter și dragOver.

Consultați acest exemplu:

<?xml version="1.0" encoding="utf-8"?>

    
        
    
    
    

0
adăugat
Acceptarea tragerii în manipularea DRAG_ENTER face doar să înrăutățească lucrurile. Încă nu pot respinge tragerea (apelul DragManager.acceptDragDrop (null) nu are niciun efect, cel puțin nici un efect vizibil) și acceptarea tragerii pe enter elimină micul control pe care l-am avut. Acum, indicatorul + de mai jos indicatorul este afișat de îndată ce mouse-ul intră în componentă, în loc de a începe să se afișeze când utilizatorul a tras peste zonele speciale.
adăugat autor Theo, sursa
Ei bine, asta ar face și inițiatorul o țintă, arătând + când utilizatorul trage peste acea componentă (ceea ce cu siguranță nu ar trebui, deoarece nu acceptă picături). Deci și asta nu funcționează.
adăugat autor Theo, sursa

ok, văd problema acum. Mai degrabă decât null, încercați să o setați la dragInitiator.

Verifică asta.

<?xml version="1.0" encoding="utf-8"?>

    
        
    
    
    
    

0
adăugat

Da, drag and drop este diferit în AIR. Urăsc! Este nevoie de o mulțime de joc în jurul pentru a afla cum să obțineți lucrurile pentru a lucra la fel ca personalizat dnd care a fost construit în flex.

În ceea ce privește coordonatele, puteți juca în jur cu metodele localToContent și localToGlobal. Ele pot ajuta la traducerea coordonatelor la ceva util.

Mult noroc. Vă voi spune dacă mă gândesc la altceva.

0
adăugat

If you don't need native drag and drop in AIR, you can get the Flex drag and drop behavior by subclassing WindowedApplication and setting the DragManager. See this post on the Adobe Jira for more info: https://bugs.adobe.com/jira/browse/SDK-13983

0
adăugat

Înțelegeți greșit conceptul. "Neaccept" dvs. este realizat prin implementarea dragOverHandler și semnalizarea că datele nu sunt dorite.

Iată conceptul de bază:

  1. register the dragEnterHandler or override the already registered method.

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

    This enables your container to receive further messages (dragOver/dragExit). But this is NOT the location to decide which kind of mouse cursor should be displayed.

    Without DragManager.acceptDragDrop(this); the other handlers aren't called.

  2. register the dragOverHandler or override the already registered method.

    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); does the trick to display the "unaccept".

  3. register the dragExitHandler or override the already registered method.

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