2012-12-27 8 views
6

Non riesco a trovare da nessuna parte c'è una menzione di come viene misurato getTextSize() in Textview. Dai test visivi non sembra includere i discendenti, ma sembra includere ascender. Sembra che non inizi esattamente dalla linea di base.TextView Android getTextSize() include discendenti, ascendenti

http://en.wikipedia.org/wiki/Descender

Questa è la menzione più vicino di esso, ma Romain Guy da Google solo ignora che una parte della questione.

http://www.mail-archive.com/[email protected]/msg08514.html

Come ho bisogno di questo come sto usando Composto drawable e ho bisogno di essere in grado di allineare il drawable al testo su dispositivi diversi.

Ecco il codice che ho usato per testare su un composto drawable un cerchio che tocca i bordi

tvData.setTextSize(TypedValue.COMPLEX_UNIT_PX, 100); 
tvData.setText("agB5ãÂ"); 

int size = (int)tvData.getTextSize(); 
Drawable img = getResources().getDrawable(R.drawable.circle_white_full_72).mutate(); 
img.setBounds(0 , 0 , size , size); 
tvData.setCompoundDrawables(null, null, img, null); 

Ecco il risultato http://i.imgur.com/zUEzB.png

come si può vedere che non sembra utilizzare i discendenti e ascendenti.

Ecco l'immagine drawable, se gli altri vogliono testare http://i.imgur.com/Yhf8b.png

Quando si cambia l'immagine al 80% della dimensione del testo utilizzando

int size = (int)tvData.getTextSize() *80/100; 

Ecco il risultato, con l'immagine trasposta su cima all'immagine al 100%. Forse setCompoundrawables sta facendo di essa la propria scala

enter image description here

ho provato la misurazione punti medi del tipo di carattere e disegnabile ed è fuori. Ecco un'immagine che la evidenzia enter image description here

Infine ho spostato i 50 pixel disegnabili a sinistra, quindi ho misurato l'output ed era pari a metà dell'altezza della linea di base del testo del carattere sulla linea di base, poiché setTextSize era impostato su 100px.

Android deve utilizzare un altro layout per ridimensionare e posizionare il composto estraibile. Forse dovrei creare un'altra domanda per questo. Ecco un'immagine che evidenzia la linea di base rispetto alla linea di base. enter image description here

+0

Conosco l'altezza del font per indicare "include ascender, ma non discender", ma non riesco a trovare un riferimento autorevole con cui rispondere alla tua domanda. Quindi per ora, le prove aneddotiche dovranno fare: ho sempre capito "altezza del carattere" per indicare ciò che descrivi. – Barend

+0

Vieni a pensarci, "dalla linea di base alla linea di base" è equivalente e ha più senso all'interno del dominio. – Barend

+0

@BarendGarvelink Credo che sarebbe in testa. – kcoppock

risposta

3

Da alcuni test di luce, sembra essere dalla salita alla discesa (dimensione del testo = discesa - salita). Ha fatto un po 'di debug con un TextPaint per verificare, e solo per essere un po' più specifico, l'ho fatto:

Paint.FontMetricsInt metrics; 
for(int i = 1; i < 100; i++) { 
    mTextPaint.setTextSize(i); 
    metrics = mTextPaint.getFontMetricsInt(); 
    if((metrics.descent - metrics.ascent) != i) Log.v("type", "Not equal"); 
} 

Ed è rimasta fedele per ogni valore.

+0

ecco il test che ho effettuato tvData.setTextSize (TypedValue.COMPLEX_UNIT_PX, 100); \t \t tvData.setText ("agB5ãÂ"); \t \t \t \t int size = (int) tvData.getTextSize(); \t \t Drawable img = getResources(). GetDrawable (R.drawable.circle_white_full_72) .mutate(); \t \t img.setBounds (0, 0, dimensione, dimensione); \t \t tvData.setCompoundDrawables (null, null, img, null); Ecco il risultato http://i.imgur.com/zUEzB.png come puoi vedere non sembra utilizzare i discensori e gli ascendenti. – pt123

+0

Ho aggiunto il mio codice di test nella domanda principale – pt123

+1

'metrics.descent - metrics.ascent' Questo è proprio quello di cui avevo bisogno! – amram99