StaticLayout рисует за его пределами
Я создаю StaticLayout
и нарисовать его на холсте. у меня есть Rect
область, в которой мне нужно разместить текст, поэтому я следующее:
- Я рассчитываю размер текста, чтобы соответствовать в пределах указанных границ
- Я создаю
StaticLayout
с рассчитанным размером текста - Я рисую
StaticLayout
на холст
проблема
Хотя StaticLayout.width
а также StaticLayout.height
вписывается в мой прямоугольник, текст перекрывает прямоугольник. Как это может быть?
Снимок экрана показывает, что текст выходит за пределы прямоугольников, ограниченных слева и справа (вы можете увидеть это очень хорошо на A)
Линия журнала
//Information: the uncleaned text is "A\nP\nP\nS" => as I want vertical text in this case
TextSize: 55.75 | Apps | rect: 24x481 | layout rect: 18x471 | offsets: 3.0, 5.0
// as you see, the staticlayout's rect is SMALLER then the rect it should fit in
// so it should no overlay anywhere...
СКРИНШОТ
Здесь вы видите, как выглядит представление (это скриншот, принадлежащий приведенной выше строке журнала):
КОД
private lateinit var paint: Paint
private lateinit var textPaint: TextPaint
override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
val rect: Rect = ... // the target rectangle for my text
// 1) Draw the rectangle (the background of the text)
canvas.drawRect(
rect,
paint
)
// 2) prepare text
val text: String = ... // some text that should be drawn WITHIN the rectangle
val textColor: Int = ... // some text color
val textSize: Float = ... // value is calculated in a helper class of mine
val textPadding = 0f
val staticLayout = getStaticLayout(text, textPaint, rect.width() - 2 * textPadding)
val offsetX = (rect.width() - staticLayout.width) / 2f
val offsetY = (rect.height() - staticLayout.height) / 2f
textPaint.color = textColor
textPaint.textSize = textSize
// 3) draw text
canvas.save()
canvas.translate(rect.left.toFloat() + offsetX, rect.top.toFloat() + offsetY)
staticLayout.draw(canvas)
canvas.restore()
// Test logging to verify the problem
L.d { "TextSize: ${textSize}" +
" | ${text.text.filter { it != '\n' }}" + // strip out new lines for a cleaner log
" | rect: ${rect.width()}x${rect.height()}" +
" | layout rect: ${staticLayout.width}x${staticLayout.height}" +
" | offsets: $offsetX, $offsetY" }
}
}
// helper function
fun getStaticLayout(text: CharSequence, paint: TextPaint, width: Int): StaticLayout {
val spacingMult = 1f
val spacingAdd = 0f
val includePadding = true
val alignment = Layout.Alignment.ALIGN_CENTER
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return StaticLayout.Builder.obtain(text, 0, text.length, paint, width)
.setAlignment(alignment)
.setLineSpacing(spacingAdd, spacingMult)
.setIncludePad(includePadding)
.build()
} else {
@Suppress("DEPRECATION")
return StaticLayout(
text,
0,
text.length,
paint,
width,
alignment,
spacingMult,
spacingAdd,
includePadding
)
}
}