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
y70
) 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 de100 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 en100 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 espx = dp * density
. Entonces simplemente multiplica o divide por la densidad para convertir entrepx
ydp
. -
sp
significa píxeles independientes de la escala. Solo se usa para fuentes, no para vistas. Es similar adp
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 fuenteTextView
en un tamaño de30 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 de30 sp
se verá más grande en su teléfono que en el suyo. La fórmula espx = 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);
}