2012-05-15 7 views
25

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

Текст нарисован через 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(); 
    } 
} 

ответ

25

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

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

Если от Границы текста +5 до -5, и вы рисуете текст при у = высота (10), то вы будете видеть только верхнюю половину текста ,

+13

Спасибо, что указал мне в правильном направлении. canvas.drawText (текст, 0, textBounds.height() - textBounds.bottom, paint); было решение – darksaga

10

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

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

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

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

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

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