TextView实现打印机效果

xiaoxiao2021-02-28  23

首先申明,这篇文章不是我写的,我是对着大神的博客,对着写了一遍而已! 感谢写这篇文章的作者,其原创博客地址为: http://www.jianshu.com/p/4d987769785c

其示意图如下:

其自定义TextView的代码如下:

/** * Created by pxw on 2017/6/12. * 打印机效果TextView */ public class FadeInTextView extends TextView { //绘制显示的文字 private StringBuffer mStringBuffer = new StringBuffer(); //矩形 private Rect textRect = new Rect(); //定义文字的个数 private int textCount; //属性动画-值动画 private ValueAnimator textAnimation; //每个字出现的时间 private int duration = 300; //当前显示的字的索引 private int currentIndex = -1; //字的数组 private String[] arr; //接口对象 private TextAnimationListener textAnimationListener; public FadeInTextView(Context context) { super(context); } public FadeInTextView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } public FadeInTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public FadeInTextView setTextAnimationListener(TextAnimationListener textAnimationListener){ this.textAnimationListener = textAnimationListener; return this; } //绘制显示的文字 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if(mStringBuffer != null) { drawText(canvas,mStringBuffer.toString()); } } private void drawText(Canvas canvas, String str) { //设置文字绘制的区域 textRect.left = getPaddingLeft(); textRect.top = getPaddingTop(); textRect.right = getWidth()-getPaddingRight(); textRect.bottom = getHeight()-getPaddingBottom(); //获取画笔 TextPaint paint = getPaint(); //描述画笔对象的属性特征,计算位置的坐标 Paint.FontMetrics fontMetrics = paint.getFontMetrics(); //TODO 不是特别明白为啥要除以2 int baseLine = (int) ((textRect.bottom+textRect.top-fontMetrics.bottom-fontMetrics.top)/2); //文字绘制到整个布局的中心位置 canvas.drawText(str,getPaddingLeft(),baseLine,paint); } //利用属性动画冬天改变绘制的文字,文字逐个显示动画,通过插值的方式改变数据源 private void initAnimation(){ //从0到textCount -1,是设置从第一个字到最后一个字的变化因子,获取单个字符 textAnimation = ValueAnimator.ofInt(0,textCount-1); //执行的总时间就是每个字的时间乘以字数 textAnimation.setDuration(textCount*duration); //通过插值器来控制来匀速显示文字 textAnimation.setInterpolator(new LinearInterpolator()); //监听动画更新过程 textAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int index = (int) animation.getAnimatedValue(); Log.e("index",index+""); //过滤去重,保证每个字只重绘一次 if(currentIndex != index) { mStringBuffer.append(arr[index]); currentIndex = index; Log.e("index",index+"index"); //所有文字都显成之后进度回调结束动画 if(currentIndex == textCount -1) { if(textAnimationListener != null) { textAnimationListener.annimationFinish(); } } //不断通知重新绘制 invalidate(); } } }); } //设置逐渐显示的字符串,对外提供的方法 public FadeInTextView setTextString(String textString){ if(textString != null) { //总字数 textCount = textString.length(); //存放单个字的数组 arr = new String[textCount]; for (int i = 0; i < textCount; i++) { //通过循环,截取 arr[i] = textString.substring(i,i+1); } //初始化 initAnimation(); } return this; } //开启动画 public FadeInTextView startFadeInAnimation(){ if(textAnimation != null) { //动画开启的时候参数都设置成初始状态,设置长度为及索引 mStringBuffer.setLength(0); currentIndex = -1; textAnimation.start(); } return this; } //停止动画 public FadeInTextView stopFadeInAnimation(){ if(textAnimation != null) { textAnimation.end(); } return this; } //回调接口 interface TextAnimationListener{ void annimationFinish(); } }

调用方法为:

fadeInTextView.setTextString("自定义view实现字符串逐字显示") .startFadeInAnimation() .setTextAnimationListener(new FadeInTextView.TextAnimationListener() { @Override public void annimationFinish() { } });

以上,即可, 再次感谢原创博客作者

转载请注明原文地址: https://www.6miu.com/read-200090.html

最新回复(0)