Come assegnare la dimensione del testo nel valore sp usando il codice java


205

Se assegno un valore intero per modificare una determinata dimensione del testo di un TextViewcodice Java utilizzando, il valore viene interpretato come pixel ( px).

Ora qualcuno sa come assegnarlo sp?

Risposte:


535

http://developer.android.com/reference/android/widget/TextView.html#setTextSize%28int,%20float%29

Esempio:

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 65);

19
Poiché SP sta per pixel ridimensionati , dovrai ridurre le dimensioni in base alla densità dello schermo. È facile come segue: SCREEN_DENSITY = getResources (). GetDisplayMetrics (). Densità; yourView.setTextSize (TypedValue.COMPLEX_UNIT_SP, (wishTextHeightInSP / SCREEN_DENSITY);
PeteH,

4
La soluzione non ha funzionato per me quando ho cercato di raccogliere SP dalle risorse. PeteH, mi hai portato sulla strada giusta! Quanto segue ha funzionato per me: ... float textSize = getResources (). GetDimension (R.dimen.textsize) / getResources (). GetDisplayMetrics (). Density; myTextView.setTextSize (TypedValue.COMPLEX_UNIT_SP, textSize);
P Kuijpers,

52
Se ottieni le dimensioni sp dalle tue risorse, dovresti utilizzare COMPLEX_UNIT_PX, in questo modo: textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.my_text_size_in_sp));Ottenere le dimensioni del testo in questo modo convertirà già SP in PX, tenendo conto sia della densità dello schermo che del fattore di scala del testo.
Ciske Boekelo,

La soluzione fornita ha funzionato per me come mostrato. Grazie!
Martin Erlic,

35

È possibile utilizzare un DisplayMetricsoggetto per aiutare a convertire tra pixel e pixel ridimensionati con l' scaledDensityattributo .

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
pixelSize = (int)scaledPixelSize * dm.scaledDensity; 

1
Ciò terrà conto del fattore di ridimensionamento della densità dello schermo ma non del fattore di scala del testo che l'utente può aver specificato tramite le impostazioni. Credo che la soluzione di @ Santosh terrà conto di questo fattore, mentre questo snippet no.
greg7gkb,

3
Ma a volte non sei in grado di usare il metodo di @Santosh per esempio quando scrivi un Paint in una tela. Quindi questo metodo è utile e funziona abbastanza bene, quindi pollice in alto per queste due risposte!
Elimina il

1
@ greg7gkb non è vero, la documentazione dice che verrà presa in considerazione may be adjusted in smaller increments at runtime based on a user preference for the font sizela dimensione del carattere .
Luca Vitucci,

32

È un approccio più pulito e riutilizzabile

definire la dimensione del testo nel dimens.xmlfile all'interno della res/values/directory:

</resources>
   <dimen name="text_medium">14sp</dimen>
</resources>

e quindi applicalo a TextView:

textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, context.getResources().getDimension(R.dimen.text_medium));

20

Basato sul codice sorgente 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()));
}

Costruisco questa funzione per calcolare qualsiasi demensione in pixel:

int getPixels(int unit, float size) {
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    return (int)TypedValue.applyDimension(unit, size, metrics);
}

Dove l'unità è qualcosa di simile TypedValue.COMPLEX_UNIT_SP.


l'ultimo metodo è un salvavita.
Ajibola,

12

Per impostazione predefinita setTextSize, senza unità funzionano in SP (ridimensiona il 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.

11

Grazie @ John Leehey e @ Peter:

desiredSp = getResources().getDimension(R.dimen.desired_sp);
density = getResources().getDisplayMetrics().density;
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, desiredSp / density);

Il fatto è che definisci R.dimen.desired_sp a 25 nel tuo dimen.xml

  1. Su un dispositivo non HD: desiderataSp è ancora 25, densità = 1
  2. Su dispositivo HD (come Nexus 7 2nd Generation): desiderataSp diventa 50 ish, densità = 2

11

Quando la risposta accettata non funziona (ad esempio quando si tratta di Paint) è possibile utilizzare:

float spTextSize = 12;
float textSize = spTextSize * getResources().getDisplayMetrics().scaledDensity;
textPaint.setTextSize(textSize);

ok, funziona, ecco cosa voglio, grazie pomber per averlo condiviso!
Mr. Lemon

8
semeTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, 
                       context.getResources().getDimension(R.dimen.text_size_in_dp))

Spiegare come sarà utile impostare la dimensione del testo come valore in pixel (COMPLEX_UNIT_PX). OP vuole "assegnare la dimensione del testo al valore sp"
Bö macht Blau,

se lo usi COMPLEX_UNIT_PXdevi dividere la densità.
William Hu,

Penso che sia perché getDimension ha già convertito 'dp' in 'px'
Ali Mousavi Kherad

3

Questo è il codice per convertire il formato PX in SP . 100% funziona

view.setTextSize(TypedValue.COMPLEX_UNIT_PX, 24);

0

Dopo aver provato tutte le soluzioni e nessuna con risultati accettabili (forse perché stavo lavorando su un dispositivo con caratteri molto grandi predefiniti), il seguente ha funzionato per me (COMPLEX_UNIT_DIP = Pixel indipendenti dal dispositivo):

textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);

0

Dal livello Api 1, è possibile utilizzare il public void setTextSize (float size)metodo

Dalla documentazione:

Imposta la dimensione del testo predefinita sul valore dato, interpretato come unità di "pixel ridimensionati". Questa dimensione viene regolata in base alla densità corrente e alle preferenze sulla dimensione del carattere dell'utente.

Parametri: size -> float: la dimensione in pixel della scala.

Quindi puoi semplicemente fare:

textView.setTextSize(12); // your size in sp
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.