Android中Paint和TextPaint有啥区别?

Posted

技术标签:

【中文标题】Android中Paint和TextPaint有啥区别?【英文标题】:What is the difference between Paint and TextPaint in Android?Android中Paint和TextPaint有什么区别? 【发布时间】:2017-01-21 04:42:39 【问题描述】:

PaintTextPaint 有什么区别?只能TextPaint 将文本绘制到画布上吗?

我最近一直在研究如何在画布上绘制文本,这使我找到了TextPaint。然而,在阅读the source code 时,我惊讶地发现TextPaint 并没有太多内容。事实上,您实际上并不需要它在画布上绘制文本。因此,我添加此问答以使这一点更清楚。

【问题讨论】:

【参考方案1】:

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 - 我只能假设这意味着它所说的,链接的文本颜色。但是,我找不到在任何源代码中使用它。

备注

TextPaint source code Paint source code 如果您有更多信息,请留言或更新此答案。

【讨论】:

关于linkColor,我注意到ClickableSpan 在调查Spannable 中单个样式/彩色跨度的选项时正在使用它。【参考方案2】:

稍微查看源代码后,我发现baselineShift等公共参数实际上NOT在您使用textPaint作为参数调用drawText时应用于画布,而是一个额外的数据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() 可能不是将文本垂直居中的最准确方法,如果您有更好的方法,请发表评论。

【讨论】:

以上是关于Android中Paint和TextPaint有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Android Canvas - StaticLayout 绘制多行文字

Android自定义弧型View

Android 中的 TextPaint

安卓软件开发中怎么让一个EditText自动换行

TextView字体加粗的方式--自定义设置粗细

带文字的seekbar : 自定义progressDrawable/thumb :解决显示不全