安卓:如何使用动画效果隐藏和显示视图?

6

我有类似于这个问题:更新布局与动画

基本上:我有一个垂直的LinearLayout视图,里面有edittext、button和list。我想在按下按钮后隐藏edittext,以便为list腾出更多空间(按钮会向上移动)。第二次按下时,edittext应再次可见。Edittext和button高度为“wrap_content”。

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

我通过重载Animation的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);
}

问题:

我不知道如何计算高度以便于动画显示 - 当小部件被隐藏且在布局定义中使用“wrap_content”时,edittext.getHeight()返回0。

请帮忙解决?

2个回答

3

在活动完成绘制之前,您无法获取EditText的高度。因此,您可以在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
从我的角度来看,这太复杂了。通过执行 view.post(runnable); 可以实现同样的效果。在可运行对象中,您可以访问元素的高度。 - Macarse

1

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

然而,我怀疑你也面临着我曾经遇到的类似问题,描述在这个问题中。基本上,直到onCreate、onStart和onPause全部完成之前,你无法获取视图的高度,因为在此之前,活动尚未在屏幕上完成绘制。在尝试获取其高度之前,了解布局过程何时完成的好方法是在按钮ClickListener中获取高度;在布局完成之前,你根本无法单击该按钮,因此它将完成计算高度。


1
将高度保存为固定值的问题在于,重新显示后它将具有固定的高度,并且可能无法为输入提供足够的空间。 - banzai86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接