Android e impostazione di larghezza e altezza a livello di codice in unità dp


304

Sto facendo:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

Secondo i documenti, le unità per la larghezza e l'altezza (entrambe 65 sopra) sono "pixel". Come imponi che questo sia pixel indipendente dal dispositivo o "dp"?

Risposte:


541

Dovrai convertirlo da dps in pixel usando il fattore di scala del display.

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
La conversione corretta è (int) (scala dps * + 0,5f). Questa è la formula che utilizziamo in tutto il framework.
Romain Guy

8
La formula è nei documenti. Per ulteriori letture, vai alla sezione 3 di developer.android.com/guide/practices/…
SK9

34
@RomainGuy, ti invitiamo a aggiungere una funzione di utilità per l'API per convertire da dpa px? Grazie.
AlikElzin-Kilaka,

3
che cos'è dps qui? sto ottenendo l'errore "dps non può essere risolto in una variabile"? che tipo di "dps" deve dichiarare ??
Deepak,

5
La variabile "dps" è il valore di input che si desidera convertire.
Robby Pond,

233

So che questa è una vecchia domanda, tuttavia ho trovato un modo molto più accurato di fare questa conversione.

Giava

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

Kotlin

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
Ben fatto per scoprire come farlo. Non sono un fan di ripetere una formula in diversi posti! Grazie.
darrenp,

2
In caso contrario, crea la funzione con la formula
Sayka,

1
@Kenobi Fa la conversione per te da DP a PX. Quanto 65sopra è il valore DP che vuoi convertire in PX
drspaceboo

7
Questa dovrebbe essere la risposta accettata, non quella attuale in cui questi numeri (0,5) provengono magicamente da nessuna parte
Johny19

1
@ Johny19 Lo 0,5 non è magico. È solo come arrotondare un numero in virgola mobile all'intero più vicino invece di troncarlo. Vedi il mio commento sulla risposta di Robby Pond per maggiori dettagli.
MarredCheese,

38

Osservando le tue esigenze, esiste anche una soluzione alternativa. Sembra che tu conosca le dimensioni in dp al momento della compilazione, quindi puoi aggiungere una voce dimen nelle risorse. Quindi è possibile eseguire una query sulla voce dimen e verrà automaticamente convertita in pixel in questa chiamata:

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

E il tuo dimens.xml avrà:

<dimen name="dimen_entry_in_dp">72dp</dimen>

Estendendo questa idea, puoi semplicemente memorizzare il valore di 1dp o 1sp come una voce dimen e interrogare il valore e usarlo come moltiplicatore. Usando questo approccio isolerai il codice dalle cose matematiche e farai affidamento sulla libreria per eseguire i calcoli.


Si noti che il valore restituito è in realtà un int, quindi viene lanciato su un float.
Coray:

Questa è una cattiva risposta perché deve essere dinamico
Johny19

37

Il modo più semplice (e funziona anche da API 1) che è stato testato è:

getResources().getDimensionPixelSize(R.dimen.example_dimen);

Dalle documentazioni:

Recupera una dimensione per un particolare ID risorsa da utilizzare come dimensione in pixel non elaborati. È uguale a getDimension (int), tranne per il valore restituito convertito in pixel interi da utilizzare come dimensione. Una conversione delle dimensioni comporta l'arrotondamento del valore di base e la garanzia che un valore di base diverso da zero abbia una dimensione di almeno un pixel.

Sì, arrotondando il valore ma non è molto male (solo in valori dispari su dispositivi hdpi e ldpi è necessario aggiungere un piccolo valore quando ldpi non è molto comune) Ho testato in un dispositivo xxhdpi che converte 4dp in 16 (pixel) e questo è vero.

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.