Анимация размера текста TextView, а не всего TextView

Есть ли способ анимации только размера текста TextView без масштабирования всего макета TextView?

enter image description here

Я пытаюсь добиться аналогичного эффекта. Обратите внимание на изменение размера текста на одну строку, а его размер становится меньше.

Ответ 1

Это может быть достигнуто с помощью 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();

Ответ 2

Как продолжение ответа @korrekorre: в документации предлагается использовать более простой API ObjectAnimator

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" в этом случае) должно иметь общедоступный метод настройки для этого.

Вы также можете передать startSize конструктору, если вы этого не сделаете, интерполятор будет использовать текущий размер как отправную точку

Ответ 4

С 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)