Анимация курсора в Custom EditText

Пытаюсь разобраться с custom view. Делаю PinEntryEditText (библиотеки не хочу использовать). У меня получилось разобраться со всем, кроме того, КАК анимировать курсор (что для этого нужно использовать, нужна наводка), чтобы он мигал, как в обычном edittext. Вот, что получилось на данный момент (курсор не мигает, просто отображается исходя от позиции). PinEntryEditText

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

}


Ответы (0 шт):