未在 Android PdfDocument canvas 上绘制矩形
Rect not being drawn on Android PdfDocument canvas
由于缺少 how to print iText documents.
的文档,我刚从使用 iText 切换到原生 android PdfDocument
我正在尝试在 Canvas
上绘制 table,方法是遍历列表并为每个项目添加左右列,使用 Rect
[ 表示=20=]
负责绘制table行的函数如下所示:
fun drawTableRow(canvas: Canvas, question: Document.H) {
val textBounds = Rect()
var cellHeight = if(question.value.isNullOrEmpty()) {
20f
} else {
paint.getTextBounds(question.value, 0, question.value!!.length, textBounds)
textBounds.height().toFloat()
}
if(cellHeight <= 20f) cellHeight = 20f
paint.textAlign = Paint.Align.LEFT
val top = yPointer
val right = (width.toFloat() - (pageMargin * 2)) / 3
val bottom = height - (yPointer + cellHeight + pageMargin)
val leftCell = RectF(pageMargin, top, right, bottom)
val rightCell = RectF(leftCell.right, top, pageMargin, bottom)
var textY = yPointer + yPadding
canvas.drawRect(rightCell, contentBgPaint)
canvas.drawRect(leftCell, contentBgPaint)
canvas.drawText(question.h.hQuestion.title, 0, question.h.hQuestion.title.length, pageMargin, textY, paint)
canvas.drawText(question.h.hQuestion.subtitle, 0, question.h.hQuestion.subtitle.length, pageMargin, textY + 16f, paint)
canvas.drawText(question.value!!, 0, question.value!!.length, leftCell.right, textY, paint)
yPointer += cellHeight.toInt()
}
并且当 运行 调试器时,Rect
坐标似乎设置正确。
但是,出现了一种常见的行为 - 要么只绘制了一个矩形,要么这些矩形彼此完全重叠,尽管坐标不同。
因为如果我尝试只绘制右边的矩形,它仍然会出现在文档的左侧,与左边矩形的比例完全一致,如下图所示。
这是一个愚蠢的错误。 The documentation for RectF 明确指出左 <= 右和上 <= 下。调试器清楚地显示右侧单元格的左侧值 > 右侧。
我在右侧的单元格中将 pageMargin
替换为 width.toFloat() - pageMargin
,这解决了问题。
由于缺少 how to print iText documents.
的文档,我刚从使用 iText 切换到原生 androidPdfDocument
我正在尝试在 Canvas
上绘制 table,方法是遍历列表并为每个项目添加左右列,使用 Rect
[ 表示=20=]
负责绘制table行的函数如下所示:
fun drawTableRow(canvas: Canvas, question: Document.H) {
val textBounds = Rect()
var cellHeight = if(question.value.isNullOrEmpty()) {
20f
} else {
paint.getTextBounds(question.value, 0, question.value!!.length, textBounds)
textBounds.height().toFloat()
}
if(cellHeight <= 20f) cellHeight = 20f
paint.textAlign = Paint.Align.LEFT
val top = yPointer
val right = (width.toFloat() - (pageMargin * 2)) / 3
val bottom = height - (yPointer + cellHeight + pageMargin)
val leftCell = RectF(pageMargin, top, right, bottom)
val rightCell = RectF(leftCell.right, top, pageMargin, bottom)
var textY = yPointer + yPadding
canvas.drawRect(rightCell, contentBgPaint)
canvas.drawRect(leftCell, contentBgPaint)
canvas.drawText(question.h.hQuestion.title, 0, question.h.hQuestion.title.length, pageMargin, textY, paint)
canvas.drawText(question.h.hQuestion.subtitle, 0, question.h.hQuestion.subtitle.length, pageMargin, textY + 16f, paint)
canvas.drawText(question.value!!, 0, question.value!!.length, leftCell.right, textY, paint)
yPointer += cellHeight.toInt()
}
并且当 运行 调试器时,Rect
坐标似乎设置正确。
但是,出现了一种常见的行为 - 要么只绘制了一个矩形,要么这些矩形彼此完全重叠,尽管坐标不同。
因为如果我尝试只绘制右边的矩形,它仍然会出现在文档的左侧,与左边矩形的比例完全一致,如下图所示。
这是一个愚蠢的错误。 The documentation for RectF 明确指出左 <= 右和上 <= 下。调试器清楚地显示右侧单元格的左侧值 > 右侧。
我在右侧的单元格中将 pageMargin
替换为 width.toFloat() - pageMargin
,这解决了问题。