2013-08-26 24 views
12

Attualmente sto creando un editor di immagini e sto tentando di disegnare il testo sopra l'immagine usando canvas.drawText(). Finora ho avuto successo nel fare ciò, ma quando l'utente immette del testo troppo lungo, il testo continua su una sola riga fuori dalla pagina e non si estende alla larghezza dello schermo. Come potrei fare questo? Ho provato a utilizzare un layout statico ma non riesco a farlo funzionare, qualcuno ha un tutorial per farlo?DrawText Android incluso il testo a capo

La mia funzione per disegnare su una tela utilizzando il layout statico:

public Bitmap createImage(float scr_x,float scr_y,String user_text){ 

      Canvas canvas = new Canvas(image); 

      scr_x = 100; 
      scr_y = 100; 
      final TextPaint tp = new TextPaint(Color.WHITE);  
      canvas.save(); 
      StaticLayout sl = new StaticLayout("" + user_text, tp, originalBitmap.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); 
      sl.draw(canvas); 

     return image; 
     } 

Va bene, ho aggiornato il mio codice, ma quando provo a disegnare sull'immagine non succede niente affatto, non ho idea del perché o:

public Bitmap createImage(String user_text) { 
    // canvas object with bitmap image as constructor 
    Canvas canvas = new Canvas(image); 
    TextPaint tp = new TextPaint(); 
    tp.setColor(Color.RED); 
    tp.setTextSize(50); 
    tp.setTextAlign(Align.CENTER); 
    tp.setAntiAlias(true); 
    StaticLayout sl = new StaticLayout("" + user_text, tp, 
      canvas.getWidth(), Layout.Alignment.ALIGN_NORMAL, 1, 0, false); 
    canvas.translate(100, 100); 
    sl.draw(canvas); 
    return image; 
} 

Islay statico non deve essere utilizzato per disegnare su tela?

+0

Date un'occhiata a quest'altra risposta per un buon esempio di utilizzo di 'StaticLayout's: http: //stackoverflow.com/a/8369690/293280 –

+0

possibile duplicato di [Disegna testo multilinea su tela] (http://stackoverflow.com/questions/6756975/draw-multi-line-text-to-canvas) –

risposta

11

Sì, StaticLayout è che cosa si intende utilizzare per disegnare testo su più righe su una tela. Salva te stesso un mondo di dolore e non pensare a rompere il testo te stesso - sei sulla strada giusta. Non sono sicuro del problema con la bitmap, ma il tuo secondo codice sopra ha funzionato bene per disegnare il testo su una tela per me.

Questo è come si disegna un layout su tela: http://developer.android.com/reference/android/text/Layout.html#draw(android.graphics.Canvas)

+0

Si prega di fornire un esempio, dal momento che StaticLayout non ha alcun metodo di disegno diretto su una tela (e Canvas non ha alcun disegno (text.layout)) –

+0

Anche la mia risposta è corretta, ma non è il modo migliore .. solo a voi vedere quanto ingiusto sia questo –

+0

Posso confermare che la soluzione di Marcos funziona davvero, ho dimenticato di aggiungere la seguente riga alla fine, iv_ttx.setImageBitmap (image) ..... Grazie Marco. –

-2

Si dovrebbe gestire da soli, calcolando la dimensione del testo e avvolgendo il contenuto in qualche modo (interruzione alla larghezza massima o avvolgere l'ultima parola).

L'ho già fatto su Java SE con FontMetrics, mai per Android; ma si dovrebbe dare un'occhiata:

http://developer.android.com/reference/android/graphics/Paint.FontMetrics.html 

Come sottolineato da Lisa, StaticLayout è la strada da percorrere per misurare la disposizione del testo.

+0

In che modo vuoi dire? Sono davvero alle prese con questo dato che sono abbastanza nuovo. Sembra che dalla lettura di tutti gli altri thread sia preferibile il metodo StaticLayout? –

+0

I componenti che si estendono Visualizza non verranno disegnati nulla finché non viene chiamato il layout e la misura, potrebbe essere necessario chiamare slmeasure (100,100, larghezza, altezza) quindi disegnare. Ma so che è possibile misurare la larghezza dei caratteri per avvolgere il contenuto. –

+2

StaticLayout è specificamente progettato per il rendering di testo su più righe, inclusa la gestione di interruzioni di linea. Dovresti assolutamente usarlo per disegnare del testo su una tela in ogni caso in cui "verrebbe la tentazione di chiamare Canvas.drawText() direttamente". Fidati di me, NON vuoi entrare nella tua linea di rottura. http://developer.android.com/reference/android/text/StaticLayout.html –

3
public Bitmap drawMultilineTextToBitmap(Context gContext, 
            int gResId, 
            String gText) { 

    // prepare canvas 
    Resources resources = gContext.getResources(); 
    float scale = resources.getDisplayMetrics().density; 
    Bitmap bitmap = BitmapFactory.decodeResource(resources, gResId); 

    android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); 
    // set default bitmap config if none 
    if(bitmapConfig == null) { 
    bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; 
    } 
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one 
    bitmap = bitmap.copy(bitmapConfig, true); 

    Canvas canvas = new Canvas(bitmap); 

    // new antialiased Paint 
    TextPaint paint=new TextPaint(Paint.ANTI_ALIAS_FLAG); 
    // text color - #3D3D3D 
    paint.setColor(Color.rgb(61, 61, 61)); 
    // text size in pixels 
    paint.setTextSize((int) (14 * scale)); 
    // text shadow 
    paint.setShadowLayer(1f, 0f, 1f, Color.WHITE); 

    // set text width to canvas width minus 16dp padding 
    int textWidth = canvas.getWidth() - (int) (16 * scale); 

    // init StaticLayout for text 
    StaticLayout textLayout = new StaticLayout(
    gText, paint, textWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); 

    // get height of multiline text 
    int textHeight = textLayout.getHeight(); 

    // get position of text's top left corner 
    float x = (bitmap.getWidth() - textWidth)/2; 
    float y = (bitmap.getHeight() - textHeight)/2; 

    // draw text to the Canvas center 
    canvas.save(); 
    canvas.translate(x, y); 
    textLayout.draw(canvas); 
    canvas.restore(); 

    return bitmap; 
} 

fonte: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/