自定义view之打字机特效

不多说,直接上代码,效果就是我们常见的  准备一段话  啪啪啪 一个字一个字像打字机一样显示出来

```

/**

  * @Description: TODO 打字机效果

  * @author hechuang

  * @param

  * @return    返回类型

  * @create 2019/2/25

  * @throws

  */

public class PrinterTextView extends AppCompatTextView {

    /**

    * TAG

    */

    private static final String TAG = "PrinterTextView";

    /**

    * 默认打字字符

    */

    private final String DEFAULT_INTERVAL_CHAR = "_";

    /**

    * 默认打字间隔时间

    */

    private final int DEFAULT_TIME_DELAY = 50;

    /**

    * 计时器

    */

    private Timer mTimer;

    /**

    * 需要打字的文字

    */

    private String mPrintStr;

    /**

    * 间隔时间

    */

    private int intervalTime = DEFAULT_TIME_DELAY;

    /**

    * 间隔时间

    */

    private String intervalChar = DEFAULT_INTERVAL_CHAR;

    /**

    * 打字进度

    */

    private int printProgress = 0;

    /**

    * 打字进度监听

    */

    private PrinterTextviewListener mPrinterTextviewListener;

    public PrinterTextView(Context context) {

        super(context);

    }

    public PrinterTextView(Context context, AttributeSet attrs) {

        super(context, attrs);

    }

    public PrinterTextView(Context context, AttributeSet attrs, int defStyleAttr) {

        super(context, attrs, defStyleAttr);

    }

    /**

    * 设置要打字的文字

    *

    * @param str

    */

    public void setPrintText(String str) {

        setPrintText(str, DEFAULT_TIME_DELAY);

    }

    /**

    * 设置需要打字的文字及打字间隔

    *

    * @param str  打字文字

    * @param time 打字间隔(ms)

    */

    public void setPrintText(String str, int time) {

        setPrintText(str, time, DEFAULT_INTERVAL_CHAR);

    }

    /**

    * 设置需要打字的文字,打字间隔,间隔符号

    *

    * @param str          打字文字

    * @param time        打字间隔(ms)

    * @param intervalChar 间隔符号("_")

    */

    public void setPrintText(String str, int time, String intervalChar) {

        setPrintText(str,time,intervalChar,null);

    }

    /**

    * 设置需要打字的文字,打字间隔,间隔符号

    *

    * @param str          打字文字

    * @param time        打字间隔(ms)

    * @param intervalChar 间隔符号("_")

    * @param printerTextviewListener 开始结束监听

    */

    public void setPrintText(String str, int time, String intervalChar, PrinterTextviewListener printerTextviewListener) {

        if (strIsEmpty(str) || 0 == time || strIsEmpty(intervalChar)) {

            return;

        }

        this.mPrintStr = str;

        this.intervalTime = time;

        this.intervalChar = intervalChar;

        this.mPrinterTextviewListener = printerTextviewListener;

    }

    /**

    * 开始打字

    */

    public void startPrint() {

        // 判空处理

        if (strIsEmpty(mPrintStr)) {

            if (!strIsEmpty(getText().toString())) {

                this.mPrintStr = getText().toString();

            } else {

                return;

            }

        }

        // 重置相关信息

        setText("");

        stopPrint();

        printProgress = 0;

        mTimer = new Timer();

        mTimer.schedule(new PrinterTimeTask(), intervalTime, intervalTime);

        mPrinterTextviewListener.printerOver(true);

    }

    /**

    * 停止打字

    */

    public void stopPrint() {

        if (null != mTimer) {

            mTimer.cancel();

            mTimer = null;

            mPrinterTextviewListener.printerOver(false);

        }

    }

    /**

    * 判断str是否为空

    *

    * @param str

    * @return

    */

    private boolean strIsEmpty(String str) {

        if (null != str && !"".equals(str)) {

            return false;

        } else {

            return true;

        }

    }

    /**

    * 打字计时器任务

    */

    class PrinterTimeTask extends TimerTask {

        @Override

        public void run() {

            // 需要刷新页面,必须在UI线程,使用post方法

            post(new Runnable() {

                @Override

                public void run() {

                    // 如果未显示完,继续显示

                    if (printProgress < mPrintStr.length()) {

                        printProgress++;

                        // (printProgress & 1) == 1 等价于printProgress%2!=0

                        Log.d("TAG","printProgress:"+printProgress);

                        setText(mPrintStr.substring(0, printProgress) + ((printProgress & 1) == 1 ? intervalChar : ""));

                    } else {

                        // 如果完成打字,显示完整文字

                        setText(mPrintStr);

                        stopPrint();

                    }

                }

            });

        }

    }

}

```

直接拿去用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。