Ich versuche, eine Animation auf eine Ansicht in meiner Android-App anzuwenden, nachdem meine Aktivität erstellt wurde. Dazu muss ich die aktuelle Größe der Ansicht bestimmen und dann eine Animation einrichten, die von der aktuellen Größe auf die neue Größe skaliert. Dieser Teil muss zur Laufzeit ausgeführt werden, da die Ansicht je nach Benutzereingabe auf unterschiedliche Größen skaliert werden kann. Mein Layout ist in XML definiert.
Dies scheint eine leichte Aufgabe zu sein, und es gibt viele SO-Fragen dazu, obwohl keine offensichtlich mein Problem gelöst hat. Vielleicht fehlt mir etwas Offensichtliches. Ich bekomme einen Überblick über meine Ansicht durch:
ImageView myView = (ImageView) getWindow().findViewById(R.id.MyViewID);
Dies funktioniert gut, aber wenn Sie anrufen getWidth()
, getHeight()
, getMeasuredWidth()
, getLayoutParams().width
usw., sie alle zurück 0. Ich habe auch manuell aufrufen versucht , measure()
auf der Ansicht , gefolgt von einem Aufruf getMeasuredWidth()
, aber das hat keine Wirkung.
Ich habe versucht, diese Methoden aufzurufen und das Objekt im Debugger in meiner Aktivität onCreate()
und in zu untersuchen onPostCreate()
. Wie kann ich zur Laufzeit die genauen Abmessungen dieser Ansicht ermitteln?
quelle
match_parent
). In diesem Fall besteht eine einfachere Lösung, die sicher aufgerufen werden kann, noch bevor die Ansicht gezeichnet wird (z. B. aus der onCreate () -Methode Ihrer Aktivität), darin, nur Display.getSize () zu verwenden. Weitere Informationen finden Sie unter stackoverflow.com/a/30929599/5025060 . Ich weiß, dass @NikReiman nicht darum gebeten hat, sondern nur eine Notiz für diejenigen hinterlassen hat, die diese einfachere Methode möglicherweise anwenden können.Antworten:
Verwenden Sie den ViewTreeObserver in der Ansicht, um auf das erste Layout zu warten. Erst nach dem ersten Layout funktioniert getWidth () / getHeight () / getMeasuredWidth () / getMeasuredHeight ().
quelle
removeGlobalOnLayoutListener(this);
? weil es veraltet ist.Je nach Szenario gibt es tatsächlich mehrere Lösungen:
Beispielnutzung:
Wenn Sie die Größe des Containers kennen:
Wenn Sie in Kotlin schreiben, können Sie die nächste Funktion verwenden, die hinter den Kulissen genau so funktioniert, wie
runJustBeforeBeingDrawn
ich es geschrieben habe:Beachten Sie, dass Sie dies zu gradle hinzufügen müssen (finden Sie hier ):
quelle
OnPreDrawListener
. Getesteter Fall, wenn Sie Code von Activity's ausführen möchtenonCreate()
und sofort eine Hintergrund-App haben. Besonders bei langsameren Geräten leicht zu wiederholen. Wenn Sie ersetzenOnPreDrawListener
mitOnGlobalLayoutListener
- Sie werden nicht gleiches Problem sehen.ViewTreeObserver
oder benutzepost
, hat in meinem Fall Nummer 2 geholfen (view.measure
).Rufen Sie an,
getWidth()
bevor die Ansicht tatsächlich auf dem Bildschirm angezeigt wird?quelle
onSizeChange()
Ereignis zu erfassen und die tatsächliche Größe zu ermitteln? Das scheint ein bisschen übertrieben zu sein ... obwohl ich an diesem Punkt verzweifelt bin, nur um den Code zum Laufen zu bringen, also ist es einen Versuch wert.onPostCreate()
einzufügen, der ausgeführt wird, nachdem die Ansicht vollständig erstellt und gestartet wurde.Basierend auf @ mbairds Ratschlägen fand ich eine praktikable Lösung, indem ich die
ImageView
Klasse unterordnete und überschriebonLayout()
. Anschließend erstellte ich eine Beobachterschnittstelle, die meine Aktivität implementierte, und übergab einen Verweis auf sich selbst an die Klasse, sodass sie der Aktivität mitteilen konnte, wann die Dimensionierung tatsächlich abgeschlossen war.Ich bin nicht zu 100% davon überzeugt, dass dies die beste Lösung ist (daher markiere ich diese Antwort noch nicht als richtig), aber es funktioniert und laut Dokumentation ist es das erste Mal, dass man die tatsächliche Größe einer Ansicht findet.
quelle
Hier ist der Code zum Abrufen des Layouts durch Überschreiben einer Ansicht, wenn API <11 (API 11 enthält die View.OnLayoutChangedListener-Funktion):
quelle
Sie können diese Frage überprüfen . Sie können die post () -Methode von
View
's verwenden.quelle
Verwenden Sie den folgenden Code, um die Größe der Ansicht anzugeben.
quelle
Das funktioniert bei mir in meinem
onClickListener
:quelle
Ich war auch verloren um
getMeasuredWidth()
undgetMeasuredHeight()
getHeight()
undgetWidth()
für eine lange Zeit .......... später fand ich , dass die Breite und die Höhe der Ansicht immer inonSizeChanged()
ist der beste Weg , dies zu tun ........ Sie können dynamisch Erhalten Sie Ihre aktuelle Breite und aktuelle Höhe Ihrer Ansicht, indem Sie die überschreibenonSizeChanged(
Methode) .Vielleicht möchten Sie einen Blick darauf werfen, der ein ausgeklügeltes Code-Snippet enthält. Neuer Blog-Beitrag: So erhalten Sie die Abmessungen für Breite und Höhe einer benutzerdefinierten Ansicht (erweitert Ansicht) in Android http://syedrakibalhasan.blogspot.com/2011/02/how-to-get-width-and-height-dimensions.html
quelle
Sie können sowohl Position als auch Dimension der Ansicht auf dem Bildschirm anzeigen
quelle
funktioniert perfekt für mich:
quelle