Aby obsłużyć gest przeciągania do wewnątrz, aplikacja (a zazwyczaj graficzny składnik aplikacji) musi odpowiadać na zdarzenia
nativeDragEnter
lub
nativeDragOver
.
Kroki typowej operacji przeciągania
Poniższa sekwencja zdarzeń jest charakterystyczna dla operacji przeciągania:
-
Użytkownik przeciąga obiekt schowka nad składnik.
-
Składnik wywołuje zdarzenie
nativeDragEnter
.
-
Moduł obsługi zdarzenia
nativeDragEnter
analizuje obiekt zdarzenia, aby sprawdzić dostępne formaty danych oraz dozwolone operacje. Jeśli składnik może obsłużyć przeciąganie, wywoływana jest metoda
NativeDragManager.acceptDragDrop()
.
-
NativeDragManager zmienia kursor myszy, aby wskazać, że obiekt można upuścić.
-
Użytkownik upuszcza obiekt nad składnikiem.
-
Odbierający składnik wywołuje zdarzenie
nativeDragDrop
.
-
Odbierający składnik odczytuje dane w pożądanym formacie z obiektu Clipboard w obiekcie zdarzenia.
-
Jeśli gest przeciągania został rozpoczęty w aplikacji AIR, wówczas inicjujący obiekt interaktywny wywołuje zdarzenie
nativeDragComplete
. Jeśli gest rozpoczęty został poza środowiskiem AIR, nie jest przesyłana żadna informacja zwrotna.
Potwierdzanie gestu przeciągania do wewnątrz
W momencie przeciągnięcia elementu schowka do obwiedni składnika graficznego składnik ten wywołuje zdarzenia
nativeDragEnter
i
nativeDragOver
. Aby określić, czy składnik może zaakceptować element schowka, moduły obsługi tych zdarzeń mogą sprawdzić właściwości
clipboard
oraz
allowedActions
obiektu zdarzenia. Aby zasygnalizować, że składnik może zaakceptować upuszczanie, moduł obsługi zdarzenia musi wywołać metodę
NativeDragManager.acceptDragDrop()
, przekazując odwołanie do odbierającego składnika. Jeśli więcej niż jeden zarejestrowany detektor zdarzenia wywoła metodę
acceptDragDrop()
, ostatni moduł zdarzenia na liście otrzymuje pierwszeństwo. Wywołanie
acceptDragDrop()
pozostanie poprawne, dopóki mysz nie opuści granic obiektu przyjmującego, wywołując zdarzenie
nativeDragExit
.
Jeśli w parametrze
allowedActions
przekazanym do metody
doDrag()
dozwolona jest więcej niż jedna operacja, użytkownik może wskazać, przytrzymując klawisz modyfikatora, która z dozwolonych operacji ma zostać wykonana. Menedżer przeciągania zmienia obraz kursora, aby poinformować użytkownika o tym, jaka operacja zostanie wykonana w chwili upuszczenia. Zamierzona operacja zgłaszana jest przez właściwość
dropAction
obiektu NativeDragEvent. Zestaw operacji gestu przeciągania ma tylko charakter informacyjny. Składniki związane z przesyłaniem muszą implementować właściwe zachowanie. Aby zakończyć na przykład operację przesuwania, inicjator przeciągania może usunąć przeciągany element, a cel upuszczania może go dodać.
Cel przeciągania może ograniczyć operację upuszczania do jednej z trzech możliwych operacji ustawiając właściwość
dropAction
klasy NativeDragManager. Jeśli użytkownik spróbuje wybrać inną operację za pomocą klawiatury, wówczas NativeDragManager wyświetli
niedostępny
kursor. Właściwość
dropAction
należy ustawić w modułach obsługi obu zdarzeń:
nativeDragEnter
i
nativeDragOver
.
Poniższy przykład ilustruje moduł obsługi zdarzeń dla zdarzenia
nativeDragEnter
lub
nativeDragOver
. Ten moduł obsługi akceptuje jedynie gesty przeciągania do wewnątrz, jeśli przeciągany schowek zawiera dane w formacie tekstowym.
import flash.desktop.NativeDragManager;
import flash.events.NativeDragEvent;
public function onDragIn(event:NativeDragEvent):void{
NativeDragManager.dropAction = NativeDragActions.MOVE;
if(event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)){
NativeDragManager.acceptDragDrop(this); //'this' is the receiving component
}
}
Zakończenie upuszczania
W momencie upuszczenia przez użytkownika przeciąganego elementu na obiekt interaktywny, który zaakceptował gest, obiekt interaktywny wywołuje zdarzenie
nativeDragDrop
. Moduł obsługi dla tego zdarzenia może pobrać dane z właściwości
clipboard
obiektu zdarzenia.
Jeśli schowek zawiera format zdefiniowany dla aplikacji, parametr
transferMode
przekazany do metody
getData()
obiektu Clipboard określa, czy menedżer przeciągania zwraca odwołanie lub serializowaną wersję obiektu.
Poniższy przykład ilustruje moduł obsługi zdarzenia dla zdarzenia
nativeDragDrop
:
import flash.desktop.Clipboard;
import flash.events.NativeDragEvent;
public function onDrop(event:NativeDragEvent):void {
if (event.clipboard.hasFormat(ClipboardFormats.TEXT_FORMAT)) {
var text:String =
String(event.clipboard.getData(ClipboardFormats.TEXT_FORMAT,
ClipboardTransferMode.ORIGINAL_PREFERRED));
}
Po zakończeniu działania modułu obsługi zdarzenia obiekt Clipboard staje się obiektem nieważnym. Jakakolwiek próba uzyskania dostępu do obiektu lub jego danych spowoduje wygenerowanie błędu.
Aktualizowanie formy graficznej składnika
Składnik może aktualizować swoją formę graficzną w oparciu o zdarzenia NativeDragEvent. Poniższa tabela opisuje typy zmian, które typowy składnik wykona w odpowiedzi na różne zdarzenia:
Zdarzenie
|
Opis
|
nativeDragStart
|
Inicjujący obiekt interaktywny może użyć zdarzania
nativeDragStart
, aby dostarczyć graficznej informacji zwrotnej mówiącej o tym, że gest przeciągania pochodzi z obiektu interaktywnego.
|
nativeDragUpdate
|
Inicjujący obiekt interaktywny może użyć zdarzania nativeDragUpdate, aby zaktualizować swój stan podczas wykonywania gestu. (To zdarzenie nie istnieje w środowisku AIR dla platformy Linux).
|
nativeDragEnter
|
Potencjalny, odbierający obiekt interaktywny może użyć tego zdarzenia, aby przyjąć obszar aktywności lub wskazać w sposób graficzny, że może/nie może zaakceptować upuszczanie.
|
nativeDragOver
|
Potencjalny, odbierający obiekt interaktywny może użyć tego zdarzenia, aby odpowiedzieć na ruch myszy w obiekcie interaktywnym, na przykład, gdy mysz znajdzie się w obszarze „aktywnym” złożonego składnika (np. mapa ulic).
|
nativeDragExit
|
Potencjalny, odbierający obiekt interaktywny może użyć tego zdarzenia, aby przywrócić swój stan, gdy gest przeciągania przesunie się poza jego obwiednię.
|
nativeDragComplete
|
Inicjujący obiekt interaktywny może użyć tego zdarzenia, aby zaktualizować swój skojarzony model danych np. przez usunięcie pozycji z listy i przywrócić swoją formę graficzną.
|
Wyświetlanie położenia myszy podczas gestu przeciągania do wewnątrz
Przytrzymanie gestu przeciągania nad składnikiem powoduje, że składnik ten wywołuje zdarzenia
nativeDragOver
. Zdarzenia wywoływane są co kilka milisekund, a także przy każdym przesunięciu myszy. Obiekt zdarzenia
nativeDragOver
może być używany do określania położenia myszy nad składnikiem. Dostęp do położenia myszy może być użyteczny w sytuacjach, w których odbierający składnik jest złożony, ale nie obejmuje podskładników. Na przykład, jeśli aplikacja wyświetla bitmapę zawierającą mapę ulic i obszary mapy mają być podświetlane w chwili przeciągania na nie informacji przez użytkownika, wówczas do wyświetlania położenia myszy na mapie można użyć współrzędnych myszy zgłaszanych w zdarzeniu
nativeDragOver
.
|
|
|