2011-11-28 9 views
87

Voglio calcolare dp da px a livello di programmazione. Come farlo? ottengo risoluzione da:Come calcolare dp da pixel in Android a livello di programmazione

DisplayMetrics displaymetrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
ht = displaymetrics.heightPixels; 
wt = displaymetrics.widthPixels; 
+0

Sapete la dimensione fisica dello schermo? 7 "nel diemetro ad esempio –

+1

Il fastidioso quando è contrassegnato come duplicato, ma nessun collegamento al duplicato è allegato alla notifica di duplicazione –

risposta

32

Questo dovrebbe dare il pixel di conversione -> DP:

DisplayMetrics displaymetrics = new DisplayMetrics(); 
int dp = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, myPixels, displaymetrics); 
+29

** Quello che stai facendo è una conversione dp-> px. ** [Il i documenti per 'TypedValue.applyDimension'] (http://developer.android.com/reference/android/util/TypedValue.html#applyDimension%28int,%20float,%20android.util.DisplayMetrics%29) dicono che il primo argomento è l'unità per convertire _from_, e il valore di ritorno è il "valore in virgola mobile complesso moltiplicato per le metriche appropriate a seconda della sua unità." 'applyDimension' non può essere utilizzato per convertire px-> dp, per farlo devi farlo come descritto qui: http://stackoverflow.com/a/17880012/504611 –

+1

divertente! Anche se non è la vera risposta, ma è comunque utile –

1
DisplayMetrics dm = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(dm); 
     String str_ScreenSize = "The Android Screen is: " 
        + dm.widthPixels 
        + " x " 
        + dm.heightPixels; 

     TextView mScreenSize = (TextView) findViewById(R.id.strScreenSize); 
     mScreenSize.setText(str_ScreenSize); 

u può cheeck fuori ..

o questo può anche aiutare u

int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
        (float) 123.4, getResources().getDisplayMetrics()); 
51
float ht_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ht, getResources().getDisplayMetrics()); 
float wt_px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, wt, getResources().getDisplayMetrics()); 
+17

La domanda riguarda "px -> dp", ma il codice è simile a "dp -> px "?? (nota il suffisso '_px' in LHS) – Palani

+0

Questo è con invertire la direzione opposta alla domanda. –

+0

in qualsiasi modo è possibile modificare il primo parametro in 'TypedValue.COMPLEX_UNIT_PX' da' TypedValue.COMPLEX_UNIT_DIP' in modo da convertire 'dp-> px' – DeltaCap

243

Tutte le risposte qui mostrano una conversione DP> px piuttosto che PX-> dp, che è ciò che ha chiesto il PO. Si noti che TypedValue.applyDimension non può essere utilizzato per convertire px-> dp, per cui è necessario utilizzare il metodo descritto qui: https://stackoverflow.com/a/17880012/504611 (citato di seguito per comodità).

senza contesto, i metodi statici eleganti:

public static int dpToPx(int dp) 
{ 
    return (int) (dp * Resources.getSystem().getDisplayMetrics().density); 
} 

public static int pxToDp(int px) 
{ 
    return (int) (px/Resources.getSystem().getDisplayMetrics().density); 
} 
+30

Questa dovrebbe essere la risposta accettata – Goldorak84

+0

è sicuramente la migliore risposta che ho trovato su questo problema. È utilizzabile in ogni classe. – user3290180

+0

Questa è la risposta corretta: return px/(context.getResources(). GetDisplayMetrics(). DensityDpi/160f) –

Problemi correlati