Jest to jedno rozwiązanie, ale ponieważ interfejsy API zmieniają się w czasie i mogą istnieć inne sposoby, aby to zrobić, sprawdź pozostałe odpowiedzi. Jeden twierdzi, że jest szybszy, a inny twierdzi, że jest łatwiejszy.
private int getRelativeLeft(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getLeft();
else
return myView.getLeft() + getRelativeLeft((View) myView.getParent());
}
private int getRelativeTop(View myView) {
if (myView.getParent() == myView.getRootView())
return myView.getTop();
else
return myView.getTop() + getRelativeTop((View) myView.getParent());
}
Daj znać, jeśli to zadziała.
Powinien rekurencyjnie po prostu dodać górną i lewą pozycję z każdego kontenera nadrzędnego. Możesz również zaimplementować to za pomocą, Point
jeśli chcesz.
Interfejs API systemu Android już zapewnia metodę, aby to osiągnąć. Spróbuj tego:
Oto doktor
źródło
parentViewGroup
może to być dowolny element nadrzędny w hierarchii widoków, więc działa również doskonale dla ScrollView.Użyj
view.getLocationOnScreen(int[] location);
(patrz Javadocs ). Odpowiedź znajduje się w tablicy liczb całkowitych (x =location[0]
i y =location[1]
).źródło
Najpierw otrzymuję układ główny, a następnie obliczam różnicę współrzędnych w stosunku do widoku.
Możesz także użyć
getLocationOnScreen()
zamiastgetLocationInWindow()
.źródło
Nie ma potrzeby ręcznego obliczania.
Po prostu użyj getGlobalVisibleRect w następujący sposób:
Zauważ również, że dla współrzędnych środka, a nie czegoś takiego:
Możesz po prostu zrobić:
źródło
getGlobalVisibleRect
to robi,globalOffset.set(-mScrollX, -mScrollY);
więc możesz po prostu uzyskać te wartości,getScollX/Y
jeśli potrzebujesz tylko względnych współrzędnych.Możesz użyć rozszerzenia `
; `aby uzyskać poprawne położenie widoku.
Ale jest pewien haczyk, jeśli użyjesz go przed nadmuchaniem układu, uzyskasz niewłaściwą pozycję.
Rozwiązaniem tego problemu jest dodanie w
ViewTreeObserver
ten sposób: -Globalnie zadeklaruj tablicę do przechowywania pozycji xy widoku
a następnie dodaj
ViewTreeObserver
swój układ nadrzędny, aby uzyskać wywołanie zwrotne dla inflacji układu i dopiero wtedy pobierz pozycję widoku, w przeciwnym razie otrzymasz błędne współrzędne xya następnie użyj go w ten sposób
źródło
Napisałem sobie dwie metody narzędziowe, które wydają się działać w większości warunków, obsługując przewijanie, tłumaczenie i skalowanie, ale nie rotację. Zrobiłem to po próbie użycia offsetDescendantRectToMyCoords () we frameworku, który miał niespójną dokładność. W niektórych przypadkach działało, ale w innych dawało złe wyniki.
„point” to tablica zmiennoprzecinkowa z dwoma elementami (współrzędne x & y), „przodek” to grupa widoku gdzieś powyżej „potomka” w hierarchii drzewa.
Najpierw metoda, która przechodzi od współrzędnych potomnych do przodków:
Dalej odwrotnie, od przodka do potomka:
źródło
O ile ktoś wciąż próbuje to rozgryźć. W ten sposób otrzymujesz środek X i Y elementu
view
.źródło
Właśnie znalazłem odpowiedź tutaj
Mówi: Możliwe jest pobranie lokalizacji widoku przez wywołanie metod getLeft () i getTop (). Pierwsza z nich zwraca lewą, czyli X, współrzędną prostokąta reprezentującego widok. Ta ostatnia zwraca górną, czyli Y, współrzędną prostokąta reprezentującego widok. Obie te metody zwracają położenie widoku względem jego elementu nadrzędnego. Na przykład, gdy getLeft () zwraca 20, oznacza to, że widok znajduje się 20 pikseli na prawo od lewej krawędzi swojego bezpośredniego rodzica.
więc użyj:
źródło