Android:如何隐藏然后显示具有动画效果的View?

时间:2010-03-22 21:16:33

标签: android animation layout hide

我有类似这样的问题:Update layout with the animation

基本上:我有一个带有edittext,按钮和列表的垂直LinearLayout视图。我想在按下按钮后隐藏exittext,为列表腾出更多空间(按钮会上升)。在第二次按下edittext应该再次可见。 Edittext和按钮具有“wrap_content”高度。

我想用动画隐藏和显示edittext。

我成功通过重载动画的applyTransformation来隐藏隐藏:

final float edittextheight= edittext.getHeight();
[....]
@Override
protected void applyTransformation(float interpolatedTime,
        Transformation t)
{
    super.applyTransformation(interpolatedTime, t);
    android.view.ViewGroup.LayoutParams lp = edittext.getLayoutParams();
    lp.height = (int)(edittextheight*(1.0-interpolatedTime));
    edittext.setLayoutParams(lp);
}

问题:

我不知道如何计算动画显示的高度 - edittext.getHeight();隐藏窗口小部件时返回​​0,并且在布局定义中我使用“wrap_content”。

帮助?

2 个答案:

答案 0 :(得分:3)

在活动完成绘制之前,您无法获得edittext的高度。因此,您可以通过在编辑文本中添加onpredrawListner来获取它。

ViewTreeObserver treeObserver = edittext.getViewTreeObserver();
treeObserver.addOnPreDrawListener(new OnPreDrawListener() {
    public boolean onPreDraw() {
            int height = edittext.getHeight();
            ViewTreeObserver removeTreeObserver = edittext.getViewTreeObserver();
     removeTreeObserver.removeOnPreDrawListener(this);
          }
}

现在你得到了高度,应用你想要的任何动画。

答案 1 :(得分:1)

你可以缓存EditText的高度吗?换句话说,当你隐藏它时,在int中保存它的高度(使用getHeight()),即使窗口小部件本身不再可见,你也可以稍后读取它。

但是,我怀疑你也遇到了类似的问题,如question所述。基本上,在onCreate,onStart和onPause完成 all 之前,你无法获得View的高度,因为在此之前,活动还没有完成在屏幕上绘制自己。在尝试获取其高度之前知道布局过程已完成的好方法只是获取按钮ClickListener中的高度;你只是无法点击按钮,直到布局完成,所以它将完成计算高度。