StaticLayout рисует за его пределами

Я создаю StaticLayout и нарисовать его на холсте. у меня есть Rect область, в которой мне нужно разместить текст, поэтому я следующее:

  1. Я рассчитываю размер текста, чтобы соответствовать в пределах указанных границ
  2. Я создаю StaticLayout с рассчитанным размером текста
  3. Я рисую 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
        )
    }
}

0 ответов

Другие вопросы по тегам