sp: qué es, píxeles escalables para texto en Android

Autor: IT Sectr Publicado: 2026-02-25 Tiempo de lectura: 9 min

sp — Scale-independent Pixels, unidad de medida de texto en Android que tiene en cuenta la configuración del tamaño de fuente del dispositivo. A diferencia de dp, sp se escala junto con el tamaño de fuente del sistema, garantizando la accesibilidad de las interfaces. Este artículo explica la diferencia entre sp y dp, muestra cómo configurar textSize en XML y Kotlin, y revela las mejores prácticas para trabajar con tipografía en Android.

Puntos Clave

  • sp — unidad para texto que se escala según la configuración de fuente del sistema del usuario
  • dp — unidad para dimensiones de elementos, no responde a cambios de tamaño de fuente
  • Diferencia entre sp y dp: sp = dp × scaleFactor, donde scaleFactor depende de la configuración de fuente
  • textSize en XML se define mediante sp: android:textSize="16sp"
  • Material Design recomienda un rango tipográfico de 12sp a 34sp para títulos

¿Qué es sp en Android?

sp (scale-independent pixel) — unidad de medida del tamaño de fuente en Android que se escala automáticamente según la configuración del sistema del usuario. Cuando el propietario del dispositivo aumenta el tamaño de fuente en los ajustes, todos los elementos con valores en sp crecen proporcionalmente. Esto garantiza la accesibilidad de la interfaz para personas con discapacidad visual.

La relación básica: 1 sp = 1 dp con la escala de fuente estándar de 1.0 (normal). Si el usuario configura la fuente en Grande (1.15×), 16 sp se convierten en 18.4 píxeles físicos. Con tamaño de fuente Pequeño (0.85×), los mismos 16 sp se convierten en 13.6 px. El mecanismo de escalado se gestiona a través de Settings.System.FONT_SCALE a nivel del Framework de Android.

Según las Google Material Design Guidelines, el texto debe especificarse exclusivamente en sp. La excepción son las etiquetas fijas en componentes donde el tamaño es crítico para el diseño (por ejemplo, texto dentro de botones de altura fija). En tales casos, se recomienda usar dp con control manual de accesibilidad.

sp vs dp: Diferencias Clave

La diferencia entre sp y dp es uno de los temas más comunes en entrevistas de desarrolladores Android y en revisiones de código reales. Ambas unidades están vinculadas a píxeles independientes de densidad (160 dpi = 1 dp = 1 px en pantallas mdpi), pero se comportan de manera diferente al cambiar el tamaño de fuente del sistema.

Característicaspdp
PropósitoTamaño de textoDimensiones de elementos, relleno, ancho, alto
Escalado de fuenteSí (factor de escala)No
Escalado de densidad
API de configuraciónandroid:textSizeandroid:layout_width, layout_height, padding, margin
Token de Material Designtypescalespacing, sizing

En la práctica, un error común es usar dp para texto. Si el texto se define en dp, no se escala al aumentar el tamaño de fuente, haciendo la interfaz inaccesible para usuarios con mala visión. El error inverso es usar sp para la altura de botones o rellenos: al aumentar la fuente, el botón puede "inflarse", rompiendo el diseño.

Cómo Funciona el Escalado de sp

El escalado de sp está implementado a nivel del Framework de Android en la clase TypedValue. La fórmula de conversión es: sp = dp × scaledDensity, donde scaledDensity es un factor de escala que tiene en cuenta tanto la densidad de pantalla como la configuración de fuente del usuario.

kotlin
// Obtención programática de scaledDensity en Kotlin
val scaledDensity = with(context.resources) {
    displayMetrics.scaledDensity
}

// Conversión de sp a px
fun spToPx(sp: Float, context: Context): Float {
    return TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_SP,
        sp,
        context.resources.displayMetrics
    )
}

// Conversión de px a sp
fun pxToSp(px: Float, context: Context): Float {
    return px / context.resources.displayMetrics.scaledDensity
}

El método TypedValue.applyDimension es la única forma correcta de convertir sp a píxeles en tiempo de ejecución. La multiplicación directa por scaledDensity es menos fiable ya que no maneja casos extremos (valores cero, desbordamiento). scaledDensity cambia cuando se modifican los ajustes de fuente a través de Settings > Display > Font size.

Factores de Escala

