Android中美丽的描边文字
Posted
技术标签:
【中文标题】Android中美丽的描边文字【英文标题】:Beautiful Stroked Text in Android 【发布时间】:2015-06-12 22:31:27 【问题描述】:我知道如何使用自定义视图(EditText 或 TextView)来描边文本,但我无法实现像这样漂亮的东西,这是使用 Photoshop 完成的。是的,它也有外阴影。
到目前为止,我所做的是调整笔触宽度和笔触连接样式。但是,如果我增加笔画宽度,笔画会发生在整个文本中。 据我搜索,有一个名为MagicTextView 的库,但它也无法给出上述结果。
更新:我根据@pskink 的建议进行了一些调整。现在可以了。但是我不能再拖了。如果我拖动那个 EditText,就会出现一些像这样的奇怪线条。
代码如下:
@Override public void onDraw(Canvas canvas)
final int x = this.getLeft();
final int y = this.getBottom();
mText = this.getText().toString();
p.setStrokeWidth(30);
p.setStyle(Style.STROKE);
p.setStrokeJoin(Join.ROUND);
p.setColor(0xffffffff);
canvas.drawText(mText, x, y, p);
p.setStyle(Style.FILL);
p.setColor(0xff000000);
canvas.drawText(mText, x, y, p);
【问题讨论】:
用不同的颜色和笔划宽度调用 drawText 两次(或者如果你能有那个花哨的黑色阴影,调用它 3 次) @pskink 是的,我也测试过。但它并没有按预期工作。 @pskink 添加了我当前版本的代码。我现在没有那个版本的代码,但我已经对其进行了测试,我遇到的是我无法使用 drawText 定位文本的描边版本。我的视图将被用户拖动。它不是以编程方式生成的。 将 Style.FILL 更改为 Style.STROKE 并先绘制较粗的文本,然后再绘制普通文本 @pskink 更新了代码。它现在可以工作,但正如我上面所说,我的视图可以被用户拖动。现在,我无法按预期拖动它。我的定位计算有问题? 【参考方案1】:经过几个小时的调整,我已经修复了更新问题中所述的奇怪线路问题。我想我应该在这里发帖作为答案。
@Override public void onDraw(Canvas canvas)
mText = this.getText().toString();
p.setStyle(Style.STROKE);
p.setStrokeJoin(Join.ROUND);
p.setShadowLayer(10, 1, 1, 0xcfcccccc);
canvas.drawText(mText, 0, getLineHeight(), p);
p.clearShadowLayer();
p.setStrokeWidth(35);
p.setStrokeJoin(Join.ROUND);
p.setStyle(Style.STROKE);
p.setColor(0xffffffff);
canvas.drawText(mText, 0, getLineHeight(), p);
p.setStyle(Style.FILL);
p.setColor(0xff000000);
canvas.drawText(mText, 0, getLineHeight(), p);
canvas.translate(xPos, yPos);
xPos 和 yPos 是来自ACTION_MOVE
onTouch 事件的 x 和 y 值。我们需要将行高添加为画布文本的 Y。
【讨论】:
【参考方案2】:但是,如果我增加笔画宽度,笔画会发生在整个文本中。
如果问题是笔划居中,并且您希望它在文本之外,请参阅:android Paint stroke width positioning
您必须根据您的笔划预先计算所需的宽度和高度。
我建议尝试使用非常粗体的字体。在下图中,white 笔划将以 red 线为中心(这将是每个 black 字母的轮廓)。 p>
响应您的更新:
如果我拖动那个 EditText,就会出现一些奇怪的线条。
该行可能是焦点在 EditText 上的结果。您可以明确移除焦点:Android: Force EditText to remove focus?
或者,您可以设置焦点的样式(如果不会对 UI 的其余部分产生不利影响,可以设置为不可见):How to change the color of a focused EditText when using "android:Theme.Holo.Light"?
【讨论】:
调整宽度和高度也没有解决。那些笔画仍然出现在整个文本中。 尝试使用非常粗的字体。 是的,我在 android:textStyle="bold" 中使用粗体 我的意思是字体本身应该有粗体字。 是的,我知道你的意思。 ?我已经在使用压缩的roboto了。它很厚,对吧?您能否详细说明您编辑后的建议?以上是关于Android中美丽的描边文字的主要内容,如果未能解决你的问题,请参考以下文章
text-stroke实现文字描边(镂空)text-fill-color实现文字填充&渐变(+animation实现流光字体)