Najważniejsze pojęcia

W kolejnych sekcjach opisano kilka głównych pojęć związanych z procesem „przeciągnij i upuść”.

Proces „przeciągnij i upuść”

Proces przeciągania i upuszczania składa się z 4 etapów: rozpoczęto, i kontynuowania, porzucania i kończenia.

Rozpoczęto

W odpowiedzi na gest przeciągania przez użytkownika aplikacja wywołuje startDragAndDrop(), aby poprosić system o rozpoczęcie operacji przeciągania i upuszczania. argumenty metody zapewniają:

  • Dane do przeciągnięcia.
  • Wywołanie zwrotne do rysowania cienia
  • Metadane opisujące przeciągnięte dane
  • System reaguje, ponownie nawiązując połączenie do aplikacji w celu pobrania cienia. System wyświetli cień na urządzeniu.
  • Następnie system wysyła zdarzenie przeciągania z typem działania. ACTION_DRAG_STARTED do zdarzenia przeciągania detektor wszystkich obiektów View w bieżącym układzie. Do nadal będą otrzymywać zdarzenia przeciągania – w tym możliwe upadki zdarzenia – detektor zdarzeń przeciągania musi zwracać wartość true. To się rejestruje z detektorem w systemie. Dalej tylko zarejestrowani słuchacze otrzymywania zdarzeń przeciągania. W tym momencie słuchacze mogą też zmienić docelowego elementu View, aby pokazać, że widok może akceptacja zdarzenia utraty.
  • Jeśli detektor zdarzeń przeciągania zwraca wartość false, nie otrzymuje przeciągnięcia. zdarzeń w bieżącej operacji, dopóki system nie wyśle zdarzenia przeciągania o typie działania ACTION_DRAG_ENDED. Zwracając wartość false, detektor mówi systemowi, że nie jest zainteresowany tematem w operacji „przeciągnij i upuść” i nie chce akceptować przeciągniętych danych.
Kontynuuję
Użytkownik kontynuuje przeciąganie. Gdy cień ociągu przecina ramki ograniczającej elementu docelowego, system wysyła co najmniej jedno zdarzenie przeciągania do detektor zdarzeń przeciągania w miejscu docelowym. Słuchacz może zmienić wygląd docelowy spadek View w odpowiedzi na zdarzenie. Jeśli na przykład wydarzenie wskazuje, że cień dostaje do ramki ograniczającej target – typ działania, target (cel) ACTION_DRAG_ENTERED – słuchawka może zareagować, wyróżniając element View.
Usunięto
Użytkownik zwalnia cień w ramce ograniczającej obszar cel. System wysyła do detektora miejsca docelowego zdarzenia przeciągania z działaniem wpisz ACTION_DROP. Obiekt zdarzenia przeciągania zawiera dane, które są przesyłane do systemu w wywołanie startDragAndDrop(), które rozpoczyna operację. Słuchacz powinien zwrócić do systemu wartość logiczną true, jeśli detektor przetwarza usunięte dane. : ten krok następuje tylko wtedy, gdy użytkownik umieści cień w ramka ograniczająca obiektu View, którego detektor jest zarejestrowany na otrzymywanie zdarzeń przeciągania (miejsce docelowe). Jeśli użytkownik zwolni cień na innym nie zostanie wysłane żadne zdarzenie przeciągania elementu ACTION_DROP.
Zakończona

Gdy użytkownik zwolni cień, a system wyśle

usuń zdarzenie przeciągania z typem działania ACTION_DROP, jeśli to konieczne, system wysyła zdarzenie przeciągania z typem działania ACTION_DRAG_ENDED, aby wskazać, że przeciągania i upuszczania została zakończona. Odbywa się to niezależnie od tego, uwolni cień. Zdarzenie jest wysyłane do każdego detektora, który zarejestrowany na odbiór zdarzeń przeciągania, nawet jeśli odbiornik ACTION_DROP zdarzenie.

Każdy z tych kroków został szczegółowo omówiony w sekcji Przeciągnij i upuść.

Zdarzenia przeciągania

System wysyła zdarzenie przeciągania w formie obiektu DragEvent, który zawiera typ działania, który opisuje, co dzieje się podczas przeciągania i upuszczania proces tworzenia konta. W zależności od typu działania obiekt może też zawierać inne dane.

Detektory zdarzeń przeciągania otrzymują obiekt DragEvent. Aby uzyskać typ działania, rozmowa detektorów DragEvent.getAction() W klasie DragEvent jest 6 możliwych wartości zdefiniowanych przez stałe: które zostały opisane w tabeli 1:

Tabela 1. Typy działań DragEvent

