Центр текста на растровом изображении - PullRequest
5 голосов
/ 28 марта 2012

Я пытаюсь нарисовать текст в центре растрового изображения, но я не могу этого сделать, даже если использовал align.centerКод:

public Bitmap drawTextToBitmap(Context gContext, String gText) {
    Resources resources = gContext.getResources();
    float scale = resources.getDisplayMetrics().density;
    Bitmap bitmap = 
            BitmapFactory.decodeResource(resources, R.drawable.blank_marker);

    android.graphics.Bitmap.Config bitmapConfig =
            bitmap.getConfig();
    // set default bitmap config if none
    if(bitmapConfig == null) {
        bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
    }
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one
    bitmap = bitmap.copy(bitmapConfig, true);

    Canvas canvas = new Canvas(bitmap);
    // new antialised Paint
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    // text color - #3D3D3D
    paint.setColor(Color.rgb(61, 61, 61));
    // text size in pixels
    paint.setTextSize((int) (25 * scale));
    // text shadow
    paint.setShadowLayer(1f, 0f, 1f, Color.WHITE);

    // draw text to the Canvas center
    Rect bounds = new Rect();
    paint.setTextAlign(Align.CENTER);

    paint.getTextBounds(gText, 0, gText.length(), bounds);
    int x = (bitmap.getWidth() - bounds.width())/2;
    int y = (bitmap.getHeight() + bounds.height())/2; 

    canvas.drawText(gText, x * scale, y * scale, paint);

    return bitmap;
}

Что я делаю не так?

Ответы [ 3 ]

14 голосов
/ 28 марта 2012

Это намного проще, чем вы думаете.

Нарисуйте текст на половине ширины и высоты Bitmap (центральной точки) в сочетании с Paint.setTextAlign(Align.CENTER).

Свойство выравнивания позаботится обо всем остальном.

2 голосов
/ 06 ноября 2013

Полагаю, ни один из приведенных выше ответов не достаточно хорош, поэтому я публикую свой ответ.Попробуйте, ребята, это будет работать на всех устройствах и совсем не сложно:

    Canvas canvas = new Canvas(bitmap);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    //paint.setTextAlign(Align.CENTER);
    paint.setColor(activity.getResources().getColor(R.color.white));
    paint.setTextSize(30);

    // draw text to the Canvas center
    Rect boundsText = new Rect();
    paint.getTextBounds(String.valueOf(cluster.getMarkerList().size()),
            0, String.valueOf(cluster.getMarkerList().size()).length(),
            boundsText);
    int x = (bitmap.getWidth() - boundsText.width()) / 2;
    int y = (bitmap.getHeight() + boundsText.height()) / 2;

    canvas.drawText(String.valueOf(cluster.getMarkerList().size()), x,
            y, paint);
0 голосов
/ 28 марта 2012

Где находится текст для рисования?Возможно, проблема в том, что вы изменили выравнивание текста на Align.CENTER.Ваш код, вычисляющий x и y, предполагает, что для визуализации текста используется Align.LEFT, я полагаю.

Либо используйте setTextAlign (Align.CENTER) и выполняйте рендеринг в самом центре растрового изображения, либо используйте setTextAlign (Align.LEFT) ииспользуйте текущие вычисления x и y, которые вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...