У меня есть пользовательский EditText
, который переопределяет onDraw
метод. Он показывает aws чисел и подчеркивает правильно, но android не может определить положение чисел, когда между ними несколько пробелов . В результате, после выбора ручки позиционируются в неправильном положении.
Вот мой метод 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
)
}