我有一个 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 ?
答案 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()
}