2014-02-27 4 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 

Я надеюсь, что это приведет вас в правильном направлении.

EDIT: Происхождение интерпретируется на основе параметра «Выровнять» в краске. Вы используете

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

Смежные вопросы