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

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

这是我现在正在使用的代码types(这只是示例代码,在我的覆盖之一):

@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); } 

最简单的方法是用笔画…这样的事情:

 @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,然后重用它们。

而不是这个代码(从第一个答案)

 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); 

看起来更好?

半答案可能会或可能不够好(这是我的情况),是要设置一个影子:

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

阴影帮助文字突出了很多,但不如黑色边框那样好。 我仍然好奇如何解决原来的问题。

这是在黑暗中的完整镜头,可能有更好的方法,但是如果您创build文本的4个副本,将其颜色设置为黑色,然后将每个图层对angular线移动1个像素,则会创build一个边框的幻觉。 所以如果你的文字定位在[100,100],这四个阴影需要定位在[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);