代码之家  ›  专栏  ›  技术社区  ›  Dan Lew

在Android中,如何在地图视图上绘制带边框的文本?

  •  32
  • Dan Lew  · 技术社区  · 15 年前

    我正在尝试在Android上的地图视图上绘制一些文本。文本的绘制很好,但是很难阅读文本,因为它是白色的,没有黑色边框(就像其他文本自然出现在地图视图上,表示城市、州和国家)。我似乎不知道如何用黑色边框来绘制文本。有人知道怎么做吗?

    这是我现在使用的代码类型(这只是示例代码,在我的一个套印格式中找到):

    @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 回复  |  直到 13 年前
        1
  •  63
  •   Jeremy Logan    15 年前

    最简单的方法是中风…像这样:

    @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个像素的边框,然后在其顶部绘制文本,使您产生轮廓的错觉。

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

        2
  •  15
  •   Oleg    14 年前

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

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

    尝试对路径使用相同的路径:

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

    看起来更好?

        3
  •  11
  •   Dan Lew    15 年前

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

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

    阴影有助于文本突出,但不如黑色边框好。我仍然好奇如何解决最初的问题。

        4
  •  2
  •   Aleksander Kmetec    15 年前

    这是一个在黑暗中完成的镜头,也许还有更好的方法,但是如果你创建了4份文本,将它们的颜色设置为黑色,然后将每一层对角线移动1个像素,它将创建一个边框的假象。因此,如果文本定位在[100100]处,则需要将4个阴影定位在[99,99]、[99101]、[101,99]和[101101]处,如下所示:

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