Анимация размера текста 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
конструктору, если вы этого не сделаете, интерполятор будет использовать текущий размер как отправную точку
Ответ 3
вы можете попробовать с помощью таких библиотек:
Первая библиотека
Вторая библиотека
Ответ 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)