67 Stimmen

Android: Höhe einer Ansicht ermitteln, bevor sie gezeichnet wird

Für eine Animation muss ich die Höhe einer Ansicht kennen. Das Problem ist, dass die getHeight()-Methode immer 0 zurückgibt, es sei denn, der View ist gezeichnet. Gibt es also eine Möglichkeit, die Höhe zu ermitteln, ohne sie zu zeichnen?

In diesem Fall ist die Ansicht ein LinearLayout.

EDIT: Ich versuche, die Expand Animation von https://github.com/Udinic/SmallExamples/blob/master/ExpandAnimationExample/src/com/udinic/expand_animation_example/ExpandAnimation.java

Damit möchte ich einige weitere Informationen für ein Listenelement erweitern. Ich war nicht in der Lage, den gleichen Effekt über xml zu erreichen. Im Moment funktioniert die Animation nur, wenn man die Größe des Layouts kennt, bevor man es zeichnet.

3voto

Wirling Punkte 4055

Während diese Antwort scheint zunächst zu funktionieren, aber dann habe ich festgestellt, dass es die Ansicht, die gemessen wird, durcheinander bringt. Ich habe es behoben, indem ich die übergeordnete Ansicht übergeben habe.

/**
 * class to map width and height values.
 */
data class Point(val width: Int, val height: Int)

/**
 * Measures the view and returns the width and height.
 */
fun View.getMeasurements(parent: View): Point {
    measure(View.MeasureSpec.makeMeasureSpec(parent.width, View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(parent.height, View.MeasureSpec.UNSPECIFIED))

    return Point(measuredWidth, measuredHeight)
}

Ich habe auch eine Datenklasse erstellt, damit man besser erkennen kann, was die Werte darstellen. Sie können nun auf die Ergebniswerte wie folgt zugreifen

child.getMeasurements(parent).width

oder dies

child.getMeasurements(parent).height

0voto

Fixpoint Punkte 9251

Ok, in Bezug auf den aktualisierten Beitrag, hier ist, was Ihnen helfen wird: Animation#initialisieren Methode. Sie sollten die Initialisierung einfach dort anstelle des Konstruktors einfügen, dann haben Sie alle Größen, die Sie brauchen.

-7voto

YuviDroid Punkte 1536

Sie könnten versuchen, mit der sichtbaren Ansicht zu beginnen und dann etwas wie das Folgende hinzufügen:

view.post(new Runnable() {      
    @Override
    public void run() {
        // hide view here so that its height has been already computed
        view.setVisibility(View.GONE);
    }
});

Wenn Sie nun view.getHeight() aufrufen, sollte es die erwartete Höhe zurückgeben.

Ich bin mir nicht sicher, ob das wirklich ein guter Weg ist, aber es sollte zumindest funktionieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X