Kotlin 绘制图片文字并自动换行

/**
 * 绘制文本,并允许指定文本长度和行高,并自动换行
 * @param text 要绘制的文本
 * @param x0 绘制文本的起始X坐标
 * @param y0 绘制文本的起始Y坐标
 * @param maxWidth 绘制文本的最大宽度
 * @param lineHeight 绘制文本的行高
 * @param font 要绘制文本的字体
 * @param style 要绘制文本的字体样式
 */
fun Graphics2D.drawString(
    text: String,
    x0: Int,
    y0: Int,
    maxWidth: Int = Int.MAX_VALUE,
    lineHeight: Int = fontMetrics.height,
    font: Font = this.font,
    style: Float = -1f,
): Int {
    return drawString(text, x0.toFloat(), y0.toFloat(), maxWidth.toFloat(), lineHeight.toFloat(), font, style)
}

/**
 * 绘制文本,并允许指定文本长度和行高,并自动换行
 * @param text 要绘制的文本
 * @param x0 绘制文本的起始X坐标
 * @param y0 绘制文本的起始Y坐标
 * @param maxWidth 绘制文本的最大宽度
 * @param lineHeight 绘制文本的行高
 * @param font 要绘制文本的字体
 * @param style 要绘制文本的字体样式
 */
fun Graphics2D.drawString(
    text: String,
    x0: Float,
    y0: Float,
    maxWidth: Float = Float.MAX_VALUE,
    lineHeight: Float = fontMetrics.height.toFloat(),
    font: Font = this.font,
    style: Float = -1f,
): Int {
    this.font = font
    if (style > -1f) {
        this.font = font.deriveFont(style)
    }
    val x = x0
    var y = y0
    val fontMetrics = fontMetrics
    var lineStart = 0
    var lineEnd = 0

    while (lineEnd < text.length) {
        // 如果加上下一个字符会导致超出最大宽度,则结束当前行
        val fontWidth = fontMetrics.charsWidth(text.toCharArray(), lineEnd, 1).let {
            it + fontMetrics.stringWidth(text.substring(lineStart, lineEnd))
        }
        if (fontWidth > maxWidth || text[lineEnd] == '\n') {
            // 绘制当前行
            drawString(text.substring(lineStart, lineEnd), x, y)
            // 移动到下一行
            y += lineHeight
            lineStart = lineEnd
        }
        lineEnd++
    }

    // 绘制最后一行
    if (lineStart < text.length) {
        drawString(text.substring(lineStart), x, y)
    }

    return lineEnd
}

/**
 * 计算文本自动换行后的高度
 */
fun Graphics2D.calculateAutoWrapHeight(
    text: String,
    x0: Float,
    y0: Float,
    maxWidth: Float = Float.MAX_VALUE,
    lineHeight: Float = fontMetrics.height.toFloat(),
    font: Font = this.font,
    style: Float = -1f,
): Float {
    this.font = font
    if (style > -1f) {
        this.font = font.deriveFont(style)
    }
    var y = y0
    val fontMetrics = fontMetrics
    var lineStart = 0
    var lineEnd = 0


    while (lineEnd < text.length) {
        // 如果加上下一个字符会导致超出最大宽度,则结束当前行
        val fontWidth = fontMetrics.charsWidth(text.toCharArray(), lineEnd, 1).let {
            it + fontMetrics.stringWidth(text.substring(lineStart, lineEnd))
        }
        if (fontWidth > maxWidth|| text[lineEnd] == '\n') {
            // 移动到下一行
            y += lineHeight
            lineStart = lineEnd
        }
        lineEnd++
    }

    return y - y0
}

你可能感兴趣的:(kotlin,开发语言,android)