Come determinare la larghezza dello schermo in termini di dp o dip in fase di esecuzione in Android?


194

Devo codificare il layout dei widget Android usando dip / dp (nei file java). In fase di esecuzione se codice

int pixel=this.getWindowManager().getDefaultDisplay().getWidth(),;

questo restituisce la larghezza dello schermo in pixel (px). Per convertirlo in dp, ho codificato:

int dp =pixel/(int)getResources().getDisplayMetrics().density ;

questo non sembra restituire la risposta corretta. Ho creato l'emulatore di WVGA800 la cui risoluzione dello schermo è 480 per 800. Quando esegui l'emulatore e consenti al codice di stampare i valori di pixel e dp, è arrivato a 320 in entrambi. Questo emulatore ha una risoluzione di 240 dpi il cui fattore di scala sarebbe 0,75.

Risposte:


378

Prova questo

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics ();
display.getMetrics(outMetrics);

float density  = getResources().getDisplayMetrics().density;
float dpHeight = outMetrics.heightPixels / density;
float dpWidth  = outMetrics.widthPixels / density;

O

Grazie @ Tomáš Hubálek

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();    
float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

91
Perché è necessario chiamare WindowManager? Che mi dici di questo codice? DisplayMetrics displayMetrics = resources.getDisplayMetrics (); float screenWidthDp = displayMetrics.widthPixels / displayMetrics.density;
Tomáš Hubálek,

2
Questo non ha funzionato per me usando uno schermo ad altissima densità. Era come se avesse solo una piccola parte dello schermo. Questa soluzione ha funzionato per me: stackoverflow.com/a/18712361/956975 . Display = getWindowManager () getDefaultDisplay (); Dimensione punto = nuovo Punto (); display.getSize (dimensioni); int width = size.x; int height = size.y;
Marienke,

1
@dsdsdsdsd: il contesto è qualsiasi istanza della classe Context. In particolare, Activity è una sottoclasse di Context (quindi usatela in Activity e getActivity () in un frammento). Applicazione e servizio sono anche sottoclassi del contesto.
François POYER,

112

Mi sono imbattuto in questa domanda da Google e in seguito ho trovato una soluzione semplice valida per API> = 13.

Per riferimenti futuri:

Configuration configuration = yourActivity.getResources().getConfiguration();
int screenWidthDp = configuration.screenWidthDp; //The current width of the available screen space, in dp units, corresponding to screen width resource qualifier.
int smallestScreenWidthDp = configuration.smallestScreenWidthDp; //The smallest screen size an application will see in normal operation, corresponding to smallest screen width resource qualifier.

Vedi riferimento alla classe di configurazione

Modifica: come notato da Nick Baicoianu, questo restituisce la larghezza / altezza utilizzabili dello schermo (che dovrebbero essere quelli interessanti nella maggior parte degli usi). Se sono necessarie le dimensioni effettive del display, attenersi alla risposta superiore.


23
Una differenza importante tra l'utilizzo di ScreenWidthDp / screenHeightDp di Configuration vs DisplayMetrics widthPixels / heightPixels è la configurazione che restituisce le dimensioni di visualizzazione utilizzabili (meno la barra di stato ecc.), Mentre DisplayMetrics restituisce le dimensioni di schermo intero.
Nick Baicoianu,

Questo è solo per API livello 13 in su
ono

Per aggiungere al commento di @ NickBaicoianu, entrambi i metodi getConfiguration () e getDisplayMetrics () funzionano in modalità multi-finestra. cioè le dimensioni riflettono quella della finestra, non lo schermo.
nmw,

7

Manca un valore di densità predefinito di 160.

    2 px = 3 dip if dpi == 80(ldpi), 320x240 screen
    1 px = 1 dip if dpi == 160(mdpi), 480x320 screen
    3 px = 2 dip if dpi == 240(hdpi), 840x480 screen

