如何在Android中的MapView上绘制带边框的文本?

时间:2009-11-12 17:13:20

标签: android google-maps android-mapview

我正在尝试在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 个答案:

答案 0 :(得分:63)

最简单的方法是使用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像素的边框,然后在其顶部绘制文本,为您提供轮廓的幻觉。

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

答案 1 :(得分:16)

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

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

尝试使用Path:

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

看起来更好?

答案 2 :(得分:11)

半答案,可能是也可能不够好(在我的情况下),是设置阴影:

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

阴影有助于文本突出显示,但不如黑色边框那么好。我仍然很好奇如何解决原来的问题。

答案 3 :(得分: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);