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?

È stato utile?

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

  1. Il dispositivo non-HD: desiredSp è ancora 25, la densità = 1
  2. 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top