feat: opt printer
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package com.lukouguoji.module_base.util
|
||||
|
||||
import android.Manifest
|
||||
import android.graphics.Typeface
|
||||
import com.gainscha.sdk2.ConnectType
|
||||
import com.gainscha.sdk2.ConnectionListener
|
||||
import com.gainscha.sdk2.Printer
|
||||
@@ -334,9 +333,9 @@ object PrinterUtils {
|
||||
merged = CellData("集装器编号:", "ULD NO.:", bean.uld)
|
||||
))
|
||||
|
||||
// 第4行:件数 | 重量
|
||||
// 第4行:件数 | 重量(件数value暂不打印)
|
||||
rows.add(GridRow(
|
||||
left = CellData("件数:", "PIECES:", bean.pieces.ifEmpty { "0" }),
|
||||
left = CellData("件数:", "PIECES:", ""),
|
||||
right = CellData("重量:", "GROSS WEIGHT:", bean.totalWeight.toInt().toString())
|
||||
))
|
||||
|
||||
@@ -360,7 +359,8 @@ object PrinterUtils {
|
||||
addSize(100, 100)
|
||||
addGap(3)
|
||||
addCls()
|
||||
addTextByBitmap(150, 80, 0, 110, "合肥新桥国际机场", Typeface.DEFAULT)
|
||||
// 使用 addText 替代 addTextByBitmap,避免 fimage 依赖问题
|
||||
addText(150, 80, Tspl.FONT_TSS24, 0, 3, 3, "合肥新桥国际机场")
|
||||
// 表格横线
|
||||
for (i in 0 until 5) {
|
||||
addBar(gridStartX, gridStartY + (i * gridItemHeight), gridWidth, 2)
|
||||
@@ -403,7 +403,8 @@ object PrinterUtils {
|
||||
addSize(100, 100)
|
||||
addGap(3)
|
||||
addCls()
|
||||
addTextByBitmap(80, 80, 0, 130, "合肥新桥国际机场", Typeface.DEFAULT)
|
||||
// 使用 addText 替代 addTextByBitmap,避免 fimage 依赖问题
|
||||
addText(80, 80, Tspl.FONT_TSS24, 0, 3, 3, "合肥新桥国际机场")
|
||||
// 表格横线
|
||||
for (i in 0 until 9) {
|
||||
addBar(gridStartX, gridStartY + (i * gridItemHeight), gridWidth, 2)
|
||||
@@ -449,17 +450,18 @@ object PrinterUtils {
|
||||
*/
|
||||
private fun printMergedGrid(rows: ArrayList<GridRow>) {
|
||||
val gridStartX = 30
|
||||
val gridStartY = 250
|
||||
val gridStartY = 200
|
||||
val columnWidth = 570
|
||||
val rowHeight = 240
|
||||
val rowHeight = 180 // 减小行高,适应较小字体
|
||||
val gridWidth = columnWidth * 2
|
||||
val gridHeight = rowHeight * rows.size
|
||||
|
||||
val bytes = Tspl().apply {
|
||||
addSize(100, 100)
|
||||
addGap(3)
|
||||
addCls()
|
||||
addTextByBitmap(80, 80, 0, 130, "合肥新桥国际机场", Typeface.DEFAULT)
|
||||
// 标题居中(8个字 * 72像素/字 = 576像素宽,居中X = 30 + (1140-576)/2 = 312)
|
||||
val titleX = gridStartX + (gridWidth - 576) / 2
|
||||
addText(titleX, 60, Tspl.FONT_TSS24, 0, 3, 3, "合肥新桥国际机场")
|
||||
|
||||
// 绘制表格横线
|
||||
for (i in 0..rows.size) {
|
||||
@@ -479,9 +481,7 @@ object PrinterUtils {
|
||||
}
|
||||
|
||||
// 右边线(总是绘制)
|
||||
if (rowIndex == rows.size - 1) {
|
||||
addBar(gridStartX + gridWidth, yTop, 2, rowHeight)
|
||||
}
|
||||
addBar(gridStartX + gridWidth, yTop, 2, rowHeight)
|
||||
}
|
||||
|
||||
// 填充单元格内容
|
||||
@@ -492,17 +492,18 @@ object PrinterUtils {
|
||||
// 合并单元格
|
||||
renderCell(
|
||||
cell = row.merged,
|
||||
x = gridStartX + 30,
|
||||
x = gridStartX + 20,
|
||||
y = yBase,
|
||||
cellWidth = gridWidth,
|
||||
cellHeight = rowHeight
|
||||
cellHeight = rowHeight,
|
||||
isMerged = true
|
||||
)
|
||||
} else {
|
||||
// 左列单元格
|
||||
row.left?.let { cell ->
|
||||
renderCell(
|
||||
cell = cell,
|
||||
x = gridStartX + 30,
|
||||
x = gridStartX + 20,
|
||||
y = yBase,
|
||||
cellWidth = columnWidth,
|
||||
cellHeight = rowHeight
|
||||
@@ -512,7 +513,7 @@ object PrinterUtils {
|
||||
row.right?.let { cell ->
|
||||
renderCell(
|
||||
cell = cell,
|
||||
x = gridStartX + columnWidth + 30,
|
||||
x = gridStartX + columnWidth + 20,
|
||||
y = yBase,
|
||||
cellWidth = columnWidth,
|
||||
cellHeight = rowHeight
|
||||
@@ -532,37 +533,43 @@ object PrinterUtils {
|
||||
* @param cell 单元格数据
|
||||
* @param x 起始X坐标
|
||||
* @param y 起始Y坐标
|
||||
* @param cellWidth 单元格宽度(用于计算右侧对齐)
|
||||
* @param cellHeight 单元格高度(用于计算垂直居中)
|
||||
* @param cellWidth 单元格宽度
|
||||
* @param cellHeight 单元格高度
|
||||
* @param isMerged 是否为合并单元格
|
||||
*/
|
||||
private fun Tspl.renderCell(
|
||||
cell: CellData,
|
||||
x: Int,
|
||||
y: Int,
|
||||
cellWidth: Int,
|
||||
cellHeight: Int
|
||||
cellHeight: Int,
|
||||
isMerged: Boolean = false
|
||||
) {
|
||||
// 左上角:中文标签和英文标签
|
||||
val titleY = y + 30 // 中文标签Y位置
|
||||
val subtitleY = y + 80 // 英文标签Y位置(中文下方)
|
||||
// 字体大小配置
|
||||
val titleSize = 2 // 中文标签字体倍数
|
||||
val subtitleSize = 1 // 英文标签字体倍数
|
||||
val valueSize = 2 // 值字体倍数
|
||||
|
||||
// 中文标签(大字,左上)
|
||||
addText(x, titleY, Tspl.FONT_TSS24, 0, 3, 3, cell.title)
|
||||
// Y坐标配置(基于24点阵字体,size=2约48像素高,size=1约24像素高)
|
||||
val titleY = y + 15 // 中文标签Y位置
|
||||
val subtitleY = titleY + 70 // 英文标签Y位置(中文下方,间距加大)
|
||||
val valueY = y + (cellHeight / 2) - 24 // 值垂直居中
|
||||
|
||||
// 英文标签(小字,左上)
|
||||
addText(x, subtitleY, Tspl.FONT_TSS24, 0, 2, 2, cell.subtitle)
|
||||
// 中文标签
|
||||
addText(x, titleY, Tspl.FONT_TSS24, 0, titleSize, titleSize, cell.title)
|
||||
|
||||
// 右侧:值(大字,垂直居中)
|
||||
// 计算垂直居中的Y坐标:y + (cellHeight / 2) - (文字高度 / 2)
|
||||
// 假设size=3的文字高度约为80像素
|
||||
val valueY = y + (cellHeight / 2) - 40 // 垂直居中
|
||||
// 英文标签
|
||||
addText(x, subtitleY, Tspl.FONT_TSS24, 0, subtitleSize, subtitleSize, cell.subtitle)
|
||||
|
||||
// 计算右侧X坐标:中文标签宽度 + 间距
|
||||
// 假设"目的站:"宽度约为180像素,"DESTINATION:"宽度约为240像素
|
||||
val valueX = x + 280 // 右侧偏移量
|
||||
// 计算value的X坐标(根据英文标签长度动态调整)
|
||||
// 合并单元格(如集装器编号)使用更大的间距
|
||||
val extraGap = if (isMerged) 80 else 50
|
||||
val minOffset = if (isMerged) 280 else 220
|
||||
val labelWidth = cell.subtitle.length * 12 + extraGap
|
||||
val valueX = x + maxOf(labelWidth, minOffset)
|
||||
|
||||
// 值(大字,垂直居中,右侧)
|
||||
addText(valueX, valueY, Tspl.FONT_TSS24, 0, 3, 3, cell.value)
|
||||
// 值(垂直居中)
|
||||
addText(valueX, valueY, Tspl.FONT_TSS24, 0, valueSize, valueSize, cell.value)
|
||||
}
|
||||
|
||||
fun printTest() {
|
||||
|
||||
Reference in New Issue
Block a user