2012-07-30 24 views

risposta

14

utilizza pixel, ma è possibile convertirlo in dp utilizzando questo codice:

double getDPFromPixels(double pixels) { 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    switch(metrics.densityDpi){ 
    case DisplayMetrics.DENSITY_LOW: 
       pixels = pixels * 0.75; 
       break; 
    case DisplayMetrics.DENSITY_MEDIUM: 
       //pixels = pixels * 1; 
       break; 
    case DisplayMetrics.DENSITY_HIGH: 
       pixels = pixels * 1.5; 
       break; 
    } 
    return pixels; 
} 
+0

Grazie per aver risposto così in fretta. – marzipankaiser

+0

@Todd Davies: come posso usarlo all'interno di una classe View personalizzata? Non è possibile utilizzare getWindowManager() – Neil

+1

@Neil - È possibile utilizzare il metodo View 'getContext()' per ottenere il 'Contesto', dopodiché è possibile chiamare' Context.getSystemService (Context.WINDOW_SERVICE) 'per ottenere' WindowManager'. Maggiori informazioni su questo qui http://developer.android.com/reference/android/view/WindowManager.html. – Tzoiker

1

Questi metodi includono DisplayMetrics che può essere aggiunto in futuro Android SDK.

Pixel immergere:

public static float getDipFromPixels(float px) { 
     return TypedValue.applyDimension(
       TypedValue.COMPLEX_UNIT_PX, 
       px, 
       Resources.getSystem().getDisplayMetrics() 
     ); 
} 

Dip ai pixel:

public static float getPixelsFromDip(float dip) { 
     return TypedValue.applyDimension(
       TypedValue.COMPLEX_UNIT_DIP, 
       dip, 
       Resources.getSystem().getDisplayMetrics() 
     ); 
} 
8

Il modo più semplice per ottenere un valore px per tali metodi è quello di definire semplicemente la dp appropriato o valore sp nelle dimens file .xml e recuperarlo in questo modo:

int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp); 

In realtà sono disponibili 3 metodi da utilizzare in base a le tue esigenze:

  • getDimension() Restituisce un float in pixel.

  • getDimensionPixelSize() Restituisce un pixel int. È uguale a getDimension(), tranne che il valore restituito viene ARROTOLATO al valore intero più vicino e garantisce che un valore di input diverso da zero produca un valore di output diverso da zero (ad esempio, 0.1 viene restituito come 1, non 0).

  • getDimensionPixelOffset() Restituisce un int in pixel. Questo è lo stesso di getDimension(), ad eccezione del fatto che il valore restituito è TRONCATO (cioè arrotondato per difetto). Il risultato potrebbe essere zero.

+1

Questa è la migliore risposta; funziona correttamente su tutti i dispositivi esistenti e continuerà a funzionare su dispositivi futuri (la risposta di Todd Davies non ha le densità più recenti come xhdpi, xxhdpi e così via). Questo è anche più flessibile è possibile fornire un file dimens.xml alternativo per diverse dimensioni dello schermo (tablet, ecc.) O passare da dp a sp secondo necessità. – NaxyMatt

+1

Sì, questa risposta di TheIT è la migliore risposta come dice WanderingLinguist, perché la soluzione di Todd Davies dovrebbe essere aggiornata per includere anche xHigh, xxhigh e xxxhigh e tv casi e mai casi in futuro che mostrino che è complicato e sarà facilmente risolto, della risposta di TheIT che funzionerà ora e in futuro anche se i dispositivi verranno mai e la soluzione funziona come Android è stato progettato per gestire la densità di tutti i dispositivi re. –

Problemi correlati