Android中的Paint和TextPaint有什么区别?

时间:2017-01-21 04:42:40

标签: android canvas text paint

traditional:true,Paint之间有什么区别?只能TextPaint在画布上绘制文字吗?

我最近一直在研究如何在画布上绘制文字,这导致我TextPaint。但是,在阅读the source code时,我很惊讶地发现TextPaint并没有多少。事实上,你实际上并不需要它在画布上绘制文字。所以我正在添加这个Q& A以使其更清晰。

2 个答案:

答案 0 :(得分:10)

TextPaintPaint的子类。但是,与您从这些名称中猜到的相反,在画布上绘制文本的繁重工作是由Paint完成的。因此,这个

TextPaint textPaint = new TextPaint();
textPaint.setTextSize(50);
canvas.drawText("some text", 10, 100, textPaint);

和这个

Paint paint = new Paint();
paint.setTextSize(50);
canvas.drawText("some text", 10, 100, paint);

实际上做同样的事情。 TextPaint只是Paint周围的轻量级包装,在绘制和测量文本时为Android提供了一些extra data。如果您阅读TextLine class source code(此类绘制一行文本),您可以看到这一点。这显然是为什么在创建类似StaticLayout的内容时必须传入TextPaint而不是Paint对象的原因。

TextPaint字段

关于“额外数据”在这里的说明是一个更全面的解释,文档非常稀少。 Disclamer :通过在TextPaint中更改这些值,我实际上无法影响在测试中如何绘制文本的任何更改。因此请将此部分与粒度一起使用盐。)

  • baselineShift - 基线是文本底部的行。有关图片,请参阅this answer。更改baselineShift会导致基线向上或向下移动,因此会影响在线上绘制文本的高度。
  • bgColor - 这是文字背后的背景色。
  • density - 我认为这是屏幕密度,但我找不到它在任何源代码中使用。
  • drawableState - 除了PFLAG_DRAWABLE_STATE_DIRTY标志外,我在源代码中找不到多少内容,这让我觉得这可以让对象知道何时需要重新绘制。
  • linkColor - 我只能假设这意味着它所说的链接的文字颜色。但是,我发现在任何源代码中都没有使用它。

备注

答案 1 :(得分:0)

在仔细查看源代码后,我发现当您使用textPaint作为参数调用baselineShift时,像drawText这样的公共参数实际上 NOT 应用于画布TextPaint保存的额外数据供您检索以手动应用于绘图操作。

例如,我希望(0,0)是我绘制的文本的中心位置,这就是我通常这样做的方式。

示例

private val mTextPaint = TextPaint().apply {
    color = Colors.BLACK
    textSize = 14.sp
    isAntiAlias = true
    baselineShift = (textSize / 2 - descent()).toInt()
    textAlign = Paint.Align.CENTER
}
override fun onDraw(canvas: Canvas) {
    super.onDraw(canvas)
    canvas.drawText("Hello World", 0f, mTextPaint.baselineShift.toFloat(), mTextPaint)
}

注意:sp是kotlin中的扩展属性,其作用类似于函数sp2px(Number sp)
,而(textSize / 2 - descent()).toInt()可能不是最准确地将文本居中的方法,如果您有更好的方法,请发表评论。