Sesion05 Apuntes Imagen Vectoriales
Sesion05 Apuntes Imagen Vectoriales
Sesion05 Apuntes Imagen Vectoriales
Índice
1 Elementos drawables.................................................................................................... 2
1.1 Colores..................................................................................................................... 3
1.2 Formas......................................................................................................................3
1.3 Gradientes................................................................................................................ 5
1.4 Imágenes.................................................................................................................. 6
1.5 Imágenes nine-patch................................................................................................ 7
1.6 Lista de estados........................................................................................................ 9
1.7 Definición por capas.............................................................................................. 10
1.8 Animación por fotogramas.................................................................................... 10
1.9 Definición programática........................................................................................ 11
2 Estilos y temas............................................................................................................12
2.1 Herencia entre estilos.............................................................................................13
2.2 Cómo aplicar un estilo........................................................................................... 13
2.3 Selección de un tema basado en la versión de la plataforma.................................14
2.4 Utilizando los estilos y temas definidos en el sistema...........................................14
En esta sesión trataremos varias herramientas de Android que nos permitirán personalizar
la interfaz de nuestras aplicaciones. En primer lugar hablaremos de los Drawables,
recursos de tipo imagen que pueden ser usados de varias formas distintas: para mostrarlos
tal cual en una actividad, para definir el fondo de una determinada vista, etc. A
continuación hablaremos de estilos y temas en Android. Los estilos y temas siguen la
misma filosofía que el lenguaje CSS en el caso del desarrollo web: separar el diseño del
contenido. De esta forma seríamos capaces de modificar el aspecto de un conjunto de
vistas o el aspecto global de la aplicación sin necesidad de modificar ningún archivo de
código o de layout.
1. Elementos drawables
2
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
dirección:
http://developer.android.com/guide/topics/resources/drawable-resource.html
Por ejemplo, vamos a definir un drawable que muestre un rectángulo rojo con borde azul,
creando un fichero XML de nombre rectangulo.xml en el directorio /res/drawable/. El
fichero puede tener el siguiente contenido:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#ff0000"/>
<stroke android:width="2dp" android:color="#0000ff"
android:dashWidth="10dp" android:dashGap="5dp"/>
</shape>
Nota
Como en el caso de otros recursos, podemos definir diferentes variantes del directorio de
drawables, para así definir diferentes versiones de los drawables para los distintos tipos de
dispositivos, por ejemplo según su densidad, tamaño, o forma de pantalla.
1.1. Colores
Los ColorDrawables son los drawables más sencillos. Permiten definir una imagen
simplemente a partir de un único color sólido. Se definen usando la etiqueta color en
XML, dentro de la carpeta de drawables en los recursos de la aplicación. A continuación
mostramos un ejemplo de drawable de color rojo
<color
xmlns:android="http://schemas.android.com/apk/res/android"
android:color="#FF0000"
/>
1.2. Formas
3
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Cada forma será de un tipo determinado. El tipo se especifica mediante un atributo del
elemento shape. Los posibles valores que este atributo shape podrá tomar son los
siguientes:
• oval: como su propio nombre indica este tipo permitirá definir formas de tipo oval.
• rectangle: permite el uso de un subnodo corners con un atributo radius para
establecer bordes redondeados.
• ring: podemos definir el radio interno y la anchura del anillo mediante los atributos
innerRadius y thickness, respectivamente. También es posible establecer estos
valores en función de la anchura del drawable por medio de los atributos
innerRadiusRatio y thicknessRatio.
Para especificar cómo será el borde de la figura podemos utilizar el elemento stroke. En
concreto, deberemos hacer uso de los atributos width y color. Otro nodo que podemos
utilizar es padding, que permitirá desplazar la figura en el lienzo, para que no aparezca
centrada. De todas formas, el nodo más habitual suele ser solid, que mediante el atributo
color nos permite establecer el color de fondo.
4
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
1.3. Gradientes
5
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
android:useLevel="false">
<gradient
android:startColor="#ffffff"
android:endColor="#ffffff"
android:centerColor="#000000"
android:useLevel="false"
android:type="linear"
android:angle="45"
/>
</shape>
<!-- Oval gradiente radial -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
android:useLevel="false">
<gradient
android:type="radial"
android:startColor="#ffffff"
android:endColor="#ffffff"
android:centerColor="#000000"
android:useLevel="false"
android:gradientRadius="300"
/>
</shape>
<!-- Anillo con gradiente de tipo sweep -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="ring"
android:useLevel="false"
android:innerRadiusRatio="3"
android:thicknessRatio="8">
<gradient
android:startColor="#ffffff"
android:endColor="#ffffff"
android:centerColor="#000000"
android:useLevel="false"
android:type="sweep"
/>
</shape>
1.4. Imágenes
6
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
7
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Imagen estirada
Sin embargo, tenemos un tipo especial de imágenes PNG llamadas nine-patch (llevan
extensión .9.png), que nos permitirán evitar este problema. Normalmente la parte central
de nuestros componentes es homogénea, por lo que no pasa nada si se estira. Sin
embargo, los bordes si que contienen un mayor número de detalles, que no deberían ser
deformados, especialmente las esquinas. Las imágenes nine-patch se dividen en 9
regiones: la parte central, que puede ser escalada en cualquier dirección, las esquinas, que
nunca pueden escaladas, y los bordes, que sólo pueden ser escalados en su misma
dirección (horizontal o vertical). A continuación vemos un ejemplo de dicha división:
Parches de la imagen
Si ponemos una imagen de este tipo como drawable de fondo para un botón, veremos que
siempre se mostrará con el aspecto correcto, independientemente de su contenido:
8
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Herramienta draw9patch
La fila de píxeles superior y la columna izquierda indican las zonas de la imagen que son
flexibles y que se pueden ampliar si es necesario repitiendo su contenido. En el caso de la
fila superior, indica que se pueden estirar en la horizontal, mientras que los del lateral
izquierdo corresponden a la vertical.
Opcionalmente podemos especificar en la fila inferior y en la columna derecha la zona
que utilizaremos como contenido. Por ejemplo, si utilizamos la imagen como marco de un
botón, esta será la zona donde se ubicará el texto que pongamos en el botón. Marcando la
casilla Show content veremos en el lateral derecho de la herramienta una previsualización
de la zona de contenido.
Siguiendo con el ejemplo del botón, encontramos ahora un nuevo problema. Los botones
no deben tener siempre el mismo aspecto de fondo, normalmente cambiarán de aspecto
cuando están pulsados o seleccionados, sin embargo sólo tenemos la posibilidad de
especificar un único drawable como fondo. Para poder personalizar el aspecto de todos
los estados en los que se encuentra el botón tenemos un tipo de drawable llamado state
list drawable. Se define en XML, y nos permitirá especificar un drawable diferente para
cada estado en el que se puedan encontrar los componentes de la interfaz, de forma que
en cada momento el componente mostrará el aspecto correspondiente a su estado actual.
Por ejemplo, podemos especificar los estados de un botón (no seleccionado, seleccionado,
y pulsado) de la siguiente forma:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
9
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Los drawables especificados para cada estado pueden ser de cualquier tipo (por ejemplo
imágenes, nine-patch, o formas definidas en XML).
Un drawable similar es el de tipo level list, pero en este caso los diferentes posibles
drawables a mostrar se especifican para un rango de valores numéricos. ¿Para qué tipos
de componentes de la interfaz podría resultar esto de utilidad?
Este tipo de drawable nos permite definir una animación a partir de diferentes
fotogramas, que deberemos especificar también como drawables, además del tiempo en
milisegundos que durará el fotograma. Se definen en XML de la siguiente forma:
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android: > <item android:drawable="@drawable/spr0" android:duration="50" />
<item android:drawable="@drawable/spr1" android:duration="50" />
<item android:drawable="@drawable/spr2" android:duration="50" />
</animation-list>
Además, la propiedad oneshot nos indica si la animación se va a reproducir sólo una vez
o en bucle infinito. Al ponerla como false especificamos que se reproduzca de forma
continuada.
Desde el código, podremos obtener la animación de la siguiente forma, considerando que
10
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Nota
La diferencia entre Bitmap y BitmapDrawable reside en que en el primer caso simplemente
tenemos una imagen, mientras que en el segundo lo que tenemos es un drawable que encapsula
una imagen, es decir, se le podrá proporcionar a cualquier componente que acepte drawables en
general como entrada, y concretamente lo que dibujará será la imagen (Bitmap) que contiene.
Importante
El método start no puede ser llamado desde el método onCreate de nuestra actividad, ya
que en ese momento el drawable todavía no está vinculado a la vista. Si lo que queremos es que
se ponga en marcha nada más cargarse la actividad, el lugar idóneo para invocarlo es el evento
onWindowFocusChanged. Lo recomendable será llamar a start cuando obtengamos el
foco, y a stop cuando lo perdamos.
Podremos también obtener una referencia a dicha vista y mostrar en ella nuestro
11
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
2. Estilos y temas
Los estilos permiten modificar el aspecto de una vista o una ventana. Con un estilo
podemos definir propiedades como altura, padding, color de fuente, tamaño de fuente, y
muchas más cosas. Un estilo se define en un archivo XML separado de la definición del
layout. La filosofía de los estilos en Android es la misma que la del lenguaje CSS en el
caso del diseño web: permiten separar el diseño del contenido.
Para crear un estilo simplemente utilizamos un elemento XML style con un atributo
name y uno o más elementos item. El elemento item debe incluir un atributo name para
especificar el atributo al que hace referencia (como color o fuente) y su contenido será el
valor que se le asigna a dicho atributo.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="NombreEstilo">
<item name="NombreAtributo">value</item>
</style>
</resources>
12
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Se puede aplicar la herencia tantas veces como sea necesario. Por ejemplo, sería posible
definir un nuevo estilo a partir del estilo TextoPequenyo definido en el ejemplo anterior,
también mediante herencia.
13
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Las versiones más modernas de Android incluyen nuevos temas que podríamos querer
aplicar a nuestras aplicaciones, pero en ese caso tendríamos que intentar conservar la
compatibilidad con versiones anteriores del sistema. Esto se puede conseguir mediante un
tema que utilice herencia y carpetas de recursos con sufijos para escoger un archivo de
estilo u otro según la versión.
Por ejemplo, nuestra aplicación podría declarar un estilo que herede del estilo ligero por
defecto de Android. Para ello, crearíamos el archivo /res/values/styles.xml y añadiríamos
lo siguiente:
<style name="LightThemeSelector" parent="android:Theme.Light">
...
</style>
Por otra parte, podríamos desear que en el caso en el que el dispositivo estuviera
ejecutando la versión 3.0 de Android, éste usara un tema especial de esta versión. Para
ello podríamos crear el archivo /res/values-v11/styles.xml con el siguiente contenido:
<style name="LightThemeSelector" parent="android:Theme.Holo.Light">
...
</style>
La plataforma Android proporciona una gran cantidad de temas y estilos que podemos
aplicar a nuestras propias aplicaciones. Se puede encontrar una referencia a todos estos
estilos en la clase R.style. Para usar cualquier estilo definido dentro de dicha clase
sustituimos cada subrayado por un punto. Por ejemplo, podríamos aplicar el estilo
Theme_NoTitleBar de la siguiente forma: "@android:style/Theme.NoTitleBar".
Otros ejemplos podrían ser los siguientes, que producirían como resultado una actividad
en forma de diálogo o en forma de ventana semitransparente respectivamente:
<activity android:theme="@android:style/Theme.Dialog">
<activity android:theme="@android:style/Theme.Translucent">
14
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
Nota:
Todo el código fuente se puede encontrar en http://source.android.com/source/downloading.html
15
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.
Drawables, estilos y temas
16
Copyright © 2012-13 Dept. Ciencia de la Computación e IA All rights reserved.