2012-05-15 9 views
25

Używam płótna do tworzenia rysunków z pewnym tłem i tekstem. Wyciąg jest używany jako złożony do przeciągnięcia wewnątrz EditText.Kanwa Androida drawText Pozycja y tekstu

Tekst jest rysowany za pomocą metody drawText() na płótnie, ale w niektórych przypadkach mam problem z pozycją y narysowanego tekstu. W takich przypadkach części niektórych znaków są obcięte (patrz linki do obrazów).

znaków bez problemu pozycjonowania:

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

Znaki problemu pozycjonowania tekst zawiera 'g', 'j', 'q' itd .:

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

Możesz znaleźć fragment kodu, aby odtworzyć problem poniżej.

Czy każdy ekspert wie, jak określić właściwe przesunięcie dla pozycji 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(); 
    } 
} 

Odpowiedz

25

myślę, że to prawdopodobnie błędem zakładać, że textBounds.bottom = 0. Dla tych znaków malejącym, dolne części tych znaków są prawdopodobnie poniżej 0 (co oznacza textBounds.bottom> 0). Prawdopodobnie chcesz coś takiego:

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

Jeśli textBounds wynosi od +5 do -5, i wyciągnąć tekst na y = wysokość (10), wtedy zobaczysz tylko górną połowę tekstu .

+13

Dzięki za skierowanie mnie we właściwym kierunku. canvas.drawText (text, 0, textBounds.height() - textBounds.bottom, paint); było rozwiązaniem – darksaga

10

Wierzę, że jeśli chcesz rysować tekstu przy lewym górnym rogu powinien to zrobić:

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

I można poruszać się po tekście poprzez zsumowanie żądaną ilość przemieszczenia do dwóch współrzędnych:

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

powodem dlaczego to działa (przynajmniej dla mnie) jest to, że getTextBounds() powie ci, gdzie drawText() zwraca tekst w przypadku, gdy x = 0 i y = 0. Musimy więc przeciwdziałać temu zachowaniu, odejmując przesunięcie (textBounds.left i textBounds.top) wprowadzone przez sposób obsługi tekstu w systemie Android.

In this answer Opracowuję nieco więcej na ten temat.

Powiązane problemy