【问题标题】:TextView animation expand only one lineTextView 动画只展开一行
【发布时间】:2015-06-02 20:23:46
【问题描述】:

单击按钮时,我需要为 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();
}

在调试中,我注意到当我在 expand 的视图中使用 getMeasuredHeight() 方法时,该值始终为 76,即使我添加了多于一行的项目。

附:我在该行的点击监听器中调用expandcollapse

截图:

【问题讨论】:

    标签: android animation textview


    【解决方案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();
    }
    

    【讨论】:

      【解决方案2】:

      当您将 Visibility 设为 GONE 时,在实际绘制之前您无法知道它的测量高度。为此,您需要在该 TextView 上安装 GlobalLayoutListener,这样您就可以在绘制时获得它的测量高度。

      在您的expand方法中,我看到您将Visibility设置为Visible,然后尝试测量它,不会立即绘制,因此无法获取高度。

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

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

      【讨论】:

      • 感谢您的回答,但现在我想到了一个问题:如果我使用此方法,如何将我单击的行的高度保存在全局变量中?我的意思是根据我需要做的过程 GONE - VISIBLE - GONE
      • 所以两个问题,1-) 你的视图(你点击展开/折叠)最初是 GONE 吗?你先点击展开它吗? 2-) 它们在 RecyclerView 行中是否都具有相同的高度?如果您还可以附上一个屏幕截图,这将有助于我清楚地理解它。
      • 我的视图最初消失了,我需要单击以展开/折叠它们,它们的高度不同。我现在可以附加屏幕了
      • 所以我可以看到,您的“数量”文本和您要扩展的文本具有相同的高度。为什么不使用 Visible Text View 的高度?
      • 我的一个应用程序中有一个类似的功能,我最终使用了this 库。它以非常好的方式处理它。
      猜你喜欢
      • 1970-01-01
      • 2018-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2020-07-27
      相关资源
      最近更新 更多