Fix: separate top title and bottom content in merge image - bottom content now dynamically positioned

This commit is contained in:
2026-03-06 22:55:26 +08:00
parent a4d2e67fd6
commit 9f1c6052e5
67 changed files with 33 additions and 29 deletions

View File

@@ -1,4 +1,4 @@
#Fri Mar 06 22:42:09 CST 2026 #Fri Mar 06 22:54:40 CST 2026
path.4=14/classes.dex path.4=14/classes.dex
path.3=12/classes.dex path.3=12/classes.dex
path.2=10/classes.dex path.2=10/classes.dex

View File

@@ -1 +1 @@
פ8מ)ת*ר'&ט%<EFBFBD>!ר פ8מ)ת*ר'&ט%<EFBFBD>!רש#

View File

@@ -1 +1 @@
ëXè¾ú¹Ñ~Ì>Åô­ï`ý¿ÄJùÉïNÔî×úbå4å²×?Í#àÀ2 ëXè¾ú¹Ñ~Ì>Åô­ï`ý¿ÄJùÉïNÔî×úbå4å²×?Í#àÀ2èjÓ*ú3

View File

@@ -401,7 +401,9 @@ fun MergeScreen(
content, content,
titleStyle, titleStyle,
contentStyle, contentStyle,
recorderName recorderName,
title,
content
) )
} }
showPreview = true showPreview = true
@@ -469,7 +471,9 @@ fun MergeScreen(
content, content,
titleStyle, titleStyle,
contentStyle, contentStyle,
recorderName recorderName,
title,
content
) )
} }

View File

