Есть ли способ указать TypedValue в ObjectAnimator для textSize? - PullRequest
1 голос
/ 14 мая 2019

У меня есть TextView , и я хочу анимировать его textSize . Это код для анимации textSize с использованием ObjectAnimator .

    val newSize = resources.getDimension(R.dimen.selected_text_size)
    val animator = ObjectAnimator.ofFloat(tv_text, "textSize", newSize)
    animator.duration = 200
    animator.start()

Проблема в том, что resources.getDimension(R.dimen.selected_text_size) возвращает значение размера текста в пикселях, и кажется, что ObjectAnimator по умолчанию использует значение sp, это делает окончательный анимированный размер намного больше, чем ожидалось,

Если я изменюсь

val newSize = resources.getDimension(R.dimen.selected_text_size)

до

val newSize = resources.getDimension(R.dimen.selected_text_size) / (resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)

Затем он даст правильный конечный анимированный размер, потому что второй получит значение sp вместо значения в пикселях.

Если я изменю textSize без анимации, я могу указать TypedValue следующим образом:

tv_text.setTextSize(TypedValue.COMPLEX_UNIT_PX, resources.getDimension(R.dimen.selected_text_size))

Итак, есть ли способ указать TypedValue при анимации textSize с использованием ObjectAnimator ?

1 Ответ

1 голос
/ 15 мая 2019

Насколько я знаю, вы не можете сделать это напрямую. Но вы можете унаследовать TextView и добавить метод "setTextSizePixel"

fun setTextSizePixel(size: Float) {
    setTextSize(TypedValue.COMPLEX_UNIT_PX, size)
}

, а затем заменить TextView на анимацию размера текста в пикселях с MyTextView ииспользуйте ObjectAnimator для анимации свойства textSizePixel MyTextView:

ObjectAnimator.ofFloat(myTextView, "textSizePixel", oldSizePx, newSizePx)
       .apply {
            duration = 3000
            start()
       }

Или используйте родительский класс ObjectAnimator ValueAnimator для достижения этого, добавив код в одном месте:

ValueAnimator.ofFloat(oldSizePx, newSizePx).apply {
     addUpdateListener { updatedAnimation ->
         tv_text.setTextSize(TypedValue.COMPLEX_UNIT_PX, updatedAnimation.animatedValue as Float)
     }
     duration = 3000
     start()
}
...