Android - 将具有纯色背景的文本绘制到画布上以用作位图

时间:2015-08-07 12:10:54

标签: android android-canvas android-bitmap

我已经构建了一个应用程序,可以将带有边框的文本绘制到画布上,然后将其用作位图并放入谷歌地图标记中。 我现在要做的是删除文本边框并在文本后面创建一个纯黑色矩形背景。我尝试了很多东西,但似乎无法在屏幕上显示任何内容。

到目前为止的代码:

    String text = "testText";        

    //create bitmap
    Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
    Bitmap bmp = Bitmap.createBitmap(300, 100, conf); 

    //--style text
    //text font
    Typeface tf = Typeface.create("Helvetica", Typeface.BOLD);
    //--set text style, colour, alignment, size
    //text
    Paint mText = new Paint();
    mText.setTextAlign(Align.CENTER);
    mText.setColor(Color.WHITE);
    mText.setStyle(Paint.Style.FILL);
    mText.setTextSize(convertToPixels(context, 12));
    mText.setTypeface(tf);
    mText.setAntiAlias(true);

    //text outline
    Paint mTextOutline = new Paint();
    mTextOutline.setTextAlign(Align.CENTER);
    mTextOutline.setColor(Color.BLACK);
    mTextOutline.setStyle(Paint.Style.STROKE);
    mTextOutline.setTextSize(convertToPixels(context, 12));
    mTextOutline.setTypeface(tf);
    mTextOutline.setAntiAlias(true);
    mTextOutline.setStrokeWidth(2);

    //create and draw text and outline onto canvas
    Canvas canvas = new Canvas(bmp);
    canvas.drawText(text, 150, 50, mText);
    canvas.drawText(text, 150, 50, mTextOutline);

    //add text marker to map
    textMarker[markerID] = mapView.addMarker(new MarkerOptions()
        .title("TEXT_MARKER")
        .position(point)
        .icon(BitmapDescriptorFactory.fromBitmap(bmp)));

更新

我现在正在尝试。似乎只在文本下面留下一条细细的黑线

//create bitmap
        Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
        Bitmap bmp = Bitmap.createBitmap(300, 100, conf); 

        //--style text
        //text font
        Typeface tf = Typeface.create("Helvetica", Typeface.BOLD);
        //--set text style, colour, alignment, size
        //text
        Paint mText = new Paint();
        mText.setTextAlign(Align.CENTER);
        mText.setColor(Color.WHITE);
        mText.setStyle(Paint.Style.FILL);
        mText.setTextSize(convertToPixels(context, 12));
        mText.setTypeface(tf);
        mText.setAntiAlias(true);

        //text outline
        Paint mTextBackground = new Paint();
        mTextBackground.setColor(Color.BLACK);
        mTextBackground.setStyle(Style.FILL);

        Rect rectangle = new Rect();

        mText.getTextBounds(text, 0, text.length(), rectangle);

        //create and draw text and outline onto canvas
        Canvas canvas = new Canvas(bmp);
        canvas.drawRect(rectangle, mTextBackground);
        canvas.drawText(text, 150, 50, mText);


        //add text marker to map
        textMarker[markerID] = mapView.addMarker(new MarkerOptions()
            .title("TEXT_MARKER")
            .position(point)
            .icon(BitmapDescriptorFactory.fromBitmap(bmp)));

1 个答案:

答案 0 :(得分:3)

而不是:

canvas.drawText(text, 150, 50, mTextOutline);

你应该使用Canvas中的一个drawRect函数绘制一个Rectagle。

小心

mTextOutline.setStyle(Paint.Style.STROKE);

表示仅绘制边框(笔触),而

mTextOutline.setStyle(Paint.Style.FILL);

应该填充矩形。

您可以使用Paint.getTextBounds来衡量文字的大小,也可以稍微增加一些,以便有一些边框。

当然,在文本之前绘制边框,否则你会隐藏它。