【问题标题】:Prevent canvas from disjoining drawn text防止画布分离绘制的文本
【发布时间】:2018-04-13 00:19:15
【问题描述】:

我正在尝试将数字网格绘制到画布中。

val textX = x * TILE_SIZE + TILE_SIZE / 2f
val textY = y * TILE_SIZE + TILE_SIZE / 2f 
canvas.drawText(number.toString(), textX, textY, textPaint)

这是我的画

private val textPaint: Paint by lazy {
    Paint().apply {
        isAntiAlias = false
        color = Color.WHITE
        textSize = TILE_SIZE * 0.1f
        textAlign = Paint.Align.CENTER
        style = Paint.Style.FILL
    }
}

但是画布总是与我的文本脱节,并在非规则网格中对齐。我仔细检查了我的位置值。有什么我遗漏的吗?

编辑:我知道我已将对齐设置为 CENTER,但如果您注意到,第 4 行中的文本的偏移量高于前一行

我能够通过添加 subPixelText 标志来解决文本脱节问题,有趣的是,当我设置paints 标志stroughText

isStrikeThruText = true

我得到以下结果:

这个,我相信这表明坐标设置正确,但由于字体大小,绘制配置可能存在一些问题。

【问题讨论】:

  • 你应该看看这个帖子stackoverflow.com/questions/11120392/…。正如回答的那样,文本的基线被放置在你给它的坐标上,这使它位于单元格的中心之上。要真正使文本居中,您应该根据文本大小在 Y 坐标上添加更多内容。
  • 谢谢,我遇到过这个解决方案,但它并没有解决脱节和垂直偏移问题,事实上即使在 x 轴上问题仍然存在
  • 问题可能出在 x 和 y 计算上。您应该在计算 x 和 y 的位置添加代码。
  • Paint#getTextWidths(String text, float[] widths)widths 数组中返回什么? Log.d该数组的内容
  • 所以Paint#measureText() 返回 4? 4 = 1 + 2 + 1

标签: android canvas text


【解决方案1】:

我已经设法解决了两个不同的问题:

  1. 文本错位 - 这是由于文本非常小造成的,结果是单个字母有时会占用太多空间并移动下一个字母。解决方法是更改​​paint subpixelText 属性:

    isSubpixelText = true
    
  2. 文本位置错误 - 在查看 Paint.FontMetrics 之后,我意识到 ascentdescent 值是由字体设置的推荐值,因此只能在指定的绘制字体内更改。我只是通过切换到另一种字体来解决这个问题。

编辑:我最终使用了StaticLayout,更多关于主题here

【讨论】:

    猜你喜欢
    • 2015-04-25
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2015-10-06
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多