21

Sto cercando un metodo in Android che utilizzi un input (testo, dimensione_di_modello, larghezza_dispositivo) e in base a questi calcoli restituirà l'altezza necessaria per visualizzare un testo particolare?Come misurare l'altezza di TextView in base alla larghezza del dispositivo e alle dimensioni del carattere?

Sto impostando una visualizzazione di testo/altezza runtime webview in base al suo contenuto, sono a conoscenza del contenuto di warp ma non posso utilizzarlo nel mio caso a causa di un problema di altezza minima della vista web.

Quindi sto cercando di calcolare l'altezza e in base a ciò sto impostando l'altezza di visualizzazione.

Ho provato con i seguenti modi

Paint paint = new Paint(); 
paint.setTextSize(text.length()); 
Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, 1, bounds); 
mTextViewHeight= bounds.height(); 

Così uscita è

1) "Ciao Mondo" restituisce un'altezza di 13 per carattere 15

2) "L'ultima versione di Jelly Bean è qui, con ottimizzazioni delle prestazioni "restituisce un'altezza 16 per font 15

Quindi ho provato con

Paint paint = new Paint(); 
paint.setTextSize(15); 
paint.setTypeface(Typeface.SANS_SERIF); 
paint.setColor(Color.BLACK); 

Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, text.length(), result); 

Paint.FontMetrics metrics = brush.getFontMetrics(); 
int totalHeight = (int) (metrics.descent - metrics.ascent + metrics.leading); 

Così uscita è

1) "Ciao Mondo" restituisce un'altezza di 17 per carattere 15

2) "L'ultima versione di Jelly Bean è qui, con ottimizzazioni delle prestazioni" restituisce un'altezza di 17 per font 15

se ho impostato questi valori per la mia vista, quindi il suo testo è stato tagliato, non mostra tutto il contenuto.

Ancora una volta sembra ok su alcuni tavoli perché ha una larghezza grande ma non sul telefono.

C'è un modo per calcolare l'altezza in base al contenuto?

risposta

44
public static int getHeight(Context context, String text, int textSize, int deviceWidth) { 
    TextView textView = new TextView(context); 
    textView.setText(text); 
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 
    int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth, MeasureSpec.AT_MOST); 
    int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
    textView.measure(widthMeasureSpec, heightMeasureSpec); 
    return textView.getMeasuredHeight(); 
} 

Se textSize non è dato in pixel, modificare la prima paramter di setTextSize().

+0

Risposta stupenda. – Noundla

+0

qual è la dimensione del testo in pratica? –

7

Paint.getTextBounds() restituisce non quello che ti aspetteresti. I dettagli sono here.

Invece, si può provare in questo modo:

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight(); 
+0

Grazie. Questo è ciò che dovrebbe essere usato per riassemblare l'altezza del TextView nativo durante il disegno del testo. –

+0

Che dire di un font personalizzato? –

5

Ho un metodo più semplice per conoscere la vera altezza di una riga prima di essere verniciato, non so se questo aiuto voi ragazzi, ma la mia soluzione per ottenere l'altezza di una linea è indipendente dalla altezza del layout, basta prendere le metriche di carattere in questo modo:

myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top) 

con che otteniamo l'altezza reale che i font prenderanno dal TextView di essere dipinto. Questo non ti dà un int, ma puoi fare un Math.round per ottenere un valore vicino.

Problemi correlati