最近项目需要一个逐字展示的文本控件,由于没有找到适合的,便随手写了一个,不废话直接上代码。
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
import androidx.annotation.Nullable;
/**
* 逐字显示的文本控件
* @author pinkman
* @version 1.1 2022/5/31
*/
@SuppressLint("AppCompatCustomView")
public class GraduallyTextView extends TextView {
private float drawLength = 0; //已显示的长度
public GraduallyTextView(Context context) {
this(context, null);
}
public GraduallyTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public GraduallyTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 在某个时间段显示出所有文本
* @param text 要显示的文本
* @param duration 显示的时间区间
*/
public void showGradually(String text, long duration) {
ValueAnimator valueAnimator = ObjectAnimator.ofFloat(text.length());
valueAnimator.setDuration(duration).start();
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
drawLength = (float) valueAnimator.getAnimatedValue();
setText(text.substring(0, (int) drawLength));
}
});
}
}
原理是以字符串的长度为目标设置一段属性动画,在动画的监听中不断为文本控件赋值,使用方法如下。
//首先需要在布局中放置该控件
final GraduallyTextView gradulyTextView;
gradulyTextView = findViewById(R.id.gtv_T);
gradulyTextView.showGradually("这是一段需要在两秒内显示的文本",2000);