类似Npc说话的TextView

类似Npc说话的TextView

class NpcTextView @JvmOverloads constructor(
        context: Context,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr), DefaultLifecycleObserver {

    private var mPrintString: String? = null
    private var mPrintAnimator: ValueAnimator? = null
    var mPerTextSpeed = 50L

    /**
     * 帮生命周期监听
     *
     */
    fun addLifecycleObserver(owner: LifecycleOwner) {
        owner.lifecycle.addObserver(this)
    }

   /**
     * 开始显示文字
     *
     */
    fun printText(str: String?) {
        if (str.isNullOrEmpty()) {
            return
        }
        if (mPrintAnimator?.isRunning == true) {
            clear()
        }
        mPrintString = str

        // 字符串的长度
        val length = str.length

        val charArray = CharArray(length)

        //将字符串转换成字符数组

        for (i in 0 until length) {
            charArray[i] = str[i]
        }

        mPrintAnimator = ValueAnimator.ofFloat(0f, 1f).apply {
            val printDuration = length * mPerTextSpeed
            duration = printDuration
            addUpdateListener { animation ->
                // 字体显示的速度 v = 总的字体长度 / 总的显示时间
                val v = length.toFloat() / printDuration.toFloat()
                // 动画执行速度
                val fraction = animation.animatedValue as Float
                //动画不同阶段字体应该显示的个数
                val s = (v * fraction * printDuration).toInt()

                setText(charArray, 0, s)
            }
        }
        mPrintAnimator?.start()
    }

    fun getPrintText() = mPrintString ?: ""

    override fun onPause(owner: LifecycleOwner) {
        super.onPause(owner)
        clear()

        text = mPrintString
    }

    fun clear() {
        mPrintAnimator?.removeAllListeners()
        mPrintAnimator?.removeAllUpdateListeners()
        mPrintAnimator?.cancel()

        text = ""
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值