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ówView
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 elementuView
, 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łaniaACTION_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 elementView
. - 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łaniestartDragAndDrop()
, 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 obiektuView
, 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 elementuACTION_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łaniaACTION_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 odbiornikACTION_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:
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ą |
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ść”.
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 obiektuView
w obiekcieView.DragShadowBuilder
, więc wywołania zwrotne aby uzyskać do niego dostęp i utworzyć cień. Nie musi to być widokView
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 funkcjaView
przekazywana jako argument, znajduje się pośrodku miejsca, w którym użytkownik dotyka ekranu.View.DragShadowBuilder()
Jeśli użyjesz tego konstruktora, w interfejsie
View
View.DragShadowBuilder
obiekt. Pole jest ustawione nanull
. 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ększanax
, a jego wysokość zostanie wpisanay
outShadowTouchPoint
: obiektPoint
. 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 przedzialex
, a miejsce Y w miejscuy
.onDrawShadow()
Zaraz po wywołaniu
onProvideShadowMetrics()
system wywołujeonDrawShadow()
, aby utworzyć cień. Metoda ma jeden parametr jest to obiektCanvas
, który które system tworzy na podstawie parametrów podanych wonProvideShadowMetrics()
Metoda powoduje narysowanie cienia przeciągania na podanymCanvas
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 obiektuContentInfo
. 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.