TextView动画只展开一行

时间:2015-06-01 21:55:20

标签: android animation textview

单击按钮时,我需要为TextView设置动画。 TextView的高度是wrap_content。这个TextView位于RecyclerView行中,我需要将其从可见性扩展到内容的真实高度。我使用了ValueAnimator。

private ValueAnimator slideAnimator(int start, int end) {
    ValueAnimator animator = ValueAnimator.ofInt(start, end);

    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            int value = (Integer) valueAnimator.getAnimatedValue();
            ViewGroup.LayoutParams layoutParams = tvAdditional.getLayoutParams();
            layoutParams.height = value;
            tvAdditional.setLayoutParams(layoutParams);
        }
    });
    return animator;
}

private void expand(View v) {
    v.setVisibility(View.VISIBLE);
    v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    ValueAnimator mAnimator = slideAnimator(0, v.getMeasuredHeight());
    mAnimator.start();
}

private void collapse(final View v) {
    int finalHeight = v.getHeight();

    ValueAnimator mAnimator = slideAnimator(finalHeight, 0);

    mAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animator) {
            v.setVisibility(View.GONE);
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });
    mAnimator.start();
}

在调试中,我注意到当我在getMeasuredHeight()的视图上使用expand方法时,值总是76,如果我添加了多行的项目。

P.S。我在行的点击监听器中调用expandcollapse

截图:

enter image description here

2 个答案:

答案 0 :(得分:1)

<强>解决

我改变了我的expand方法,添加了一个监听器,我在动画结束时将高度设置为wrap_content:

private void expand(final View v) {
    v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

    v.getLayoutParams().height = 0;
    v.setVisibility(View.VISIBLE);

    final int targetHeight = v.getMeasuredHeight();

    ValueAnimator mAnimator = slideAnimator(0, targetHeight);
    mAnimator.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {

        }

        @Override
        public void onAnimationEnd(Animator animation) {
            v.getLayoutParams().height = ViewGroup.LayoutParams.WRAP_CONTENT;
            v.requestLayout();
        }

        @Override
        public void onAnimationCancel(Animator animation) {

        }

        @Override
        public void onAnimationRepeat(Animator animation) {

        }
    });

    mAnimator.start();
}

答案 1 :(得分:0)

当你的可见度为GONE时,你无法知道它的实际绘制高度。为了实现这一点,你需要在TextView上使用GlobalLayoutListener,这样你就可以在绘制时获得它的测量高度。

在你的展开方法中,我看到你将可见性设置为可见,然后尝试测量它,不会立即绘制它,因此你无法获得高度。

那么,如果TextView的可见性最初消失,你可以做些什么来获得TextView的实际高度,首先你应该将初始可见性改为VISIBLE,其次,设置全局布局监听器,第三步,将TextView的高度存储在测量后的全局值,作为最后一步,您可以将TextView的可见性设置为GONE。

此过程通常非常快,因此您无法用眼睛看到TextView的可见性从VISIBLE变为GONE。