动画TextView的文本大小而不是整个TextView

时间:2015-05-19 11:18:20

标签: android android-layout textview

有没有办法只为TextView的文字大小设置动画而不缩放整个TextView的布局?

enter image description here

我试图达到类似效果,请注意文字在尺寸变小时重新调整为一行。

4 个答案:

答案 0 :(得分:31)

这可以通过ValueAnimator实现,从我的头脑中我认为应该看起来像这样:

final TextView tv = new TextView(getApplicationContext());

final float startSize = 42; // Size in pixels
final float endSize = 12;
long animationDuration = 600; // Animation duration in ms

ValueAnimator animator = ValueAnimator.ofFloat(startSize, endSize);
animator.setDuration(animationDuration);

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
        float animatedValue = (float) valueAnimator.getAnimatedValue();
        tv.setTextSize(animatedValue);
    }
});

animator.start();

答案 1 :(得分:2)

作为@korrekorre的后续回答:文档建议使用更简单的ObjectAnimator API

final TextView tv = new TextView(getApplicationContext());

final float endSize = 12;
final int animationDuration = 600; // Animation duration in ms

ValueAnimator animator = ObjectAnimator.ofFloat(tv, "textSize", endSize);
animator.setDuration(animationDuration);

animator.start();    

只有一点需要注意:传递给构造函数的属性(在这种情况下为"textSize"必须具有公共setter方法才能使其生效。

你也可以将startSize传递给构造函数,如果你没有,那么插值器将使用当前大小作为起点

答案 2 :(得分:1)

您可以尝试使用该库:

First Library

Second Library

答案 3 :(得分:-1)

使用Kotlin,创建扩展功能,如下所示:

fun TextView.sizeScaleAnimation(endSize: Float, durationInMilliSec: Long) {
    val animator = ObjectAnimator.ofFloat(this, "textSize", endSize)
    animator.duration = durationInMilliSec
    animator.start()
}

像这样使用它:

 val endSize = resources.getDimension(R.dimen.my_new_text_size)
 myTextView.sizeScaleAnimation(endSize, 200L)