使用 ValueAnimator 对 LinearLayout 容器的高度进行动画处理

Posted

技术标签:

【中文标题】使用 ValueAnimator 对 LinearLayout 容器的高度进行动画处理【英文标题】:Animation of height of LinearLayout container with ValueAnimator 【发布时间】:2012-08-09 17:40:09 【问题描述】:

我有一个 LinearLayout,我用它作为一些按钮和 textview 的容器,我想为它们的高度设置动画,以便在用户按下“显示”按钮时给人一种布局向下滑动的印象。

我已在我的 xml 中将 LinearLayout 设置为 layout_ 和 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 处理高度动画。希望得到一些帮助,谢谢!

【问题讨论】:

为什么不直接使用布局动画? 坦率地说,我不知道如何使用它,我认为由于我只针对 API 的较新版本,因此使用较新的类会更简单......我会继续研究如何使用 LayoutAnimation 进行操作,如果您对如何操作有任何想法,请随时将其发布为更好的解决方案 :) 无效有什么原因吗? 【参考方案1】:

看这篇博文: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);
            
        );
    

【讨论】:

这帮助我弄清楚了如何使用 getAnimatedValue。谢谢 值动画师更好的工作是它将在指定的持续时间内在起点和终点之间取中间值,我们可以通过该中间值更新布局高度,直到达到目标高度。动画也非常流畅.谢谢。 非常感谢!答案的第二部分对我帮助很大!

以上是关于使用 ValueAnimator 对 LinearLayout 容器的高度进行动画处理的主要内容,如果未能解决你的问题,请参考以下文章

Android属动画ObjectAnimator和ValueAnimator应用

android动画具体解释四 创建动画

android动画详解四 创建动画

objectanimator和valueanimator有啥区别

ValueAnimator 使用注意事项

Android动画——属性动画