Android canvas drawText y-положение текста
Я использую холст для создания рисунка с некоторым фоном и некоторым текстом. Выигрышного используется в качестве составной мешочки внутри полей 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();
}
}
2 ответа:
Я думаю, что это, вероятно, ошибка предполагать, что учебники.дно = 0. Для этих нисходящих символов нижняя часть этих символов, вероятно, ниже 0(что означает textBounds.снизу > 0). Вы, вероятно, хотите что-то вроде:
canvas.drawText(text, 0, textBounds.top, paint); //instead of textBounds.height()
Если ваш textBounds находится в диапазоне от +5 до -5, и вы рисуете текст на высоте y=(10), то вы увидите только верхнюю половину текста.
Я считаю, что если вы хотите нарисовать текст рядом с верхним левым углом, вы должны сделать это:
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.налево и направо.сверху) ввели кстати, текст обрабатывается в Android.
В этом ответе я подробнее остановлюсь на этой теме.