带有ValueAnimator的LinearLayout容器的高度animation

我有一个LinearLayout,我用它作为一些button和textview的容器,我想animation的高度,以给用户按下“显示”button时下滑布局的印象。

我已经在我的xml中将LinearLayout设置为layout_height =“0dp”和visibility =“gone”。 然后,我希望将其设置为可见,无论高度需要包装的内容。 目前我还有问题,甚至animation它,永远不要包装内容的高度。

这是我的animation方法:

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的function? 我查看了Chet Haase的博客文章,但是他们没有包含任何具体的高度animation示例。 我也无法find如何使用3.0+以上的API来处理高度animation的好例子。 会喜欢这个帮助,谢谢!

Solutions Collecting From Web of "带有ValueAnimator的LinearLayout容器的高度animation"

看这个博客文章: http : view.invalidate()我发现我不应该使用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的高度以及使animationdynamic的说明。 为了获得高度,需要首先绘制所有视图。 Therfor我们必须听一个事件,告诉我们绘图完成。 这可以从像这样的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); } }); }