使用画布在垂直和水平方向上居中文本

13
我正在尝试在位图中水平和垂直对齐文本,我阅读了几篇文章,但找不到解决方案。位图是一个简单的圆形图像。我发布了我的现有代码。大体上它能工作,但是文本并不完全居中,似乎有点偏左和偏上,我的意思是似乎需要添加一个偏移量将其向右和向下移动。
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个回答

35
问题在于你目前没有考虑文本的宽度和高度。如果你的文本是"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);

现在代码稍微好一些了:int xPos = (canvas.getWidth() / 2) - ((r.width())/2); int yPos = (canvas.getHeight() / 2) + ((r.height())/2); 但是x轴不再对齐,现在文本向左移动了。 - greywolf82

25

正如@Merlevede所说,如果您将textPaint对齐到CENTER,您只需要执行以下操作:

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

-1

水平位置:

xPos = (canvas.getWidth() / 2) - (widthofthetext)/2;

垂直位置:

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

我是从手机上发布的,对于未经测试的答案表示抱歉。如果可以的话,请让我知道它是否有效。


请查看我对之前回复的评论。 - greywolf82

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接