@@ -190,9 +190,11 @@ object ImageProcessor {
content: String = "", content: String = "",
titleStyle: WatermarkStyle = WatermarkStyle.Default, titleStyle: WatermarkStyle = WatermarkStyle.Default,
contentStyle: WatermarkStyle = WatermarkStyle.Default, contentStyle: WatermarkStyle = WatermarkStyle.Default,
recorderName: String = "" recorderName: String = "",
bottomTitle: String = "",
bottomContent: String = ""
): Bitmap { ): Bitmap {
if (images.isEmpty() && title.isBlank() && content.isBlank() && recorderName.isBlank()) { if (images.isEmpty() && title.isBlank() && content.isBlank() && recorderName.isBlank() && bottomTitle.isBlank() && bottomContent.isBlank()) {
return Bitmap.createBitmap(1920, 1080, Bitmap.Config.ARGB_8888) return Bitmap.createBitmap(1920, 1080, Bitmap.Config.ARGB_8888)
} }
@@ -205,29 +207,29 @@ object ImageProcessor {
val cellHeight = cellWidth // 保持正方形格子 val cellHeight = cellWidth // 保持正方形格子
// 底部文字区域高度 - 动态计算 // 底部文字区域高度 - 动态计算
val textAreaHeight = if (title.isNotBlank() || content.isNotBlank()) { val textAreaHeight = if (bottomTitle.isNotBlank() || bottomContent.isNotBlank()) {
val padding = 30f val padding = 30f
val titleHeight = if (title.isNotBlank()) { val bTitleHeight = if (bottomTitle.isNotBlank()) {
val titlePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { val titlePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
textSize = outputWidth / 25f textSize = outputWidth / 25f
} }
titlePaint.fontMetrics.let { it.descent - it.ascent } titlePaint.fontMetrics.let { it.descent - it.ascent }
} else 0f } else 0f
val contentHeight = if (content.isNotBlank()) { val bContentHeight = if (bottomContent.isNotBlank()) {
val contentPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { val contentPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
textSize = outputWidth / 35f textSize = outputWidth / 35f
} }
val contentMaxWidth = outputWidth - padding * 2 val contentMaxWidth = outputWidth - padding * 2
val contentLines = wrapText(content, contentPaint, contentMaxWidth).take(5) val contentLines = wrapText(bottomContent, contentPaint, contentMaxWidth).take(5)
val lineHeight = contentPaint.fontMetrics.let { it.descent - it.ascent } val lineHeight = contentPaint.fontMetrics.let { it.descent - it.ascent }
val titleSpacing = if (title.isNotBlank()) titleHeight + lineHeight + 20 else lineHeight val titleSpacing = if (bottomTitle.isNotBlank()) bTitleHeight + lineHeight + 20 else lineHeight
titleSpacing + contentLines.size * lineHeight + padding titleSpacing + contentLines.size * lineHeight + padding
} else { } else {
padding + titleHeight + padding padding + bTitleHeight + padding
} }
maxOf(150f, contentHeight) maxOf(150f, bContentHeight)
} else { } else {
0f 0f
} }
@@ -319,39 +321,39 @@ object ImageProcessor {
) )
val padding = 30f val padding = 30f
val titleHeight: Float val bTitleHeight: Float
// 绘制标题 - 粗体白色居中 // 绘制标题 - 粗体白色居中
if (title.isNotBlank()) { if (bottomTitle.isNotBlank()) {
val titlePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { val titlePaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
textSize = outputWidth / 25f textSize = outputWidth / 25f
color = android.graphics.Color.WHITE color = android.graphics.Color.WHITE
typeface = Typeface.create("sans-serif", Typeface.BOLD) // 粗体无衬线 typeface = Typeface.create("sans-serif", Typeface.BOLD)
textAlign = android.graphics.Paint.Align.CENTER textAlign = android.graphics.Paint.Align.CENTER
} }
titleHeight = titlePaint.fontMetrics.let { it.descent - it.ascent } bTitleHeight = titlePaint.fontMetrics.let { it.descent - it.ascent }
canvas.drawText(title, outputWidth / 2f, textTop + padding + titleHeight, titlePaint) canvas.drawText(bottomTitle, outputWidth / 2f, textTop + padding + bTitleHeight, titlePaint)
} else { } else {
titleHeight = 0f bTitleHeight = 0f
} }
// 绘制内容 - 细体白色靠左 // 绘制内容 - 细体白色靠左
if (content.isNotBlank()) { if (bottomContent.isNotBlank()) {
val contentPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply { val contentPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
textSize = outputWidth / 35f textSize = outputWidth / 35f
color = android.graphics.Color.WHITE color = android.graphics.Color.WHITE
typeface = Typeface.create("sans-serif", Typeface.NORMAL) // 细体 typeface = Typeface.create("sans-serif", Typeface.NORMAL)
textAlign = android.graphics.Paint.Align.LEFT textAlign = android.graphics.Paint.Align.LEFT
} }
val contentMaxWidth = outputWidth - padding * 2 val contentMaxWidth = outputWidth - padding * 2
val contentLines = wrapText(content, contentPaint, contentMaxWidth) val contentLines = wrapText(bottomContent, contentPaint, contentMaxWidth)
val lineHeight = contentPaint.fontMetrics.let { it.descent - it.ascent } val lineHeight = contentPaint.fontMetrics.let { it.descent - it.ascent }
// 内容起始Y坐标 - 标题下方再往下移一行 // 内容起始Y坐标 - 标题下方再往下移一行
val contentStartY = if (title.isNotBlank()) { val contentStartY = if (bottomTitle.isNotBlank()) {
textTop + padding + titleHeight + lineHeight + 20 textTop + padding + bTitleHeight + lineHeight + 20
} else { } else {
textTop + padding + lineHeight * 2 textTop + padding + lineHeight * 2
} }
@@ -361,6 +363,7 @@ object ImageProcessor {
contentLines.forEach { line -> contentLines.forEach { line ->
canvas.drawText(line, padding, y, contentPaint) canvas.drawText(line, padding, y, contentPaint)
y += lineHeight y += lineHeight
}
} }
} }
@@ -379,9 +382,6 @@ object ImageProcessor {
return result return result
} }
return result
}
/** /**
* 缩放并居中裁剪Bitmap * 缩放并居中裁剪Bitmap
*/ */