xxhdpi unidades studio pixeles online entre diferencias convertir convertidor android pixel dip density-independent-pixel

android - unidades - ¿Cómo convertir DP, PX, SP entre sí, especialmente DP y SP?



unidades px dp sp in mm (4)

He conocido la diferencia entre DP , SP y PX . Y después de buscar este tema, no encontré nada que me satisficiera por completo. Tal vez esta publicación es un duplicado, pero todavía quiero saber cuál es la fórmula para convertir de DP a PX , y 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.


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 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 la densidad. Es decir, no importa qué dispositivo se use, el tamaño real debe ser el mismo. Por ejemplo, si configuro una vista de 100 dp ancho, tendrá el mismo ancho en un teléfono nuevo de alta densidad que en un teléfono antiguo de baja densidad. (Si hubiera establecido el ancho en 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 multiplica o divide por la densidad para convertir entre px y dp .
  • sp significa píxeles independientes de la escala. Solo se usa para fuentes, 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 tomadas en cuenta se conoce como densidad escalada. Establecer una fuente TextView en un tamaño de 30 sp , por ejemplo, hará que el texto generalmente tenga el mismo tamaño físico en todos los dispositivos. Sin embargo, su abuela puede tener su tamaño de fuente preferido al máximo en la configuración de su teléfono, por lo que el texto de 30 sp 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 generalmente no es útil

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 )


Para convertir Dimension a Integer o Pixel, debe usar la función " getDimensionPixelSize (R.dimen.your_dp_value) ", como ...

Haga un valor en dimens.xml

<dimen name="padding_10">10dp</dimen>

Ahora para ese valor en píxeles o entero, puede usar lo siguiente:

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


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); }