Dies ist eine Lösung. Da sich APIs im Laufe der Zeit ändern und es möglicherweise andere Möglichkeiten gibt, sollten Sie die anderen Antworten überprüfen. Einer behauptet, schneller zu sein, und ein anderer behauptet, einfacher zu sein.
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());
}
Lassen Sie mich wissen, ob das funktioniert.
Es sollte rekursiv nur die obere und linke Position von jedem übergeordneten Container hinzugefügt werden. Sie können es auch mit einem implementieren, Point
wenn Sie möchten.
Die Android-API bietet bereits eine Methode, um dies zu erreichen. Versuche dies:
Hier ist das Dokument
quelle
parentViewGroup
funktioniert , möchte nur erwähnen, dass es sich um ein beliebiges übergeordnetes Element in der Ansichtshierarchie handeln kann, sodass es auch für ScrollView perfekt funktioniert.Bitte benutzen Sie
view.getLocationOnScreen(int[] location);
(siehe Javadocs ). Die Antwort liegt im Integer-Array (x =location[0]
und y =location[1]
).quelle
Zuerst erhalte ich das Root-Layout und berechne dann die Koordinatendifferenz mit der Ansicht.
Sie können auch die
getLocationOnScreen()
anstelle von verwendengetLocationInWindow()
.quelle
Sie müssen es nicht manuell berechnen.
Verwenden Sie einfach getGlobalVisibleRect wie folgt :
Beachten Sie auch, dass für die Mittelkoordinaten eher als:
Sie können einfach tun:
quelle
getGlobalVisibleRect
tun , ist ,globalOffset.set(-mScrollX, -mScrollY);
so dass Sie nur diese Werte mit bekommen könnten ,getScollX/Y
wenn Sie brauchen , um den relativen von Koordinaten.Sie können `verwenden
; `um den Ort Ihrer Ansicht korrekt zu ermitteln.
Aber es gibt einen Haken, wenn Sie es verwenden, bevor das Layout aufgeblasen wurde, erhalten Sie eine falsche Position.
Die Lösung für dieses Problem besteht darin, Folgendes hinzuzufügen
ViewTreeObserver
: -Deklarieren Sie das Array global, um die xy-Position Ihrer Ansicht zu speichern
Fügen
ViewTreeObserver
Sie dann Ihr übergeordnetes Layout hinzu, um einen Rückruf für das Aufblasen des Layouts zu erhalten, und rufen Sie erst dann die Position der Ansicht ab, da sonst falsche xy-Koordinaten angezeigt werdenund dann benutze es so
quelle
Ich habe mir zwei Dienstprogrammmethoden geschrieben, die unter den meisten Bedingungen zu funktionieren scheinen: Scrollen, Übersetzen und Skalieren, aber nicht Drehen. Ich habe dies getan, nachdem ich versucht hatte, offsetDescendantRectToMyCoords () im Framework zu verwenden, das eine inkonsistente Genauigkeit aufwies. In einigen Fällen funktionierte es, in anderen gab es falsche Ergebnisse.
"point" ist ein Float-Array mit zwei Elementen (den x & y-Koordinaten). "ancestor" ist eine Ansichtsgruppe irgendwo über dem "Nachkommen" in der Baumhierarchie.
Zuerst eine Methode, die von den Nachkommenkoordinaten zum Vorfahren geht:
Als nächstes die Umkehrung vom Vorfahren zum Nachkommen:
quelle
Falls jemand immer noch versucht, dies herauszufinden. So erhalten Sie das Zentrum X und Y des
view
.quelle
Ich habe gerade die Antwort hier gefunden
Es heißt: Es ist möglich, den Speicherort einer Ansicht durch Aufrufen der Methoden getLeft () und getTop () abzurufen. Ersteres gibt die linke oder X-Koordinate des Rechtecks zurück, das die Ansicht darstellt. Letzteres gibt die obere oder Y-Koordinate des Rechtecks zurück, das die Ansicht darstellt. Diese Methoden geben beide die Position der Ansicht relativ zu ihrer übergeordneten Ansicht zurück. Wenn getLeft () beispielsweise 20 zurückgibt, bedeutet dies, dass sich die Ansicht 20 Pixel rechts vom linken Rand ihres direkten übergeordneten Elements befindet.
Verwenden Sie also:
quelle