Android 文本视图的动画';s文本大小,而不是整个文本视图

Android 文本视图的动画';s文本大小,而不是整个文本视图,android,android-layout,textview,Android,Android Layout,Textview,有没有办法只设置TextView文本大小的动画,而不缩放整个TextView的布局 我正在尝试实现类似的效果,请注意,文本大小变小时会重新调整为一行。这可以通过ValueAnimator实现,从我的头顶上看,我认为它应该是这样的: final TextView tv = new TextView(getApplicationContext()); final float startSize = 42; // Size in pixels final float endSize = 12; l

有没有办法只设置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();
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)

作为@korrekorre答案的后续说明:文档建议使用更简单的

这里只有一个警告:传递给构造函数的属性(
“textSize”
,在本例中)必须有一个公共setter方法才能工作


您还可以将
startSize
传递给构造函数,如果不传递,则插值器将使用当前大小作为起始点

,使用Kotlin创建如下扩展函数:

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();
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)
像这样使用它:

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

使用ObjectAnimator/ValueAnimator@pskink更多详细信息会很有用。您是否尝试过设置TextView的固定最小高度
textView.setMinHeight()
@Kerry抱歉,这对动画有什么帮助?我误解了你的问题,我以为你不希望文本框的大小随着字体大小的改变而改变。更有效的解决方案!另一件需要注意的事情:
TextView.getTextSize()
返回
dp
中的大小,因此将其保留为默认值可能会产生不必要的效果。因此,可能需要通过
tv.textSize/resources.displayMetrics.density将
startSize
手动设置为“sp”。