我有一个类似的问题和情况。
我需要创建一个动画,其中我需要获取正在进行动画效果的view
的高度。在这个view
中,可能会有一些子视图,例如TextView
的类型。该TextView
是多行的,并且所需的行数实际上是不确定的。
无论我做了什么,我都只能够获得当TextView
只有一行时的视图高度。当文本长度超过一行时,这种方法就会失效。
我考虑了这个答案:https://dev59.com/SG025IYBdhLWcg3wNC51#6157820 但是对我来说效果不是很好,因为我无法直接从这里访问嵌套的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
。
对于布局本身,这并不太影响,因为在这个合并的中只有一个子,因此我实际上看不到屏幕上错误的方向。但是它确实存在,并且有点破坏了这种布局测量逻辑。
除了以上内容外,可能需要摆脱视图层次结构中与LinearLayout
和其子类相关的所有填充。将它们替换为边距,即使您必须包装另一个布局才能使其看起来相同。