Анимация курсора в Custom EditText
Пытаюсь разобраться с custom view. Делаю PinEntryEditText (библиотеки не хочу использовать). У меня получилось разобраться со всем, кроме того, КАК анимировать курсор (что для этого нужно использовать, нужна наводка), чтобы он мигал, как в обычном edittext. Вот, что получилось на данный момент (курсор не мигает, просто отображается исходя от позиции). 
class PinEntryEditText : EditText {
private var mSpace = 8f
private var mCharSize = 0f
private var mNumChars = 6f
private var mLineSpacing = 8f //8dp by default
private val xmlns = "http://schemas.android.com/apk/res/android"
private var mClickListener : OnClickListener? = null
private var mLineStroke = 1f
private lateinit var mLinesPaint : Paint
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { init(context, attrs)}
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { init(context, attrs) }
private fun init(context: Context, attrs: AttributeSet){
setBackgroundResource(0)
val multi = context.resources.displayMetrics.density
mSpace *= multi
mLineSpacing *= multi
val mMaxLength = attrs.getAttributeIntValue(xmlns, "maxLength", 6)
mNumChars = mMaxLength.toFloat()
mLineStroke *= multi
mLinesPaint = Paint(paint)
mLinesPaint.strokeWidth = mLineStroke
mLinesPaint.color = ContextCompat.getColor(context, R.color.colorBlack)
super.setCustomSelectionActionModeCallback(object : ActionMode.Callback {
override fun onActionItemClicked(mode: ActionMode?, item: MenuItem?): Boolean {
return false
}
override fun onCreateActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return false
}
override fun onPrepareActionMode(mode: ActionMode?, menu: Menu?): Boolean {
return false
}
override fun onDestroyActionMode(mode: ActionMode?) {
}
})
super.setOnClickListener {
setSelection(text.length)
if (mClickListener != null){
mClickListener!!.onClick(it)
}
}
}
override fun setOnClickListener(l: OnClickListener?) {
mClickListener = l
}
override fun setCustomSelectionActionModeCallback(actionModeCallback: ActionMode.Callback?) {
throw RuntimeException("setCustomSelectionActionModeCallback() not supported.")
}
override fun onDraw(canvas: Canvas?) {
setCharSize()
drawTextAndLine(canvas)
}
private fun drawTextAndLine(canvas: Canvas?) {
var startX = paddingLeft.toFloat()
val bottom = height - paddingBottom.toFloat()
val text : Editable = text
val textLength = text.length
val textWidth = FloatArray(textLength)
paint.getTextWidths(text, 0, textLength, textWidth)
for (i in 0..mNumChars.toInt()) {
canvas?.drawLine(startX, bottom, startX + mCharSize, bottom, mLinesPaint)
val middle = startX + mCharSize / 2
if (text.length > i) {
canvas?.drawText(text, i, i + 1, middle - textWidth[0] / 2, bottom - mLineSpacing, paint)
} else if(text.length == i) {
canvas?.drawLine(middle, bottom - mLineSpacing, middle, bottom - mCharSize, mLinesPaint)
}
startX += if (mSpace < 0) {
mCharSize * 2
} else {
mCharSize + mSpace
}
}
}
private fun setCharSize() {
mCharSize = if (mSpace < 0) {
(getAvailableWidth() / (mNumChars * 2 - 1))
} else {
(getAvailableWidth() - (mSpace * (mNumChars - 1))) / mNumChars
}
}
private fun getAvailableWidth() : Int = width - paddingRight - paddingLeft
}