2012-07-30 20 views

Respuesta

14

Se utiliza píxeles, pero se puede convertir a DP utilizando este código:

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

Gracias por responder tan rápido. – marzipankaiser

+0

@Todd Davies: ¿cómo puedo usar esto dentro de una clase de vista personalizada? No se puede usar getWindowManager() – Neil

+1

@Neil: puede usar el método de View 'getContext()' para obtener 'Context', después de eso puede llamar a' Context.getSystemService (Context.WINDOW_SERVICE) 'para obtener' WindowManager'. Más sobre esto aquí http://developer.android.com/reference/android/view/WindowManager.html. – Tzoiker

1

Estos métodos incluyen DisplayMetrics que se puede añadir en el futuro SDK de Android.

píxeles a mojar:

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

Dip de píxeles:

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

La forma más fácil de obtener un valor de píxeles para tales métodos es simplemente definir la DP apropiado o valor SP en los Dimens archivo .xml y recupérelo así:

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

En realidad tiene 3 métodos disponibles para usar dependiendo de sus necesidades:

  • getDimension() Devuelve un flotador en píxeles.

  • getDimensionPixelSize() Devuelve un int en píxeles. Esto es lo mismo que getDimension(), excepto que el valor devuelto se REDONDEA al valor entero más cercano y garantiza que un valor de entrada distinto de cero da como resultado un valor de salida distinto de cero (por ejemplo, 0.1 se devuelve como 1, no como 0).

  • getDimensionPixelOffset() Devuelve un int en píxeles. Esto es lo mismo que getDimension(), excepto que el valor devuelto es TRUNCATED (es decir, redondeado hacia abajo). El resultado puede ser cero.

+1

Esta es la mejor respuesta; funciona correctamente en todos los dispositivos existentes Y continuará funcionando en dispositivos futuros (a Todd Davies le faltan las nuevas densidades, como xhdpi, xxhdpi, etc.). Esto también es más flexible, puede proporcionar un archivo dimens.xml alternativo para diferentes tamaños de pantalla (tabletas, etc.) o cambiar entre dp y sp, según sea necesario. – NaxyMatt

+1

Sí, la respuesta de TheIT es la mejor respuesta, como dice WanderingLinguist, porque la solución de Todd Davies debe actualizarse para incluir también xHigh, xxhigh y xxxhigh y tv cases y los casos que aparezcan en el futuro que sean complicados y se rompan fácilmente, en su lugar de la respuesta de TheIT que funcionará ahora y en el futuro, incluso si lo que los dispositivos vendrán y la solución funciona, ya que Android está planificado para manejar toda la densidad de dispositivos reales. –

Cuestiones relacionadas