Ich hatte ein ähnliches Problem mit einer ähnlichen Situation.
Ich musste eine Anmiation erstellen, für die ich die Höhe der view
die der Animation unterliegt. Innerhalb dieser view
die ein LinearLayout
kann eine untergeordnete Ansicht des Typs TextView
. Das TextView
ist mehrzeilig und die Anzahl der tatsächlich benötigten Zeilen variiert.
Was immer ich getan habe, ich habe nur die gemessene Höhe für die Ansicht, als ob die TextView
hat nur eine Zeile zu füllen. Kein Wunder, dass dies jedes Mal gut funktionierte, wenn der Text kurz genug für eine einzige Zeile war, aber nicht, wenn der Text länger als eine Zeile war.
Ich habe mir diese Antwort überlegt: https://stackoverflow.com/a/6157820/854396 Aber das hat bei mir nicht so gut funktioniert, weil ich nicht in der Lage bin, auf die eingebettete TextView
direkt von hier aus. (Ich hätte allerdings auch den Baum der untergeordneten Ansichten durchgehen können).
Schauen Sie sich meinen Code an, denn er funktioniert im Moment:
view
ist die Ansicht, die animiert werden soll. Sie ist eine LinearLayout
(Die endgültige Lösung wird hier etwas typsicherer sein) this
ist eine benutzerdefinierte Ansicht, die Folgendes enthält view
und erbt von LinearLayout
zu.
private void expandView( final View view ) {
view.setVisibility(View.VISIBLE);
LayoutParams parms = (LayoutParams) view.getLayoutParams();
final int width = this.getWidth() - parms.leftMargin - parms.rightMargin;
view.measure( MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
final int targetHeight = view.getMeasuredHeight();
view.getLayoutParams().height = 0;
Animation anim = new Animation() {
@Override
protected void applyTransformation( float interpolatedTime, Transformation trans ) {
view.getLayoutParams().height = (int) (targetHeight * interpolatedTime);
view.requestLayout();
}
@Override
public boolean willChangeBounds() {
return true;
}
};
anim.setDuration( ANIMATION_DURATION );
view.startAnimation( anim );
}
Das war fast alles, aber ich habe noch einen Fehler gemacht. Innerhalb der View-Hierarchie gibt es zwei benutzerdefinierte Views, die Unterklassen von LinearLayout
und deren xml wird mit einer merge
Tag als xml Root Tag. Innerhalb eines dieser merge
Tags, die ich übersehen habe, um die android:orientation
Attribut zu vertical
. Das störte das Layout selbst nicht allzu sehr, denn in diesem zusammengefassten ViewGroup
war nur ein Kind ViewGroup
und deshalb konnte ich die falsche Ausrichtung auf dem Bildschirm nicht wirklich sehen. Aber sie war da und hat die Logik der Layout-Messung ein wenig durchbrochen.
Zusätzlich zu den oben genannten Punkten kann es erforderlich sein, alle Auffüllungen loszuwerden, die mit LinearLayout
s und Unterklassen innerhalb der Ansichtshierarchie. Ersetzen Sie sie durch Ränder, auch wenn Sie ein anderes Layout darum wickeln müssen, damit es gleich aussieht.