Come assegnare la dimensione del testo di valore sp utilizzando il codice Java
Domanda
Se assegno un valore intero per cambiare una certa dimensione testo di un TextView
utilizzando codice Java, il valore viene interpretato come pixel (px
).
Ora qualcuno sa come assegnare in sp
?
Soluzione
Esempio:
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);
Altri suggerimenti
È possibile utilizzare un oggetto DisplayMetrics
per aiutare a convertire tra i pixel e pixel in scala con la scaledDensity
attributo .
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity;
approccio Cleaner e più riutilizzabile è
definire la dimensione del testo in un file all'interno della directory dimens.xml
res/values/
:
</resources>
<dimen name="text_medium">14sp</dimen>
</resources>
e poi applicarlo alla TextView
:
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));
In base al codice fonte di setTextSize
:
public void setTextSize(int unit, float size) {
Context c = getContext();
Resources r;
if (c == null)
r = Resources.getSystem();
else
r = c.getResources();
setRawTextSize(TypedValue.applyDimension(
unit, size, r.getDisplayMetrics()));
}
I costruire questa funzione per calulating qualsiasi demension ai pixel:
int getPixels(int unit, float size) {
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
return (int)TypedValue.applyDimension(unit, size, metrics);
}
Dove unità è qualcosa di simile TypedValue.COMPLEX_UNIT_SP
.
Per impostazione predefinita setTextSize, senza unità di lavoro in SP (scale pixel)
public void setTextSize (float size)
Added in API level 1
Set the default text size to the given value, interpreted as "scaled pixel" units. This
size is adjusted based on the current density and user font size preference.
Grazie @ John Leehey e @PeterH:
desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);
Il fatto è che se si definisce R.dimen.desired_sp a 25 nel vostro dimen.xml
- Il dispositivo non-HD: desiredSp è ancora 25, la densità = 1
- Il dispositivo HD (come Nexus 7 2a generazione): desiredSp diventa 50 ish, densità = 2
Quando la risposta accettata non funziona (per esempio quando si tratta di Paint) è possibile utilizzare:
float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
context.getResources().getDimension(R.dimen.text_size_in_dp))
Questo è il codice per il convertito PX a SP Formato. 100% Opere
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);
Dopo aver provato tutte le soluzioni e nessuno dare risultati accettabili (forse perché stavo lavorando su un dispositivo con predefinite caratteri molto grandi), i seguenti ha lavorato per me (COMPLEX_UNIT_DIP = dispositivo Pixel Indipendenti):
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
Dal livello Api 1, è possibile utilizzare il public void setTextSize (float size)
metodo .
Dalla documentazione:
Imposta la dimensione del testo predefinito per il valore dato, interpretato come "in scala pixel" unità. Questa dimensione viene regolato in base alla densità di corrente e utente dimensione del carattere preferenza.
Parametri: dimensioni -> float:. La dimensione dei pixel in scala
Così si può fare semplice:
textView.setTextSize(12); // your size in sp
Nel caso in cui se qualcuno è alla ricerca di modo Kotlin, si può fare
view.textSize = 12f