La columna 80

El blog técnico-personal de Ángel J. Vico… en español

Recursos en Android: dimensiones

Posted by Ángel J. Vico en 3 de octubre de 2011

Las dimensiones son recursos XML que sirven para especificar tamaños de elementos de la interfaz de usuario de más formas que simplemente en píxeles, que sería lo habitual.

Están formadas por un valor numérico con decimales (float) y una cadena de texto de dos caracteres que representa la unidad en la que se expresa el valor numérico. En el archivo XML ambos datos se escriben juntos, en una sola cadena de texto, sin espacio o separadores entre ellos.

La ventaja que representan es que la mayoría de las unidades son relativas, tanto a características físicas del dispositivo en el que se están utilizando, como a diversos elementos de estilo que estén activos en un momento dado. Esto permite que unos mismos valores utilizados en un diseño sean traducidos a tamaños diferentes en cada dispositivo en que se ejecute la aplicación, de forma que la experiencia del usuario sea similar.

Si usáramos siempre medidas expresadas en píxeles podría ocurrir que un elemento que tiene un tamaño adecuado para su uso en un dispositivo en particular se viera demasiado pequeño en otro dispositivo con mayor densidad de píxeles (cantidad de píxeles por cada pulgada de pantalla).

Queda claro que las dimensiones las vamos a utilizar bastante, así que veamos cómo hacerlo.

Unidades

Las que se enumeran a continuación son las diferentes unidades que podemos utilizar para definir dimensiones:

  • dp (píxeles independientes de la densidad): es una unidad abstracta que se basa en la densidad de píxeles de la pantalla. Sirve para garantizar que las cosas tienen las mismas medidas físicas en cualquier pantalla. Como regla, hay que tener en cuenta que 160dp equivaldrá a una pulgada (o, lo que es lo mismo, 63dp serán un centímetro) en cualquier pantalla (en teoría, al menos).

  • sp (píxeles independientes de la escala): es igual que la unidad dp, pero escalada según el tamaño de fuente escogido por el usuario. Es la unidad recomendada para definir el tamaño de los textos que se muestran en pantalla.

  • pt (puntos): representan 1/72 partes de una pulgada (o, más o menos, 1/28 de un centímetro) en cualquier pantalla.

  • px (píxeles): no se recomienda utilizar esta unidad, porque las pantallas tienen diferentes densidades y tamaños, por lo que los elementos dimensionados en píxeles se pueden ver de formas muy diferentes.

  • mm (milímetros): medida directa del elemento en pantalla, en unidades más internacionales.

  • in (pulgadas): medida directa del elemento en pantalla, en unidades anglosajonas.

Uso de dimensiones en XML

Las dimensiones se pueden utilizar directamente en los atributos en forma de cadena de texto. Por ejemplo:

<EditText
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:minWidth="160sp" />

Sin embargo es muy frecuente utilizar la misma dimensión para más de una vista, por lo que resulta más práctico usar un archivo de recursos. Como las dimensiones son recursos simples, el archivo habrá que crearlo en res/values. La sintaxis básica es la siguiente:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="nombre_de_la_dimensión">valor</dimen>
</resources>

El nombre es el identificador que usaremos en los atributos a los que queramos asignarles la dimensión y el valor es la cadena que habríamos usado directamente (pero sin comillas). Por ejemplo:

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <dimen name="cuadros_texto">160sp</dimen>
</resources>

Podemos definir más de una dimensión en un mismo archivo XML, simplemente añadiendo más elementos <dimen> dentro de <resources>. Para usarlas luego en atributos se utiliza el nombre asignado a la dimensión (que actúa de identificador):

<EditText
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:minWidth="@dimen/cuadros_texto" />

Usar dimensiones en Java

Si definimos dimensiones en un archivo XML de recursos, el compilador añadirá las constantes correspondientes a la clase R, tal y como hace con los identificadores de las vistas. Podemos utilizar estas constantes para acceder a las dimensiones desde el código utilizando el método getDimensionPixelSize de la clase Resources. Se haría así:

EditText et = new EditText(this);
et.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
Resources res = getResources();
et.setMinimumWidth(res.getDimensionPixelSize(R.dimen.cuadros_texto));

Primero hay que obtener un objeto de la clase Resources. El método getResources que la clase Activity hereda de Context lo proporciona. Este objeto contiene la información necesaria sobre la pantalla en la que se muestra la actividad como para poder convertir cualquier dimensión relativa en un valor en píxeles, que es lo que esperan la mayoría de los métodos.

La clase Resources tiene también un método getDimension que devuelve la misma información. La diferencia es que el método getDimensionPixelSize procesa el valor que devuelve getDimension para que se pueda usar con seguridad como tamaño. Hace dos cosas: redondear el valor devuelto por getDimension y, si el valor resultante es cero, sustituirlo por 1.

Por otro lado, también es posible utilizar dimensiones en Java sin definirlas previamente en XML. El siguiente ejemplo sería equivalente al que hemos visto antes:

EditText et = new EditText(this);
et.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
int valor = (int) TypedValue.applyDimension(
   TypedValue.COMPLEX_UNIT_SP,
   (float) 160,
   getResources().getDisplayMetrics());
et.setMinimumWidth(valor);

El método applyDimension de la clase TypedValue permite convertir una dimensión en su equivalente en píxeles según el contexto actual (el contexto contiene, básicamente, las características de la pantalla donde se va a mostrar la actividad).

TypedValue es una clase que permite crear objetos con tipos dinámicos, por lo que comúnmente se utiliza para almacenar recursos XML en Java. La clase incluye una serie de constantes que permiten asociar un tipo a un valor numérico, como las unidades en el caso de las dimensiones. En el ejemplo hemos utilizado la constante COMPLEX_UNIT_SP para indicar que el valor 160 que le pasamos al método applyDimension está expresado en píxeles independientes de la escala.

Como se puede ver, podemos utilizar dimensiones sea cual sea la forma en que escojamos crear nuestras interfaces de usuario, por lo que no hay excusas para no aprovechar este recurso que nos ayuda a que nuestra aplicación se vea como realmente queremos en cualquier tipo de dispositivo.

Recuerda que en esta página dispones de enlaces a todos los artículos sobre Android que he publicado en La columna 80.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s