In altre parole, se si progetta un layout con larghezza pari a 160 dpi in modalità verticale, sarà la metà dello schermo su tutti i dispositivi ldpi / mdpi / hdpi (tranne i tablet, penso)


Quello a cui hai risposto è il ragionamento logico alla base della mia domanda. Lo capisco. Come dovrei codificare questo in Java in modo che in fase di esecuzione qualunque sia la risoluzione dello schermo, la larghezza dpi corretta sia selezionata dal codice?
Khushboo,

Spero di aver capito bene questa volta :) Utilizzare DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);in Attività. Quindi, outMetrics.densityti fornirà il fattore di scala del dispositivo corrente, come indicato nei documenti
Mykhailo Gaidai,

6

Che ne dici di usare questo invece?

final DisplayMetrics displayMetrics=getResources().getDisplayMetrics();
final float screenWidthInDp=displayMetrics.widthPixels/displayMetrics.density;
final float screenHeightInDp=displayMetrics.heightPixels/displayMetrics.density;

6
DisplayMetrics displayMetrics = new DisplayMetrics();

getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

int width_px = Resources.getSystem().getDisplayMetrics().widthPixels;

int height_px =Resources.getSystem().getDisplayMetrics().heightPixels;

int pixeldpi = Resources.getSystem().getDisplayMetrics().densityDpi;


int width_dp = (width_px/pixeldpi)*160;
int height_dp = (height_px/pixeldpi)*160;

8
Considera di dare qualche spiegazione
bigbounty,

5

Risposta in kotlin:

  context?.let {
        val displayMetrics = it.resources.displayMetrics
        val dpHeight = displayMetrics.heightPixels / displayMetrics.density
        val dpWidth = displayMetrics.widthPixels / displayMetrics.density
    }

4

Semplificato per Kotlin:

val widthDp = resources.displayMetrics.run { widthPixels / density }
val heightDp = resources.displayMetrics.run { heightPixels / density }

2

Ottieni larghezza e altezza dello schermo in termini di DP con qualche buona decorazione:

Passaggio 1: creare l'interfaccia

public interface ScreenInterface {

   float getWidth();

   float getHeight();

}

Passaggio 2: creare una classe implementatore

public class Screen implements ScreenInterface {
    private Activity activity;

    public Screen(Activity activity) {
        this.activity = activity;
    }

    private DisplayMetrics getScreenDimension(Activity activity) {
        DisplayMetrics displayMetrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        return displayMetrics;
    }

    private float getScreenDensity(Activity activity) {
        return activity.getResources().getDisplayMetrics().density;
    }

    @Override
    public float getWidth() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.widthPixels / getScreenDensity(activity);
    }

    @Override
    public float getHeight() {
        DisplayMetrics displayMetrics = getScreenDimension(activity);
        return displayMetrics.heightPixels / getScreenDensity(activity);
    }
} 

Passaggio 3: ottieni larghezza e altezza nell'attività:

Screen screen = new Screen(this); // Setting Screen
screen.getWidth();
screen.getHeight();

Questo restituisce altezza e larghezza in pixel o dp?
Taslim Oseni,

come chiamato .densità è per questo che ti dà in dp
Ali Azaz Alam

Non credo sia una buona idea aggiungere toni di codice alla tua app per risolvere un semplice compito
Ruslan Berozov,

Signore, dipende da te se implementare la classe o codificarla direttamente. Dalla classe definita è possibile estrarre facilmente il codice per l'implementazione diretta.
Ali Azaz Alam,

0

Se vuoi solo conoscere la larghezza dello schermo, puoi semplicemente cercare la "larghezza dello schermo più piccola" nelle opzioni dello sviluppatore. Puoi persino modificarlo.


0

Prova questo:

Display display   = getWindowManager().getDefaultDisplay();
Point displaySize = new Point();
display.getSize(displaySize);
int width  = displaySize.x;
int height = displaySize.y;

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.