Typ działania Znaczenie
ACTION_DRAG_STARTED Aplikacja wywołuje metodę startDragAndDrop() i uzyskuje z przeciągniętym cieniem. Jeśli detektor nadal chce otrzymywać zdarzenia przeciągania dla tej operacji musi zwrócić wartość logiczną true systemu.
ACTION_DRAG_ENTERED Cień przeciągania trafia do ramki ograniczającej detektora zdarzeń przeciągania View To jest pierwszy typ akcji zdarzenia przez detektor otrzymujemy, gdy cień dostanie się do ramki ograniczającej.
ACTION_DRAG_LOCATION Następnie ACTION_DRAG_ENTERED, cień jest nieruchomy wewnątrz ramki ograniczającej detektor zdarzenia przeciągania View
ACTION_DRAG_EXITED Obserwujesz: ACTION_DRAG_ENTERED i co najmniej 1 ACTION_DRAG_LOCATION, przesuwa się cień poza ramką detektora zdarzeń przeciągania View
ACTION_DROP Cień przeciągania zwalnia się nad detektorem zdarzenia przeciągania View Ten typ działania jest wysyłany do użytkownika View detektor obiektu tylko wtedy, gdy zwróci on wartość logiczną true w odpowiedzi na Zdarzenie przeciągania ACTION_DRAG_STARTED. Ten typ działania nie jest: wysyłana, gdy użytkownik zwolni cień na obiekt View jeśli użytkownik nie jest zarejestrowany lub jeśli użytkownik zwolni przycisk cienia na wszystko, co nie jest częścią bieżącego układu.

Detektor zwraca wartość logiczną true, jeśli przetworzyli spadek. W przeciwnym razie musi on zwracać false

ACTION_DRAG_ENDED System kończy operację przeciągania i upuszczania. Ten typ działania nie musi być poprzedzone zdarzeniem ACTION_DROP. Jeśli system wysyła ACTION_DROP, odbierając ACTION_DRAG_ENDED typu działania nie oznacza, że udało się schudnąć. Detektor musi wywołać getResult(), jak widać w tabeli 2, aby uzyskać wartość, która jest zwrócone w odpowiedzi na ACTION_DROP. Jeśli Zdarzenie ACTION_DROP nie zostanie wysłane, więc getResult() zwraca wartość false.

Obiekt DragEvent zawiera też dane i metadane, które aplikacja udostępnia systemowi w wywołaniu funkcji startDragAndDrop(). Niektóre dane są dotyczy tylko niektórych typów działań, jak podano w tabeli 2. Więcej informacje o zdarzeniach i powiązanych z nimi danych można znaleźć w sekcji A „przeciągnij i upuść”.

Tabela 2. Prawidłowe dane DragEvent według typu działania

Wartość: getAction()
Wartość: getClipDescription()
Wartość: getLocalState()
Wartość: getX()
Wartość: getY()
Wartość: getClipData()
Wartość: getResult()
ACTION_DRAG_STARTED czek; czek;        
ACTION_DRAG_ENTERED czek; czek;        
ACTION_DRAG_LOCATION czek; czek; czek; czek;    
ACTION_DRAG_EXITED czek; czek;        
ACTION_DROP czek; czek; czek; czek; czek;  
ACTION_DRAG_ENDED   czek;       czek;

Metody DragEvent getAction(), describeContents(), writeToParcel() i toString() zawsze zwraca prawidłowe dane.

Jeśli metoda nie zawiera prawidłowych danych dla określonego typu działania, zwraca null lub 0 w zależności od typu wyniku.

Przeciągnij cień

Podczas przeciągania i upuszczania system wyświetla obraz, który użytkownik przeciągnięcia. Jeśli chodzi o przenoszenie danych, ten obraz przedstawia przeciągane dane. Dla: podczas wykonywania innych operacji, obraz przedstawia jakiś aspekt operacji przeciągania.

Jest to tzw. cień do przeciągania. Tworzysz je za pomocą zadeklarowanych metod w View.DragShadowBuilder obiektu. Narzędzie przekazuje konstruktor do systemu po rozpoczęciu przeciągania i upuszczania. za pomocą funkcji startDragAndDrop(). W ramach swoich odpowiedzi na startDragAndDrop(), system wywołuje metody wywołania zwrotnego zdefiniowane w polu View.DragShadowBuilder, aby uzyskać cień.

Klasa View.DragShadowBuilder ma 2 konstruktory:

View.DragShadowBuilder(View)

