2011-02-16 7 views

Respuesta

26

En una vista:

DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); 
float dp = 20f; 
float fpixels = metrics.density * dp; 
int pixels = (int) (fpixels + 0.5f); 

En una Actividad, por supuesto, deja el getContext(). Para convertir desde píxeles escalados (sp) a píxeles, simplemente use metrics.scaledDensity en lugar de metrics.density.

EDIT: Como @Santosh's answer puntos out, se puede hacer lo mismo utilizando la clase de utilidad TypedValue:

DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); 
float dp = 20f; 
float fpixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, metrics); 
int pixels = Math.round(fpixels); 

Para sp, sustituir TypedValue.COMPLEX_UNIT_SP para TypedValue.COMPLEX_UNIT_DIP.

Internamente, applyDimension() hace exactamente el mismo cálculo que mi código anterior. Qué versión usar es una cuestión de tu estilo de codificación.

+2

¿por qué se agregan 0,5? – pankajagarwal

+3

Para redondear, esto es lo que hace el marco. Esto asegura que el tamaño nunca será 0px. –

+0

gracias, parece bastante lógico ahora :) – pankajagarwal

4

Puede utilizar

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, getResources().getDisplayMetrics()); 

ahora, el valor de pixels es equivalente a 20dp

El TypedValue contiene otros métodos similares que ayudan en la conversión

Cuestiones relacionadas