2014-10-14 5 views
5

Ho una tessera rettangolare e voglio inserire un'immagine e del testo. L'immagine non deve sovrapporsi al testo e le dimensioni dell'immagine e del testo possono variare.Rileva dove TextView di Android inserisce un'interruzione di riga

Il processo deve essere essere codificato a mano, poiché è necessario regolarlo in base alle esigenze del cliente.

Ho provato l'approccio di misurare prima i limiti del testo renderizzato utilizzando getTextBounds() o measureText() e quindi adattando la dimensione del carattere e la dimensione dell'immagine in modo che non si sovrappongano.

Questo funziona perfettamente se il testo è solo su una riga.

Ma se TextView avvolge il testo su più righe, non è possibile prevedere i limiti del testo, poiché non so dove inserire le interruzioni di riga automatiche in TextView.

Come individuare le posizioni nel testo in cui TextView inserisce un'interruzione di riga automatica?

Esempio: Poiché il testo

Lorem ipsum dolor sit amet

che verrebbe reso come

| Lorem ipsum | 
| dolor sit amet | 

Ho bisogno di una funzione che converte

Lorem ipsum dolor sit amet

a

Lorem ipsum \ndolor sit amet

+0

vedere StaticLayout classe – pskink

risposta

4

TextView (oggetto Layout) ha alcune funzioni utili per quello che stai cercando di realizzare:

http://developer.android.com/reference/android/text/Layout.html

un'occhiata a:

getLineCount()

getLineEnd(int line)

È possibile ottenere la stringa per la stringa TextView in base a dove il personaggio si trova in ogni lineEnd.

È necessario utilizzare getViewTreeObserver() per attendere fino a quando non viene disegnato TextView prima di poterli chiamare e ottenere da essi informazioni utili.

In alternativa, è possibile creare un TextView personalizzato che potrebbe fornire i dati tramite metodi incorporati o aggiungendo un listener ad esso.Un esempio di un TextView personalizzato che modifica la dimensione del testo è qui:

android ellipsize multiline textview

Ho usato quello e fatto modifiche simili (come quello che si sta tentando di fare).

+0

Se _TextView_ è già disegnato, è necessario chiamarlo da un thread diverso, altrimenti il ​​conteggio delle righe non sarà corretto. 'textview.post (new Runnable { int lineCount = textview.getLineCount(); });' –

3

Si sarebbe probabilmente vuole avvolgere questa logica in una visualizzazione personalizzata (sovrascrivendo onSizeChanged()), ma è possibile utilizzare la classe Layout per controllare dove ogni riga termina:

textView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     // Remove immediately so it only fires once 
     textView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 

     // View should be laid out, including text placement 
     final Layout layout = textView.getLayout(); 
     float maxLineWidth = 0; 

     // Loop over all the lines and do whatever you need with 
     // the width of the line 
     for (int i = 0; i < layout.getLineCount(); i++) { 
      maxLineWidth = Math.max(maxLineWidth, layout.getLineWidth(i)); 
     } 
    } 
});