6

我正在尝试制作一个非常简单的向上滑动列表视图,当用户单击屏幕底部的按钮时会显示该视图。这是它的外观:

滑动的东西

以及 HTML/JS 中的完整实现http://jsbin.com/utAQOVA/1/edit

我尝试使用RelativeLayout将列表定位在按钮下方,并将整个内容放入包装器中,然后向上/向下设置动画(与上面的 JSBin 相同)。

问题是,即使我向上滑动,开始时不可见的底部也会以某种方式被剪掉。如果我最初显示列表的一部分,如下面的屏幕所示,底部部分会在向上移动时被剪掉,并且只显示最初可见的部分。

剪裁

做这种动画的正确方法是什么?

这是布局的相关部分

编辑:经过简短的讨论(在已接受答案的评论中),我通过移除LinearLayout动画部分的环绕解决了这个问题,我只是改变了 的高度ListView,这会将按钮向上推。

4

2 回答 2

4

您可能遇到的问题来自 ListView 如何进行自己的布局,基本上它适合屏幕上可用的大小并绘制该部分,因为您创建的 ListView 没有高度或它保持的高度非常小。您可以通过两种方法解决此问题:

  1. 用简单的 LinearLayout 替换 ListView - 填充所有列表项,如果列表中没有很多项,我会这样做 - 那么 ListView 相对于简单 LinearLayout 的优势可以忽略不计。
  2. 使用 ValueAnimator 并在制作动画时更新 ListView 的位置和高度属性。

改编自我在评论中提到的一篇文章,ValueAnimator 应该如下所示:

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.setTranslationY(-value.intValue());
            v.requestLayout();
        }
    });
  • 我不确定使用 setTranslationY 是否是解决这个问题的正确方法,或者您应该使用负的 marginTop 值(取决于布局)
于 2013-11-03T14:47:30.050 回答
1

您正在寻找的动画看起来像这样。-

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="@android:integer/config_longAnimTime"
    android:fromYDelta="100%p"
    android:toYDelta="0" />

您可以运行它并将其存储为动画 xml 资源,然后执行。-

Animation anim = AnimationUtils.loadAnimation(this, R.anim.animId);
yourView.startAnimation(anim);
于 2013-11-03T14:41:16.590 回答