traditional:true,
和Paint
之间有什么区别?只能TextPaint
在画布上绘制文字吗?
我最近一直在研究如何在画布上绘制文字,这导致我TextPaint
。但是,在阅读the source code时,我很惊讶地发现TextPaint
并没有多少。事实上,你实际上并不需要它在画布上绘制文字。所以我正在添加这个Q& A以使其更清晰。
答案 0 :(得分:10)
TextPaint
是Paint
的子类。但是,与您从这些名称中猜到的相反,在画布上绘制文本的繁重工作是由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
- 我只能假设这意味着它所说的链接的文字颜色。但是,我发现在任何源代码中都没有使用它。备注强>
TextPaint
source code Paint
source code 答案 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()
可能不是最准确地将文本居中的方法,如果您有更好的方法,请发表评论。