Есть ли способ анимации только размера текста TextView без масштабирования всего макета TextView?
Я пытаюсь добиться аналогичного эффекта. Обратите внимание на изменение размера текста на одну строку, а его размер становится меньше.
Есть ли способ анимации только размера текста TextView без масштабирования всего макета TextView?
Я пытаюсь добиться аналогичного эффекта. Обратите внимание на изменение размера текста на одну строку, а его размер становится меньше.
Это может быть достигнуто с помощью 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();
Как продолжение ответа @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
конструктору, если вы этого не сделаете, интерполятор будет использовать текущий размер как отправную точку
вы можете попробовать с помощью таких библиотек:
С 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)