Пользовательский текст редактирования неправильный выбор обрабатывает положение - PullRequest
0 голосов
/ 16 февраля 2020

У меня есть пользовательский EditText, который переопределяет onDraw метод. Он показывает aws чисел и подчеркивает правильно, но android не может определить положение чисел, когда между ними несколько пробелов . В результате, после выбора ручки позиционируются в неправильном положении.

wrong selection

Вот мой метод onDraw: (вы можете увидеть мой класс здесь или загрузите репо целиком с CardEntryRepo )

 override fun onDraw(canvas: Canvas) {
    //super.onDraw(canvas)

    setWillNotDraw(false)
    if (paint.color != textColors.defaultColor)
        paint.color = textColors.defaultColor
    var startX = paddingLeft
    val top = height - paddingBottom

    val charSequence = text as CharSequence
    val textLength = charSequence.length
    paint.getTextWidths(charSequence, 0, textLength, textWidths)

    //draw lines
    var i = 0
    if (hasLine) {
        while (i < partCount) {
            linePaint.color = when {
                i < textLength / mPartLength -> filledLineColor
                else -> lineColor
            }
            canvas.drawRect(
                    startX.toFloat(),
                    top.toFloat() + 0,
                    startX + mPartSize,
                    (top + toPxF(2)),
                    linePaint
            )

            startX += (mPartSize + mSpace).toInt()
            i++
        }
    }

    //draw characters
    startX = paddingLeft
    i = 0
    if (!hasAnimation) {
        while (i < textLength) {
            val middle = startX + mCharSize / 2
            drawNumber(canvas, charSequence, i, middle, top, false)

            startX += if (i % mPartLength == mPartLength - 1)
                (mCharSize + mSpace).toInt()
            else (mCharSize).toInt()
            i++
        }
    } else {//last character must be animate

        for (k in 0 until textLength) {
            val middle = startX + mCharSize / 2
            if ((k < textLength - 1)) {
                drawNumber(canvas, charSequence, k, middle, top, false)
                startX += if (k % mPartLength == mPartLength - 1)
                    (mCharSize + mSpace).toInt()
                else (mCharSize).toInt()
            } else {
                drawNumber(canvas, charSequence, k, middle, top, true)
            }

        }

    }
}

private fun drawNumber(canvas: Canvas, text: CharSequence, i: Int, middle: Float, top: Int, animated: Boolean) {
    val isSelected = i in selectionStart until selectionEnd
    if (animated) {
        paint.alpha = animatedAlpha
    } else {
        paint.alpha = 255
    }
    //TODO: draw selected background
    paint.color = if (isSelected)
        selectionColor
    else
        textColors.defaultColor
    canvas.drawText(
            text,
            i,
            i + 1,
            middle - textWidths[i] / 2,
            top - if (animated) mLineSpacingAnimated else mLineSpacing,
            paint
    )
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec)

    setMeasuredDimension(
            (maxLength * mCharSize).toInt() + ((partCount - 1) * mSpace).toInt() + paddingLeft + paddingRight,
            measuredHeight
    )

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...