37

我正在尝试在 Android 上的 MapView 上绘制一些文本。文本的绘制很好,但是很难阅读文本,因为它是白色的,没有黑色边框(就像在 MapViews 上自然出现的用于表示城市、州和国家的文本的其余部分)。我似乎无法弄清楚如何用黑色边框绘制文本。有人知道怎么做吗?

这是我现在正在使用的那种代码(这只是示例代码,在我的一个叠加层中找到):

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Paint textPaint = new Paint();
    textPaint.setARGB(255, 255, 255, 255);
    textPaint.setTextAlign(Paint.Align.CENTER);
    textPaint.setTextSize(16);
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);

    canvas.drawText("Some Text", 100, 100, textPaint);

    super.draw(canvas, mapView, shadow);
}
4

4 回答 4

68

最简单的方法是使用 Stroke ......像这样:

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
    Paint strokePaint = new Paint();
    strokePaint.setARGB(255, 0, 0, 0);
    strokePaint.setTextAlign(Paint.Align.CENTER);
    strokePaint.setTextSize(16);
    strokePaint.setTypeface(Typeface.DEFAULT_BOLD);
    strokePaint.setStyle(Paint.Style.STROKE);
    strokePaint.setStrokeWidth(2);

    Paint textPaint = new Paint();
    textPaint.setARGB(255, 255, 255, 255);
    textPaint.setTextAlign(Paint.Align.CENTER);
    textPaint.setTextSize(16);
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);

    canvas.drawText("Some Text", 100, 100, strokePaint);
    canvas.drawText("Some Text", 100, 100, textPaint);

    super.draw(canvas, mapView, shadow);
}

这将在文本外部绘制一个 2 像素的边框,然后在其顶部绘制文本,给您一个轮廓的错觉。

此外,可能值得在构造函数中设置油漆然后重用它们。

于 2010-01-28T02:52:36.290 回答
19

而不是这段代码(来自第一个答案)

canvas.drawText("Some Text", 100, 100, strokePaint);
canvas.drawText("Some Text", 100, 100, textPaint);

尝试使用相同的路径:

Path path = new Path();
String text = "Some Text";
textPaint.getTextPath(text, 0, text.length(), 0, 100, path);
canvas.drawPath(path, strokePaint);
canvas.drawPath(path, textPaint);

看起来更好?

于 2011-04-28T10:59:27.960 回答
11

The half-answer, which may or may not be good enough (it was in my case), is to set a shadow:

textPaint.setShadowLayer(3, 0, 0, Color.BLACK);

The shadow helps the text stand out a lot, but isn't quite as good as a black border would be. I'm still curious how to solve the original question.

于 2009-11-16T16:16:51.653 回答
2

这是在黑暗中拍摄的完整照片,可能有更好的方法,但是如果您创建 4 个文本副本,将它们的颜色设置为黑色,然后将每个图层沿对角线移动 1 个像素,则会产生边框错觉。因此,如果您的文本定位在 [100,100],则 4 个阴影需要定位在 [99,99]、[99,101]、[101,99] 和 [101,101],如下所示:

canvas.drawText("Some Text", 99, 99, borderPaint);
canvas.drawText("Some Text", 99, 101, borderPaint);
canvas.drawText("Some Text", 101, 99, borderPaint);
canvas.drawText("Some Text", 101, 101, borderPaint);

canvas.drawText("Some Text", 100, 100, textPaint);
于 2009-11-17T22:08:31.543 回答