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.