2012-05-15 11 views
25

Sto usando una tela per creare un Drawable con qualche sfondo e del testo. Il drawable è usato come un composto estraibile all'interno di un EditText.Draw canvas canvasTesto posizione y di testo

Il testo viene disegnato tramite drawText() sulla tela, ma in alcuni casi ho un problema con la posizione y del testo disegnato. In questi casi le parti di alcuni personaggi sono troncate (vedi link immagine).

caratteri senza emissione di posizionamento:

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

Caratteri con emissione posizionamento, testo contiene 'g', 'j', 'q', ecc .:

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

È possibile trovare uno snippet di codice per riprodurre il problema di seguito.

Un esperto sa come determinare l'offset corretto per la posizione 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(); 
    } 
} 

risposta

25

penso che sia probabilmente un errore presumere che textBounds.bottom = 0. Per quei personaggi che scendono, le parti inferiori di quei personaggi sono probabilmente inferiore a 0 (il che significa textBounds.bottom> 0). Probabilmente si desidera qualcosa di simile:

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

Se i textBounds è da +5 a -5, e si disegna il testo in y = altezza (10), poi si vedrà solo la metà superiore del testo .

+13

Grazie per avermi indicato nella giusta direzione. canvas.drawText (testo, 0, textBounds.height() - textBounds.bottom, paint); era la soluzione – darksaga

10

Credo che se si vuole disegnare il testo vicino all'angolo in alto a sinistra si dovrebbe fare questo:

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

E si può spostare intorno al testo sommando la quantità desiderata di spostamento per le due coordinate:

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

il motivo per cui questo funziona (almeno per me) è che getTextBounds() ti dice dove drawText() richiama il testo nel caso in cui x = 0 ey = 0. Quindi devi neutralizzare questo comportamento sottraendo lo spostamento (textBounds.left e textBounds.top) introdotto dal modo in cui il testo viene gestito in Android.

In this answer Elaborare un po 'di più su questo argomento.

Problemi correlati