我遇到了类似情况的类似问题。
我必须创建一个动画,我需要 view 的高度受动画影响。在view 中,这是一个LinearLayout 可能是TextView 类型的子视图。 TextView 是多行,实际需要的行数会有所不同。
无论我做什么,我都只是得到了视图的测量高度,好像TextView 只需要填充一行。难怪每次当文本恰好足够短到一行时,这都能正常工作,但当文本长于一行时,它就会失败。
我考虑过这个答案:https://stackoverflow.com/a/6157820/854396
但是那个对我来说效果不太好,因为我无法直接从这里访问嵌入式TextView。 (虽然我可以迭代子视图树。)
看看我的代码,因为它现在可以工作:
view 是要设置动画的视图。这是一个LinearLayout
(最终的解决方案将在这里保存更多类型)
this 是一个自定义视图,包含 view 并且也继承自 LinearLayout。
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 );
}
差不多了,但我又犯了一个错误。在视图层次结构中,涉及两个自定义视图,它们是LinearLayout 的子类,它们的 xml 与 merge 标记合并为 xml 根标记。在这些merge 标记之一中,我忽略了将android:orientation 属性设置为vertical。
这对布局本身并没有太大影响,因为在这个合并的ViewGroup 中只有一个孩子ViewGroup,因此我实际上无法在屏幕上看到错误的方向。但它就在那里,有点打破了这种布局测量逻辑。
除了上述之外,可能还需要删除与LinearLayouts 和视图层次结构中的子类相关的所有填充。用边距替换它们,即使您必须围绕它包装另一个布局以使其看起来相同。