Cómo convertir DP, PX, SP entre sí, especialmente DP y SP?

Conozco la diferencia entre DP , SP y PX . Y después de buscar este tema, no encontré nada que me satisfaga por completo. Tal vez esta publicación sea un duplicado, pero aún quiero saber cuál es la fórmula de convertir de DP a PX , y de DP a SP , de SP a PX , de PX a SP , de SP a DP , de DP a SP ? He conocido algunos códigos para hacer esto, pero son imperfectos.

DP a PX:

public static int dpToPx(float dp, Context context) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics()); } 

SP a PX:

 public static int spToPx(float sp, Context context) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics()); } 

DP a SP:

 public static int dpToSp(float dp, Context context) { return (int) (dpToPx(dp, context) / context.getResources().getDisplayMetrics().scaledDensity); } 

A la respuesta aceptada le faltan algunas conversiones útiles.

SP a PX

 float sp = 20; float px = sp * getResources().getDisplayMetrics().scaledDensity; 

o

 float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, getResources().getDisplayMetrics()); 

PX a SP

 float px = 70; float sp = px / getResources().getDisplayMetrics().scaledDensity; 

DP a PX

 float dp = 20; float px = dp * getResources().getDisplayMetrics().density; 

o

 float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()); 

PX a DP

 float px = 70; float dp = px / getResources().getDisplayMetrics().density; 

Notas

  • Las carrozas que elegí arriba ( 20 y 70 ) fueron valores arbitrarios. Puede enchufar diferentes números si lo desea.
  • px refiere a los píxeles. La cantidad de píxeles que tiene un dispositivo por pulgada de espacio en la pantalla se denomina densidad.
  • dp significa píxeles independientes de densidad. Es decir, no importa qué dispositivo se use, el tamaño real debería ser el mismo. Por ejemplo, si configuro una vista de 100 dp ancho, tendrá el mismo ancho en un nuevo teléfono de alta densidad que en un teléfono viejo de baja densidad. (Si hubiera configurado el ancho a 100 px , por otro lado, parecería grande en un teléfono de baja densidad y pequeño en un teléfono de alta densidad.) La densidad se mide en puntos por pulgada (DPI). La fórmula es px = dp * density . Entonces simplemente multiplique o divida por la densidad para convertir entre px y dp .
  • sp significa píxeles independientes de escala. Simplemente se usa para fonts, no para vistas. Es similar a dp excepto que también tiene en cuenta las preferencias del usuario. Esta densidad con las preferencias del usuario consideradas se conoce como densidad escalada. Configurar una fuente TextView a un tamaño de 30 sp , por ejemplo, hará que el texto generalmente parezca tener el mismo tamaño físico en todos los dispositivos. Sin embargo, su abuela puede tener su tamaño de letra preferido al máximo en la configuración de su teléfono, por lo que 30 sp texto se verá más grande en su teléfono que en el suyo. La fórmula es px = sp * scaledDensity .
  • Significado de DP y SP
  • La conversión de DP a SP no es generalmente útil

Para convertir Dimension a Integer o Pixel, necesita usar la función ” getDimensionPixelSize (R.dimen.your_dp_value) “, como …

Haz un valor en dimens.xml

 10dp 

Ahora, para ese valor en píxel o entero, puedes usarlo como a continuación:

 int sizeInPixel = context.getResources().getDimensionPixelSize(R.dimen.padding_10); 

Para kotlin , creé una función de extensión:

 fun Number.spToPx(context: Context) = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, this.toFloat(), context.resources.displayMetrics).toInt() 

Puede usarlo como 16.spToPx(context) o 16.5.spToPx(context)

( KotlinExtensions.kt tales funciones en un archivo KotlinExtensions.kt )