我有一个 LinearLayout,我用它作为一些按钮和 textview 的容器,我想为它们的高度设置动画,以便在用户按下“显示”按钮时给人一种布局向下滑动的印象。
我已在我的 xml 中将 LinearLayout 设置为 layout_height="0dp"和 visibility="gone"。然后我希望将其设置为可见,并且需要任何高度来包装内容。目前,我什至根本无法对其进行动画处理,更不用说换行内容的高度了。
这是我制作动画的方法:
private void toggle(final LinearLayout v) {
v.setVisibility(View.VISIBLE);
ValueAnimator va = ValueAnimator.ofInt(0, 300);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
v.getLayoutParams().height = value.intValue();
v.invalidate();
}
});
va.start();
}
也许问题是我如何设置 LinearLayout 的高度?还是我误解了ValueAnimator的功能?我查看了 Chet Haase 的博客文章,但它们不包含任何特定的高度动画示例。我也没有找到很好的例子来说明如何使用 3.0+ 的 API 处理高度动画。希望得到一些帮助,谢谢!
最佳答案
查看这篇博文:http://tech.chitgoks.com/2011/10/29/android-animation-to-expand-collapse-view-its-children/我发现我不应该使用 view.invalidate()
来重绘布局。我应该使用 view.requestLayout()
。
因此代码变成了这样:
ValueAnimator va = ValueAnimator.ofInt(0, height);
va.setDuration(700);
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
v.getLayoutParams().height = value.intValue();
v.requestLayout();
}
});
我只是想添加一个注释,说明如何获取 LinearLayout 的高度以及使动画动态化。要获得高度,首先需要绘制所有 View 。因此,我们必须监听一个告诉我们绘图已完成的事件。这可以通过这样的 onResume() 方法完成(请注意,在我的 xml 中,我已将容器声明为 wrap_content 的高度并且它也是可见的,因为我想从一开始就隐藏它,我在测量它之后这样做):
@Override
public void onResume() {
super.onResume();
final ViewTreeObserver vto = filterContainer.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
height = filterContainer.getHeight();
filterContainer.setVisibility(View.GONE);
filterContainer.getLayoutParams().height = 0;
filterContainer.requestLayout();
ViewTreeObserver obs = filterContainer.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
}
});
}
关于android - 使用 ValueAnimator 对 LinearLayout 容器的高度进行动画处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11935216/