2014-02-27 55 views
5

我想對齊位圖水平和垂直文本,我讀了幾個帖子,但我找不到解決方案。位圖是一個簡單的圓形圖像。我發佈我的當前代碼。或多或少,它的作品,但文本不是完全居中,它似乎有點在左邊,有點在頂部,我的意思是我似乎必須添加一個偏移量將其移動到右側和底部。垂直和水平與畫布中心文本

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

回答

21

問題是您目前沒有考慮文本的寬度和高度。如果你的文字是「你好」或「這是一個字符串」,那麼你只要平等對待,那就錯了。

您需要計算文本的寬度和高度,然後將文本位置移動一半距離。

例如垂直居中:

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

好一點,現在的代碼爲:int XPOS =(canvas.getWidth()/ 2) - ((r.width())/ 2); int yPos =(canvas.getHeight()/ 2)+((r.height())/ 2);但x不再對齊,現在我已經將文字移動到了左側。 – greywolf82

+0

查看編輯答案 – Merlevede

+0

好的,現在可以使用了,謝謝!!!!!!! – greywolf82

-1

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

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

我從電話張貼和未測試的答案抱歉。讓我知道它是否會起作用。

+0

請參閱我對之前回復的評論。 – greywolf82

13

由於@Merlevede說,如果你對準textPaint爲CENTER,你只需要做:

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

爲一個簡單和工作的解決方案 – martyglaubitz