使用画布垂直和水平居中文本

时间:2014-02-27 18:53:09

标签: android android-canvas drawtext

我正在尝试水平和垂直对齐位图中的文本,我阅读了几篇文章,但我找不到解决方案。位图是一个简单的圆形图像。我发布了当前的代码。它或多或少都有效,但是文本没有完全居中,它看起来有点在左边,有点在顶部,我的意思是我似乎必须添加一个偏移来将它移动到右边和底部。

public static float convertDpToPixel(float dp, Context context) {
     Resources resources = context.getResources();
     DisplayMetrics metrics = resources.getDisplayMetrics();
     float px = dp * (metrics.densityDpi / 160f);
     return px;
}    

v = (ImageView) findViewById(R.id.imageView1);
Bitmap b = BitmapFactory.decodeResource(getResources(),
               R.drawable.marker).copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(b);
Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
textPaint.setARGB(255, 0, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(Typeface.DEFAULT_BOLD);
textPaint.setTextSize(convertDpToPixel(9, this));

String text = "30";
int xPos = (canvas.getWidth() / 2);
int yPos = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() +
               textPaint.ascent()) / 2)) ;

canvas.drawText(text, xPos, yPos, textPaint);
v.setImageBitmap(b);

3 个答案:

答案 0 :(得分:27)

问题是您目前没有考虑文本的宽度和高度。如果你的文字是“hello”或“THIS A STRING”你只是平等对待它,那就错了。

您需要计算文本的宽度和高度,然后将文本位置移动一半距离。

例如垂直居中:

Rect r = new Rect();
paint.getTextBounds(text, 0, text.length(), r);
yPos += (Math.abs(r.height()))/2;    // or maybe -= instead of +=, depends on your coordinates

我希望这会带你走向正确的方向。

编辑: 原点基于绘画中的“对齐”设置进行解释。你正在使用

 textPaint.setTextAlign(Align.CENTER);

因此,您可能不需要进行任何水平居中的计算(这意味着对于水平原点,您应该使用已有的代码)。

 int xPos = (canvas.getWidth() / 2);

答案 1 :(得分:17)

正如@Merlevede所说,如果你将textPaint与CENTER对齐,你只需要这样做:

canvas.drawText(
    text,
    canvas.getWidth() / 2,
    ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2)),
    textPaint
);

答案 2 :(得分:-1)

水平位置:     xPos = (canvas.getWidth() / 2) - (widthofthetext)/2;

垂直:    yPos = (canvas.getHeight() / 2) - (heightofthetext)/2;

我是通过手机发布的,抱歉未经测试的答案。让我知道它是否有效。