Подтвердить что ты не робот

HTML-холст drawText y-позиция текста

Я использую Canvas для создания Drawable с некоторым фоном и некоторым текстом. Выбираемый используется в качестве составного элемента, который можно извлечь внутри EditText.

Текст нарисован через drawText() на холсте, но в некоторых случаях у меня есть проблема с y-позицией нарисованного текста. В тех случаях части некоторых символов обрезаются (см. Ссылки на изображения).

Символы без проблемы с позиционированием:

http://i50.tinypic.com/zkpu1l.jpg

Символы с проблемой позиционирования, текст содержит "g", "j", "q" и т.д.:

http://i45.tinypic.com/vrqxja.jpg

Вы можете найти фрагмент кода, чтобы воспроизвести проблему ниже.

Знает ли какой-либо эксперт, как определить правильное смещение для позиции y?

public void writeTestBitmap(String text, String fileName) {
   // font size
   float fontSize = new EditText(this.getContext()).getTextSize();
   fontSize+=fontSize*0.2f;
   // paint to write text with
   Paint paint = new Paint(); 
   paint.setStyle(Style.FILL);  
   paint.setColor(Color.DKGRAY);
   paint.setAntiAlias(true);
   paint.setTypeface(Typeface.SERIF);
   paint.setTextSize((int)fontSize);
   // min. rect of text
   Rect textBounds = new Rect();
   paint.getTextBounds(text, 0, text.length(), textBounds);
   // create bitmap for text
   Bitmap bm = Bitmap.createBitmap(textBounds.width(), textBounds.height(), Bitmap.Config.ARGB_8888);
   // canvas
   Canvas canvas = new Canvas(bm);
   canvas.drawARGB(255, 0, 255, 0);// for visualization
   // y = ?
   canvas.drawText(text, 0, textBounds.height(), paint);

   try {
      FileOutputStream out = new FileOutputStream(fileName);
      bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
   } catch (Exception e) {
      e.printStackTrace();
   }
}
4b9b3361

Ответ 1

Я думаю, что, вероятно, ошибочно предположить, что textBounds.bottom = 0. Для этих нисходящих символов нижние части этих символов, вероятно, ниже 0 (что означает textBounds.bottom > 0). Вероятно, вы хотите что-то вроде:

canvas.drawText(text, 0, textBounds.top, paint); //instead of textBounds.height()

Если ваш textBounds составляет от +5 до -5, и вы рисуете текст по y = height (10), вы увидите только верхнюю половину текста.

Ответ 2

Я считаю, что если вы хотите нарисовать текст в верхнем левом углу, вы должны сделать это:

canvas.drawText(text, -textBounds.left, -textBounds.top, paint);

И вы можете перемещаться по тексту, суммируя требуемое количество смещений в две координаты:

canvas.drawText(text, -textBounds.left + yourX, -textBounds.top + yourY, paint);

Причина, по которой это работает (по крайней мере для меня), заключается в том, что getTextBounds() сообщает вам, где drawText() будет рисовать текст в том случае, если x = 0 и y = 0. Таким образом, вы должны противодействовать этому поведению, вычитая смещение (textBounds.left и textBounds.top), введенное способом обработки текста в Android.

В этом ответе Я подробно расскажу об этой теме.