Android proporciona cinco niveles predefinidos de escala de fuente: Pequeño (0.85×), Normal (1.0×), Grande (1.15×), Más Grande (1.3×) y un nivel adicional Muy Grande (>1.3×) en Android 14+. Los fabricantes de dispositivos (Samsung, Xiaomi) añaden sus propios niveles — hasta 2.0×. El tamaño mínimo de texto en sp nunca garantiza un número fijo de píxeles.

Uso de sp en XML

En los diseños XML, sp se utiliza exclusivamente en el atributo android:textSize. Todas las demás dimensiones — ancho, alto, relleno, margen, elevación — se definen en dp. La regla es simple: si el elemento muestra texto, su tamaño va en sp; si el elemento define geometría, el tamaño va en dp.

Ejemplo básico de textSize en XML

xml
<!-- Diseño de TextView con textSize en sp -->
<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    android:textSize="16sp"
    android:padding="12dp"
    android:lineSpacingExtra="4dp" />

<!-- Uso de recursos dimens -->
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="@dimen/text_body_large" />

Se recomienda extraer los tamaños de texto en un archivo dimens.xml. Esto simplifica el mantenimiento de la tipografía, permite sobrescribir tamaños para diferentes configuraciones de pantalla y garantiza la coherencia en toda la aplicación.

dimens.xml con Tokens Tipográficos

xml
<!-- res/values/dimens.xml -->
<resources>
    <!-- Material Design Type Scale -->
    <dimen name="text_display_large">34sp</dimen>
    <dimen name="text_display_medium">28sp</dimen>
    <dimen name="text_headline_large">24sp</dimen>
    <dimen name="text_headline_medium">20sp</dimen>
    <dimen name="text_title_large">18sp</dimen>
    <dimen name="text_body_large">16sp</dimen>
    <dimen name="text_body_medium">14sp</dimen>
    <dimen name="text_label_large">14sp</dimen>
    <dimen name="text_label_small">11sp</dimen>
</resources>

Material Design Type Scale incluye 13 niveles de tamaño — desde 11sp para etiquetas pequeñas hasta 57sp para títulos grandes de exhibición. Los proyectos Android suelen usar 8–10 niveles. Todos los valores deben ser múltiplos de 1sp — los valores fraccionarios (15.5sp) degradan el renderizado debido al posicionamiento de subpíxeles.

Configuración de Tipografía con Kotlin

En el desarrollo moderno de Android, el texto rara vez se define directamente mediante textSize en sp. En su lugar, se utiliza el sistema MaterialTheme.typography, donde cada estilo está predefinido e incluye tamaño, peso, interlineado y espaciado entre letras.

kotlin
// Tipografía personalizada mediante Typography API
val AppTypography = Typography(
    displayLarge = TextStyle(
        fontWeight = FontWeight.Normal,
        fontSize = 34.sp,
        lineHeight = 40.sp,
        letterSpacing = 0.sp
    ),
    headlineLarge = TextStyle(
        fontWeight = FontWeight.SemiBold,
        fontSize = 24.sp,
        lineHeight = 32.sp
    ),
    titleLarge = TextStyle(
        fontWeight = FontWeight.Medium,
        fontSize = 18.sp,
        lineHeight = 24.sp
    ),
    bodyLarge = TextStyle(
        fontWeight = FontWeight.Normal,
        fontSize = 16.sp,
        lineHeight = 24.sp,
        letterSpacing = 0.5.sp
    ),
    labelSmall = TextStyle(
        fontWeight = FontWeight.Medium,
        fontSize = 11.sp,
        lineHeight = 16.sp,
        letterSpacing = 0.5.sp
    )
)

La función de extensión .sp en Jetpack Compose se traduce automáticamente a píxeles independientes de escala. Cuando cambia el tamaño de fuente del sistema, Compose recalcula fontSize, lineHeight y spacing según la nueva scaledDensity. TextUnit (la clase que representa sp) garantiza que el texto se escale mientras que los rellenos no.

sp en Jetpack Compose

En Jetpack Compose, sp está representado por el tipo TextUnit, que no puede usarse accidentalmente para dimensiones de elementos. El compilador de Kotlin lanzará un error si se pasa TextUnit donde se espera Dp. Esto elimina toda una clase de errores relacionados con el escalado incorrecto.

