Otro posible tipo de recursos que puedes declarar en un proyecto de aplicación Android son las dimensiones que se pueden aplicar a los diferente objetos View que puedes colocar en un Layout. Como el resto de recursos, las dimensiones deben usarse de manera literal o bien declararlos en un archivo XML.

Valores literales para dimensiones

Los valores para las dimensiones se especifican indicando un número seguido de una unidad de medida. Por ejemplo, 10px, 2in, 5sp. Las posibles unidades de medida para las dimensiones son las siguientes:

  • dp:
    • Density-independent Pixels (píxeles independientes de la densidad): Está basado en la densidad física de la pantalla. Esta unidad es relativa a 160 dpi (puntos por pulgada), en la que 1dp es aproximadamente igual a 1px. Cuando se ejecuta en una pantalla de mayor densidad, el número de píxeles usados para dibujar 1dp se escala en un factor apropiado para la densidad (dpi) de la pantalla. Asimismo, cuando se encuentre en una pantalla de densidad más baja, el número de píxeles utilizados para 1dp se reducirá. La relación de dp a píxeles cambiará con la densidad de la pantalla, pero no necesariamente en proporción directa. El uso de unidades dp (en lugar de unidades px) es una sencilla solución para que las dimensiones en tus layouts se escalen apropiadamente para diferentes densidades de pantalla. Es decir, proporciona consistencia para los tamaños de los elementos del interfaz de usuario a través de diferentes dispositivos.
  • sp:
    • Scale-independent Pixels (píxeles independientes de la escala). Es similar a la unidad dp, pero en este caso también se escala en función de la preferencia de tamaño de fuente especificada por el usuario. Se recomienda usar esta unidad cuando se especifican tamaños de tipo de letra, de manera que se ajusten tanto a la densidad de la pantalla como a las preferencias del usuario.
  • pt:
    • Points (puntos). 1/72 de pulgada, basado en el tamaño físico de la pantalla.
  • px:
    • Pixels (píxeles). Corresponde a píxeles en pantalla. Esta unidad de medida no se recomienda ya que la representación de los elementos en pantalla puede variar entre varios dispositivos. Cada dispositivo puede tener un número diferente de píxeles por pulgada y puede tener más o menos píxeles totales en pantalla.
  • mm:
    • Millimeters (milímetros). Basado en el tamaño físico de la pantalla.
  • in:
    • Inches (pulgadas). Basado en el tamaño físico de la pantalla.

En las siguientes imágenes puedes ver la diferencia de visualización de un texto usando las diferentes unidades de medida. La primera imagen corresponde a una pantalla de 3,7", la segunda es de 2,7" y la tercera de 4", en dispositivos con la misma densidad de puntos. Observa que el tamaño del texto correspondiente a la unidad dp no varía en proporción en todas las pantallas. Se puede apreciar que los textos con unidades de medida independientes de la densidad (dp y sp), ocupan siempre un 85% de la pantala aproximadamente. Observa también que los textos con unidades de medida de milímetros y pulgadas siempre miden igual físicamente independientemente del tamaño de la pantalla del dispositivo Android. 

dimensiones01dimensiones02dimensiones03

En las siguientes imágenes puedes ver la diferencia de las unidades dp y sp. En la primera imagen, el tamaño de fuente del sistema es normal, mientras que en la segunda se ha cambiado la configuración del sistema para que se aumente el tamaño de fuente un 130%. Observa que únicamente cambia el tamaño del texto medido en sp.

dimensiones05dimensiones04

 Archivo de recursos de dimensiones

Las dimensiones pueden almacenarse en un archivo de recursos XML como cualquier otro recurso en las aplicaciones Android. También en este caso, el archivo debe almacenarse en la carpeta res/values. El archivo puede tener cualquier nombre aunque es habitual nombrarlo como dimens.xml.

Si no existe ese archivo en tu proyecto, puedes crearlo desde Android Studio, seleccionando la carpeta values en el árbol del proyecto, y seleccionar en el menú contextual la opción New > Values resource file. A continuación deberás indicar el nombre que deseas asignarle al archivo. Se recomienda que sea dimens.xml .

studioColors01

Los valores de dimensiones deben añadirse al archivo XML con el siguiente formato:

<dimen name="dimen_name">dimen_value</dimen>

A continuación puedes ver un ejemplo de dicho archivo con dos dimensiones declaradas:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="texto_principal">30dp</dimen>
<dimen name="texto_secundario">20dp</dimen>
</resources>

Uso de dimensiones desde las propiedades de componentes

Puedes asignar un valor literal a cualquier propiedad de un objeto View que admita una dimensión. Por ejemplo, el tamaño de texto o el tamaño de los márgenes. Si quieres establecer una dimensión usando su valor literal, tan sólo debes indicar dicho valor en la propiedad adecuada. Por ejemplo, en la siguiente imagen se ha establecido la dimensión 20dp a la propiedad TextSize.

studioDimens02

Para hacer referencia a una dimensión declarada en el archivo de recursos dimens.xml desde otro fichero XML (por ejemplo, desde un layout), debes usar el formato habitual para hacer referencia a un recurso desde XML, indicando en este caso que es un recurso de tipo dimen:

@dimen/nombre_dimensión

Por ejemplo, si se quiere cambiar el tamaño del texto de un TextView debes indicar la referencia a la dimensión en la propiedad Text Size.

studioDimens03

<TextView
android:id="@+id/TextView02"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Ejemplo de texto (10pt)"
android:textSize="@dimen/texto_secundario" />

Si lo haces desde el editor visual, puedes utilizar el botón de los puntos suspensivos que puedes ver en la parte derecha de la propiedad, para buscar la dimensión entre todas las que tienes declaradas en el proyecto y del sistema.

Uso de dimensiones desde código Java

Para asignar una dimensión a una propiedad de un objeto View desde código Java puedes usar el método set correspondiente al atributo al que quieres cambiar la propiedad, por ejemplo, setTextSize para cambiar el tamaño del texto.

void setTextSize(float size)

A este método se le pasa por parámetro la medida en unidades sp.

Si se desea pasar una dimensión almacenada en un archivo de recursos, hay que obtener previamente dicha medida como se ve en este ejemplo:

TextView textView1 = (TextView) findViewById(R.id.textView1);
float dimension1 = getResources().getDimension(R.dimen.texto_secundario);
textView1.setTextSize(dimension1);