2012-08-13 77 views
22

我有一个LinearLayout,我用它作为一些按钮和textview的容器,我想动画的高度给人一种印象,当用户按下“显示“按钮。ValueAnimator的LinearLayout容器的高度动画

我已经在我的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来处理高度动画的好例子。希望对此有所帮助,谢谢!

+0

为什么不只是使用布局动画? – 2012-08-13 13:30:51

+0

坦率地说,我不知道如何使用它,我认为,因为我只针对API的更新版本,所以使用更新的类会更简单......我将继续研究如何使用LayoutAnimation实现,如果你有一个想法如何做到这一点,随时发布它作为一个更好的解决方案:) – span 2012-08-13 13:34:35

+0

是否有任何理由失效? – portfoliobuilder 2016-09-23 00:01:47

回答

57

看着这个博客文章: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的高度也可以使动画的动态注释。为了获得高度,需要首先绘制所有视图。我们必须倾听一个事件,告诉我们绘图已完成。这可以通过像这样的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); 
      } 
     }); 
    } 
+3

这帮我弄清楚了如何使用getAnimatedValue。谢谢 – speedynomads 2013-09-04 12:17:04

+0

值得关注的动画工具的更好的工作是它将在指定的持续时间内取得开始和结束点之间的中间值,并且我们可以通过该中间值更新我们的布局高度,直到我们到达目的地高度。动画也非常流畅。谢谢。 – 2016-01-14 13:11:00

+0

非常感谢!答案的第二部分帮助我很多! – Victor 2016-12-21 15:26:28