kotlin
// TextUnit en Compose — trabajo seguro con sp
@Composable
fun ArticleCard(title: String, description: String) {
    Card(modifier = Modifier
        .fillMaxWidth()
        .padding(16.dp)
    ) {
        Text(
            text = title,
            style = MaterialTheme.typography.titleLarge
        )
        Spacer(modifier = Modifier.height(8.dp))
        Text(
            text = description,
            style = MaterialTheme.typography.bodyMedium
        )
    }
}

// Configuración explícita de fontSize en sp
Text(
    text = "Tamaño personalizado",
    fontSize = 20.sp,
    fontWeight = FontWeight.Bold,
    color = MaterialTheme.colorScheme.primary
)

Compose no tiene un equivalente directo del atributo XML android:textSize — el tamaño del texto se define mediante TextStyle.fontSize. El sistema MaterialTheme.typography proporciona estilos predefinidos que corresponden a la Material Design Type Scale. Si se necesita un tamaño personalizado, se usa el literal 20.sp — el lenguaje garantiza que esto es TextUnit, no Dp.

Mejores Prácticas con sp

El uso correcto de sp es la base de una aplicación Android accesible. A continuación se presentan reglas basadas en las recomendaciones de Google Material Design y Android Developers Guide.

  • Siempre usa sp para texto — nunca establezcas textSize en dp o px, de lo contrario los usuarios con fuentes agrandadas no podrán leer la interfaz
  • Usa dp para contenedores — la altura de botones, rellenos y el ancho de tarjetas deben estar en dp, de lo contrario los elementos pueden solaparse con fuentes grandes
  • Extrae tamaños en dimens.xml — el almacenamiento centralizado de tokens tipográficos simplifica la refactorización y el soporte de tema oscuro
  • No uses sp menor de 12sp — el texto más pequeño se vuelve ilegible en dispositivos con alto PPI y con tamaños de fuente estándar
  • Prueba con la escala de fuente máxima — activa la fuente más grande en la configuración del dispositivo y verifica que la interfaz no se rompa

La regla principal de accesibilidad: el usuario debe poder aumentar el tamaño de fuente sin perder funcionalidad. Si la aplicación funciona correctamente con una escala de fuente de 1.3×, superará las pruebas básicas de accesibilidad. Google Play puede rechazar la aplicación si textSize está definido en dp y la interfaz no se escala.

Preguntas Frecuentes

¿En qué se diferencia sp de dp?

sp (scale-independent pixel) se escala al cambiar el tamaño de fuente del sistema, mientras que dp no. sp se usa solo para texto, dp para todas las demás dimensiones de elementos. Factor de conversión: sp = dp × FONT_SCALE.

¿Se puede usar sp para rellenos?

No. Los rellenos, la altura de botones y el ancho de tarjetas deben definirse en dp. Usar sp para rellenos hace que los elementos crezcan de forma antinatural al aumentar la fuente y pueden salirse de los límites de la pantalla.

¿Cómo verificar que la app funciona correctamente con sp?

Abre Settings > Display > Font size y establece el valor máximo (Largest). Inicia la aplicación y verifica que todo el texto sea legible, los elementos no se superpongan y los botones no se salgan de los límites de la pantalla. Para automatización, usa Espresso con UiAutomator.

¿Cuál es el tamaño mínimo permitido de texto en sp?

Material Design recomienda un tamaño mínimo de 11sp para labelSmall. Para texto del cuerpo — de 14sp (bodyMedium) a 16sp (bodyLarge). No se recomiendan tamaños menores de 11sp ya que se vuelven ilegibles en dispositivos con alta densidad de píxeles.

¿Qué pasa si textSize se define en dp?

El texto se mostrará en un tamaño fijo independientemente de la configuración de fuente del sistema. Los usuarios con fuentes agrandadas no podrán leer cómodamente ese texto. Esto viola los requisitos de accesibilidad WCAG y puede causar el rechazo de la aplicación en Google Play.

Resumen

  • sp — unidad de medida de fuente en Android que se escala con la configuración del usuario mediante FONT_SCALE
  • dp — unidad para dimensiones de elementos que no responde a cambios de tamaño de fuente
  • textSize en XML se define mediante android:textSize="16sp", todas las demás dimensiones en dp
  • MaterialTheme.typography en Jetpack Compose usa TextUnit (.sp) para seguridad de tipos
  • dimens.xml — almacenamiento centralizado de tokens tipográficos para coherencia
  • Tamaño mínimo para texto — 11sp, recomendado para cuerpo — 14–16sp
  • Pruebas con escala de fuente máxima — paso obligatorio para verificar accesibilidad

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también