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实现流光字体)

CSS实现文字描边效果

如何在 JSFL 中获得符号的描边边界?

普通的css普通的描边字

通过 CSS 更改 svg 的描边颜色

react native 怎么给文字加描边