我在LinearLayout中有一个TextView。我的目标是在文本更改时需要动画TextView高度更改,并且需要更多或更少的行。
我以这种方式分工:
淡入/淡出部分很容易,但我为高度变化动画而奋斗。
这是我简化的布局:
<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不会为高度变化设置动画,因此不是解决方案,但我没有尝试过。
答案 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);
}
}
您可以相应地设置参数,它应该完成工作。希望它有所帮助。