有没有一种方法可以在ObjectAnimator中为textSize指定TypedValue?

时间:2019-05-14 20:26:00

标签: android textview objectanimator

我有一个 TextView ,我想为其动画 textSize 。这是使用ObjectAnimator 动画textSize的代码

    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值,这使最终的动画大小比预期的大得多< / strong>。

如果我更改

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

因此,当使用 ObjectAnimator textSize 设置动画时,是否可以指定 TypedValue

1 个答案:

答案 0 :(得分:1)

据我所知,您不能直接做到这一点。但是您可以继承TextView并添加方法“ setTextSizePixel”

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

然后用MyTextView替换TextView需要px文本大小的动画 并使用ObjectAnimator为MyTextView的textSizePixel属性设置动画:

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()
}