Ten konstruktor akceptuje dowolne z View obiektów. Magazyn konstruktora obiektu View w obiekcie View.DragShadowBuilder, więc wywołania zwrotne aby uzyskać do niego dostęp i utworzyć cień. Nie musi to być widok View wybranego przez użytkownika do rozpoczęcia operacji przeciągania.

Korzystając z tego konstruktora, nie trzeba rozszerzać View.DragShadowBuilder lub zastąp jego metody. Domyślnie ten przycisk cień, który wygląda tak samo jak funkcja View przekazywana jako argument, znajduje się pośrodku miejsca, w którym użytkownik dotyka ekranu.

View.DragShadowBuilder()

Jeśli użyjesz tego konstruktora, w interfejsieView View.DragShadowBuilder obiekt. Pole jest ustawione na null. Musisz przedłużyć View.DragShadowBuilder i zastąp jej metody. W przeciwnym razie otrzymasz niewidoczny i przeciągający cień. System nie zgłasza błędu.

Klasa View.DragShadowBuilder ma 2 metody, które razem tworzą przeciąganie cień:

onProvideShadowMetrics()

System wywołuje tę metodę natychmiast po wywołaniu funkcji startDragAndDrop(). Użyj tej metody, aby wysłać wymiary i punkt styku cienia do w systemie. Metoda ma 2 parametry:

outShadowSize: Point obiektu. Szerokość cienia przeciągania jest zwiększana x, a jego wysokość zostanie wpisana y

outShadowTouchPoint: obiekt Point. Punktem styczności z klientem jest lokalizacja wewnątrz cienia, które musi znajdować się pod palcem użytkownika podczas przeciągania. Jej pozycja na X znajdzie się w przedziale x, a miejsce Y w miejscu y.

onDrawShadow()

Zaraz po wywołaniu onProvideShadowMetrics() system wywołuje onDrawShadow(), aby utworzyć cień. Metoda ma jeden parametr jest to obiekt Canvas, który które system tworzy na podstawie parametrów podanych w onProvideShadowMetrics() Metoda powoduje narysowanie cienia przeciągania na podanym Canvas

Aby poprawić wydajność, cień przeciągania powinien być mały. Dla singla elementu, możesz użyć ikony. W przypadku wyboru wielu elementów możesz chcesz używać ikon stosów, a nie pełnych obrazów rozłożyć po ekranie.

Przeciągnij detektory zdarzeń i metody wywołania zwrotnego

View odbiera zdarzenia przeciągania za pomocą detektora zdarzeń przeciągania, który implementuje View.OnDragListener lub za pomocą metody wywołania zwrotnego onDragEvent() widoku. Kiedy system wywoła metodę lub detektor, DragEvent.

W większości przypadków lepiej korzystać z detektora niż metody wywołania zwrotnego. Kiedy projektujesz UI, zwykle nie podklasyfikujesz klas View, ale korzystasz z Wymaga to utworzenia podklas w celu zastąpienia metody. W możesz wdrożyć jedną klasę detektora, a następnie użyć jej z wieloma różnych obiektów View. Możesz też wdrożyć je jako anonimową klasę wbudowaną lub lambda. Aby ustawić odbiornik obiektu View, wywołaj setOnDragListener()

Możesz też zmienić domyślną implementację atrybutu onDragEvent() bez zastępowania metody. Ustaw OnReceiveContentListener widoku danych; , aby dowiedzieć się więcej, zobacz setOnReceiveContentListener() Następnie metoda onDragEvent() domyślnie wykonuje te czynności:

  • Zwraca wartość „prawda” w odpowiedzi na wywołanie funkcji startDragAndDrop().
  • Połączenia performReceiveContent() jeśli dane przeciągnij i upuść w widoku. Dane są przekazywane do jako obiektu ContentInfo. wywołuje metodę OnReceiveContentListener.

  • Zwraca wartość „prawda”, jeśli dane metodą „przeciągnij i upuść” zostały upuszczone w widoku OnReceiveContentListener konsumuje wszystkie treści.

Określ OnReceiveContentListener, który będzie przetwarzać dane na potrzeby Twojej firmy aplikacji. Aby uzyskać zgodność wsteczną do poziomu 24 interfejsu API, użyj wersji Jetpack OnReceiveContentListener

Możesz mieć detektor zdarzeń przeciągania i metodę wywołania zwrotnego dla obiektu View w W takim przypadku system najpierw wywoła detektor. System nie wywołuje funkcji metody wywołania zwrotnego, chyba że detektor zwraca wartość false.

Kombinacja metody onDragEvent() i View.OnDragListener to analogicznie do kombinacji funkcji onTouchEvent(). i View.OnTouchListener używane ze zdarzeniami dotknięcia.