如何为TextView高度更改设置动画

时间:2016-08-23 16:11:05

标签: android animation textview

我在LinearLayout中有一个TextView。我的目标是在文本更改时需要动画TextView高度更改,并且需要更多或更少的行。

我以这种方式分工:

  1. 淡出旧文本
  2. 为TextView新高度(以及父LinearLayout)
  3. 设置动画
  4. 淡入新文字
  5. 淡入/淡出部分很容易,但我为高度变化动画而奋斗。

    这是我简化的布局:

    <LinearLayout
        android:id="@+id/fragment_tooltip_tooltip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/tooltip_blue_bg"
        android:gravity="center_vertical"
        android:orientation="horizontal">
    
        <TextView
            android:id="@+id/fragment_tooltip_message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    </LinearLayout>
    

    以下是我的尝试:

        final int currentHeight = tvMessage.getHeight();
    
        tvMessage.setText(toTooltip.getMessage());
    
        tvMessage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                TooltipFragment.this.tvMessage.getViewTreeObserver().removeGlobalOnLayoutListener(this);
    
                final int newHeight = tvMessage.getHeight();
    
                ResizeAnimation resizeAnimation = new ResizeAnimation(tvMessage, tvMessage.getWidth(), tvMessage.getWidth(),
                        currentHeight, newHeight);
                resizeAnimation.setDuration(ANIM_DURATION_TRANSITION_TEXT_RESIZE);
                resizeAnimation.setInterpolator(new FastOutSlowInInterpolator());
                resizeAnimation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        // No-op
                    }
    
                    @Override
                    public void onAnimationEnd(Animation animation) {
                        // Finally we show the new content
                        ...
                    }
    
                    @Override
                    public void onAnimationRepeat(Animation animation) {
                        // No-op
                    }
                });
                tvMessage.startAnimation(resizeAnimation);
            }
        });
    

    这个解决方案的问题是tvMessage.setText(toTooltip.getMessage());用于测量新高度的线会立即展开TextView和LinearLayout,然后动画会在应用调整动画大小之前将视图调整为之前的大小,从而产生难看的视觉效果。

    我相信TextSwitcher不会为高度变化设置动画,因此不是解决方案,但我没有尝试过。

2 个答案:

答案 0 :(得分:0)

我的问题的解决方案是使用虚拟TextView并使用新文本测量它而不是使用实际的TextView。这样我的TextView在动画之前不会调整大小,我只需要在动画结束时设置文本。

有关详细信息,请参阅此答案:Getting height of text view before rendering to layout

答案 1 :(得分:-1)

您可以使用递归运行的处理程序,看起来也更清晰。因此,例如,使用此:

调用函数startTextAnimation()

在onCreate()

中有一个Handler animHandler = new Handler();

然后使用此功能:

public void startTextAnimation() {
   textView.setHeight(textView.getHeight() + 1);
   if (textView.getHeight < *whatheightyouwant*) {
       aninHandler.postDelayed(new Runnable() {
           @Override
           public void run() {
               startTextAnimation();
           }
       }, 200);
   }
}

您可以相应地设置参数,它应该完成工作。希望它有所帮助。