10. Gráficos en dos dimensiones

Documentos relacionados
Android Creación de una aplicación sencilla: Forwarding - Página 1 -

CODIGO PROYECTO: AppPixelproServicioWeb Proyecto Android - Servicio Web

ALMACENAMIENTOS DE DATOS EN ANDROID CON SQLITE

Ejercicio 4. Manejo de Layouts en Android. Android Con Java. Ejercicio 4. Manejo de Layouts en Android. Curso de Android con Java

Programación Android. Alejandro Alcalde. elbauldelprogramador.com

Ejercicio 18. Configuración de Widgets en Android. Android Con Java. Ejercicio 18. Configuración de Widgets en Android. Curso de Android con Java

PRACTICAS DE ANDROID 12 - Lanzar un segundo "Activity" y pasar parámetros Problema:

Ejercicio 16. Mejora de Notificaciones en Android. Android Con Java. Ejercicio 16. Mejora de Notificaciones en Android. Curso de Android con Java

Gráficos 2D, animaciones, controles multimedia

Paso 1 de 13. Paso 2 de 13. Guía de aprendizaje de Flash CS5 Tutorial 3. Creación de un logotipo textual.

Programación Orientada a Objetos con Java

Imprimir códigos de barras

Draw: objetos en 3D, diagramas de flujo y exportación

Qcad. Es un programa de diseña asistido por ordenador en 2 dimensiones.

Crear una Activity en Android. Paso por paso

CAPÍTULO VI PREPARACIÓN DEL MODELO EN ALGOR. En este capítulo, se hablará acerca de los pasos a seguir para poder realizar el análisis de

I. Introducción a la programación orientada a objetos y al lenguaje JAVA Colegio Reuven Feuerstein Javier Navarro

Ejercicios - Persistencia en Android: ficheros y SQLite

Utilizando los pinceles

Android TAG y el principio DRY

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Java Inicial (20 horas)

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Que es un Android Intent?

Introducción a la programación orientada a objetos

Práctica 1 - Pista de Carreras Programación II

Introducción a la Programación Orientada a Objetos

Excel 2010 Representación gráfica de datos

Aplicar colores y colores de fondo a tus sitios web. Examinaremos también métodos avanzados para posicionar y controlar imágenes de fondo.

Programa diseñado y creado por Art-Tronic Promotora Audiovisual, S.L.

ELABORACIÓN DE TABLEROS DINÁMICOS DE COMUNICACIÓN CON EL PROGRAMA EDITOR TICO

Pruebas de unidad con JUnit

Manual para la utilización de PrestaShop

I.E.S. Cuenca Minera Dto. Tecnología P.I. : Introducción al diseño 3D: Blender

Práctica 2 Gráficos Vectoriales con SVG (versión )

Programación orientada a objetos

Manual Scratch ELEMENTOS DEL ENTORNO. Familias de Bloques. Bloques pertenecientes a una familia. Los bloquecitos tienen el mismo color que su familia.

CAJA DE ESQUINAS REDONDEADAS Y ANCHO FIJO ver. 3

Capítulo 6. Desarrollo del Software

Roberto Quejido Cañamero

1. INTRODUCCIÓN Acerca de este libro A quién va dirigido

HERRAMIENTAS PARA CREAR

Paint es una herramienta de diseño de dibujos los cuales son almacenados como mapa de bits (archivos de imágenes tipo *.bmp).

Para crear una lista como la anterior, primero escribe la información, y después selecciona el texto y aplícale el formato de viñetas.

DISEÑADOR DE ESCALERAS

Operación de Microsoft Excel

MANUAL DE USUARIO. JNyARchiTech ALFONSO NEIL JIMÉNEZ CASALLAS MAYDA ALEXANDRA CARVAJAL VARGAS PONTIFICIA UNIVERSIDAD JAVERIANA

PowerPoint 2010 Modificar el diseño de las diapositivas

Dibujo vectorial. Un ejemplo paso a paso

Actividades con GeoGebra

Modulo 1 El lenguaje Java

GUIA N 1: INTRODUCCIÓN A FLASH 5

Tipos de imágenes Imágenes vectoriales Imágenes de mapa de bits

Las propiedades de la clase en java es el equivalente a las variables globales en lenguajes estructurados como el C.

EL PROGRAMA DE PRESENTACIONES IMPRESS (I)

Herramientas de Imagen Grupo Ajustar Brillo. Imagen con brillo Normal. Imagen con +30% de brillo

Manual Impress Impress Impress Impress Impress Draw Impress Impress

Para crear formularios se utiliza la barra de herramientas Formulario, que se activa a través del comando Ver barra de herramientas.

Ejercicio paso a paso. Abrir, guardar y cerrar un documento de CorelDRAW 12

Curso PUDE. Desarrollo de Aplicaciones Móviles en Android. A. Descripción. B. Implementación. B.1. Desarrollo de la primera interfaz

8. Sentencia return y métodos

MANUAL DE AYUDA MÓDULO GOTELGEST.NET PREVENTA/AUTOVENTA

TEMA 2. CREAR SITIOS WEB USANDO. Tecnologías de la Información 1ºBachillerato IES Zurbarán (Badajoz)

2. ABRIR UN NUEVO DOCUMENTO DE TRABAJO

Android y Recursos. Android R.java (fichero)

Práctica sobre compartición de instancias remotas.

Sesión No. 4. Contextualización INFORMÁTICA 1. Nombre: Procesador de Texto

UNIVERSIDAD DE SEVILLA PRÁCTICAS DE LABORATORIO ANÁLISIS SINTÁCTICO (1) LENGUAJES FORMALES Y AUTÓMATAS CURSO 2006/2007

INDICE. 1. Introducción El panel Entities view El panel grafico Barra de botones Botones de Behavior...

Curso de Java POO: Programación orientada a objetos

BLOQUE VIII POWERPOINT

Programación Orientada a Objetos en Java

1 DISEÑO WEB de ANCHO FIJO con 2 COLUMNAS FLOTANTES

Mantenimiento Limpieza

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Manual de Microsoft Power Point 2007 Parte 2 Universidad Politécnica de San Luis Potosí

1. CREACIÓN Y MANEJO DE OBJETOS Hoy en día un buen documento debe incluir, siempre que sea posible, gráficos o imágenes, sobre todo si se va a

1.00 Clase 8. Datos y métodos estáticos. Datos y métodos estáticos de las clases. Campos de datos estáticos:

Illustrator CS4: guía de maquetación

GUÍA 7 Tema: TRAZADOS COMPUESTOS Y MÁSCARAS DE RECORTE.

Tema 2: Diseño de servicios para móviles

APLICACIÓN 2: Dibujar Círculos

PLANTILLAS EN MICROSOFT WORD

TEMA 2 WINDOWS XP Lección 4 BLOC DE NOTAS

Modelo de Objetos Distribuidos

Textos 3D con Inkscape

1. Cambia el fondo del Escritorio

Relaciones entre Clases Programación Avanzada Prim FCC-Buap Profesor: M. C. Miguel Rodríguez Hernandez

Aplicación Android de Asistencia al Caminante

Creación de páginas Web FrontPage

Prof. Dr. Paul Bustamante

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

COREL DRAW PARTE II. TERCER y CUARTO BIMESTRE 1 B - 2 AÑO A- B TABLAS

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

Prof. Dr. Paul Bustamante

Formularios. Formularios Diapositiva 1

Práctica 2: Simón dice

Java en 2 horas. Rodrigo Santamaría

Guadalinex Básico Impress

Transcripción:

10. Gráficos en dos dimensiones 10.1 El método ondraw() Los botones, como el resto de vistas, poseen su propia implementación del método ondraw(). Este método se ejecuta automáticamente cuando se representa la vista. Veamos un sencillo ejemplo que dibuja una bandera belga: /src/mybutton.java package com.programming.android.prueba; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.widget.button; public class MyButton extends Button { Paint paint = new Paint(); public MyButton(Context context) { super(context); public void ondraw(canvas canvas) { paint.setcolor(color.black); canvas.drawrect(30, 10, 90, 100, paint); paint.setcolor(color.yellow); canvas.drawrect(30, 40, 90, 70, paint ); paint.setcolor(color.red); canvas.drawrect(30, 70, 90, 100, paint ); Comencemos el estudio de la clase MyButton por los colores. Los colores en Android vienen representados como enteros en forma de 4 bytes: alfa, rojo, verde y azul (ARGB). Cada componente está comprendida entre 0 y 255. La primera mide la transparencia: 0 es totalmente transparente y 255 totalmente opaco. Para las demás, 0 significa que la componente no contribuye al color y 255 que contribuye al 100%. Por ejemplo, el azul opaco al 100% es 0xFF0000FF, y el verde 0xFF00FF00. Para utilizar un color básico puedes recurrir a una de las constantes de la clase Color: int color = Color.WHITE; Sin embargo, es muy recomendable crear recursos de color en el archivo colors.xml, ya que pueden ser actualizados cómodamente: 1

/res/values/colors.xml <?xml version="1.0" encoding="utf-8"?> <resources> <color name="background_color">#f0f0f0</color> </resources> Para acceder al recurso de color desde Java es necesario hacer lo siguiente: int color = getresources().getcolor(r.color.background_color); El método ondraw() tiene un parámetro de tipo Canvas, que es el marco en el que se dibuja. Para dibujar es necesario instanciar un objeto de tipo Paint donde se especifica, entre otras cosas, el color de la pintura y el ancho de la brocha: Paint paint = new Paint(); paint.setcolor(color.black); La clase Canvas dispone de métodos para dibujar líneas, rectángulos, círculos, etc. El prototipo de drawrect() es el siguiente: void drawrect (float left, float top, float right, float bottom, Paint paint); donde (left, top) son las coordenadas del extremo superior izquierdo y (right, bottom) las del extremo inferior derecho del rectángulo. Por ejemplo, la siguiente instrucción canvas.drawrect(30, 10, 90, 100, paint); dibuja un rectángulo cuyo vértice superior izquierdo está en (30, 10) y el inferior derecho en (90, 100): El método ondraw() dibuja dos rectángulos más sin contornos: uno amarillo con vértices (30, 40) y (90, 70), y otro rojo con vértices (30, 70) y (90, 100): paint.setcolor(color.yellow); canvas.drawrect(30, 40, 90, 70, paint ); paint.setcolor(color.red); canvas.drawrect(30, 70, 90, 100, paint ); La pintura de estos rectángulos se superpone a la negra del rectángulo original, creando así una bandera como se puede ver en la figura del principio. La clase Main se encarga de instanciar el objeto but de tipo MyButton, poner el fondo del botón de color blanco e inflar la vista: 2

/src/main.java package com.programming.android.prueba; import android.app.activity; import android.graphics.color; import android.os.bundle; public class Main extends Activity { MyButton but; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); but = new MyButton(this); but.setbackgroundcolor(color.white); setcontentview(but); El lienzo (canvas) dispone de muchos otros métodos que se ilustran en el siguiente ejemplo: setantialias(true) hace que el trazo sea más suave. drawcircle(140,50,20,paint) dibuja un círculo de radio 20 centrado en (x=140, y=50), y con el pincel paint. setstyle(style.stroke) fija el estilo del pincel como solo contorno. Otras posibilidades son Style.FILL (por defecto) y Style.FILL_AND_STROKE. setstrokecap(cap.round) hace que el trazo se extienda en forma de semicírculo. Las otras posibilidades son Cap.SQUARE y Cap.BUTT (el trazo no se extiende de ninguna manera, es la opción por defecto). drawline(205,30,205,70,paint) traza una recta desde (205,30) a (205, 70), es decir, una recta vertical con el pincel paint. drawlines(pts,paint) traza las líneas especificadas en el array pts en grupos de 4. Por ejemplo, la primera línea será la que va de (pts[0],pts[1]) a (pts[2],pts[3]); la segunda de (pts[4],pts[5]) a (pts[6],pts[7]), etc. drawroundrect(rf,10,10,paint) dibuja un rectángulo redondeado a partir del objeto RectF pasado como primer argumento, que especifica las fronteras. El segundo y tercer argumentos especifican el radio en el eje x y en el eje y, respectivamente, de redondeo de las esquinas. drawbitmap(bitmap,30,180,paint) dibuja el objeto de tipo Bitmap pasado como primer argumento, colocando su esquina superior izquierda en el punto de coordenadas (x=30, y=180). Los gradientes Un gradiente de color permite sombrear las figuras entre dos colores. Existen varios tipos de gradientes: LinearGradient, RadialGradient y SweepGradient. En el ejemplo que sigue se utiliza uno radial: RadialGradient grad = new RadialGradient (0, 0, 40, Color.RED, Color.BLUE, Shader.TileMode.REPEAT); Los cambios comienzan en un punto y se esparcen radialmente en círculo. El centro de este círculo de gradiente corresponde a los dos primeros argumentos: (x=0,y=0). El tercero es el radio del círculo para el gradiente de color. El cuarto y 3

quinto argumentos son, respectivamente, el color del centro (Color.RED) y del extremo del círculo de gradiente (Color.BLUE). El último argumento es el modo de sombreado: las posibilidades son: CLAMP, MIRROR y REPEAT. /src/main.java package com.example.drawing; import android.os.bundle;... import android.widget.button; class MyButton extends Button { Paint paint = new Paint(); public MyButton(Context context) { super(context); public void ondraw(canvas canvas) { paint.setcolor(color.black); paint.setstrokewidth(3); canvas.drawcircle(40, 50, 20, paint); paint.setantialias(true); canvas.drawcircle(90, 50, 20, paint); paint.setstyle(style.stroke); canvas.drawcircle(140, 50, 20, paint); canvas.drawpoint(190, 50, paint); paint.setstrokecap(cap.round); canvas.drawline(205, 30, 205, 70, paint); canvas.drawline(205, 70, 255, 70, paint); float[] pts = new float[8]; pts[0]=205; pts[1]=30; pts[2]=205; pts[3]=70; pts[0]=205; pts[1]=70; pts[2]=255; pts[3]=70; canvas.drawlines(pts, paint); Rect r = new Rect(20, 90, 80, 120); canvas.drawrect(r, paint); RectF rf = new RectF(90, 90, 150, 120); canvas.drawroundrect(rf, 10, 10, paint); RadialGradient grad = new RadialGradient (0, 0, 40, Color.RED, Color.BLUE, Shader.TileMode.REPEAT); paint.setshader(grad); paint.setstyle(style.fill); canvas.drawcircle(190, 120, 30, paint); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.imagen); canvas.drawbitmap(bitmap, 30, 180, paint); public class Main extends Activity { protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); MyButton button = new MyButton(this); setcontentview(button); 4

10.2 La clase TTTButton Nuestra clase TTTButton plantea el siguiente problema: al cambiar el color de fondo del botón remplazamos los dibujables (drawable) con que la clase Button viene por defecto. Por defecto, el botón se dibuja como un rectángulo centrado en la vista de fondo pero ligeramente más pequeño que la vista. En la unidad 9, al cambiar el color de fondo del botón, eliminamos ese ligero padding, y como resultado los botones del tablero aparecían pegados unos a otros como se puede ver en la siguiente figura. El botón TTTButton de la unidad 9 utilizaba la implementación por defecto de ondraw(). En esta unidad, vamos a sobrecargar el método ondraw() como sigue: protected void ondraw (Canvas canvas){ super.ondraw(canvas); float width = getwidth(); float height = getheight(); float padding = 10; Paint backgroundpaint = new Paint(); backgroundpaint.setcolor(color); canvas.drawrect(padding, padding, width-padding, height-padding, backgroundpaint); float x = 0.5f * width; float y = 0.5f * height; Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setcolor(textcolor); paint.setstrokewidth(2); paint.settextalign(align.center); paint.settextsize(20); canvas.drawtext(symbol, x, y, paint); 5

Al comienzo de ondraw() se guarda la anchura y la altura del botón en width y height, respectivamente: float width = getwidth(); float height = getheight(); A continuación, instanciamos un objeto de tipo Paint y le asignamos el color representado por el miembro color (echa un vistazo a la clase TTTButton.java completa más adelante): Paint backgroundpaint = new Paint(); backgroundpaint.setcolor(color); Seguidamente, se dibuja un rectángulo con la brocha backgroundpaint en el marco canvas: canvas.drawrect(padding, padding, width-padding, height-padding, backgroundpaint); Este rectángulo tiene como vértice superior izquierdo (10, 10) y como vértice inferior derecho (width-10, height-10). Para escribir el símbolo del jugador actual dentro del rectángulo utilizamos el método drawtext() de Canvas, que escribe la cadena pasada como primer argumento con la brocha pasada como último argumento: canvas.drawtext(symbol, x, y, paint); donde x e y son las coordenadas del punto medio del rectángulo: float x = 0.5f * width; float y = 0.5f * height; En la unidad anterior los símbolos se dibujaban mediante llamadas a drawx() y drawo(). En nuestra nueva versión, el método ondraw() se ejecutará automáticamente cuando el botón necesite dibujarse. Esto ocurrirá después de las llamadas a los nuevos drawx() y drawo(), que alteran el color del texto y del fondo, así como el símbolo dibujado. Por ejemplo, drawx() queda de la siguiente manera: public void drawx(){ color = xbackgrcolor; symbol = x; textcolor = xcolor; this.setclickable(false); donde xbackgrcolor, x y xcolor son miembros estáticos constantes de TTTButton: private String symbol = nosymbol; private int color = voidcolor; private int textcolor = voidcolor; private static String x = "x"; private static int xcolor = Color.WHITE; private static int xbackgrcolor = Color.RED; La clase TTTButton al completo queda como sigue: 6

src/tttbutton.java package com.programming.android.ttt.ttt2; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.graphics.paint.align; import android.util.attributeset; import android.widget.button; public class TTTButton extends Button { private String symbol = nosymbol; private int color = voidcolor; private int textcolor = voidcolor; private static String nosymbol = ""; private static String x = "x"; private static String o = "o"; private static int voidcolor = Color.BLACK; private static int xcolor = Color.WHITE; private static int ocolor = Color.BLACK; private static int voidbackgrcolor = Color.LTGRAY; private static int xbackgrcolor = Color.RED; private static int obackgrcolor = Color.WHITE; protected void ondraw (Canvas canvas){ super.ondraw(canvas); float width = getwidth(); float height = getheight(); float padding = 10; Paint backgroundpaint = new Paint(Paint.ANTI_ALIAS_FLAG); backgroundpaint.setcolor(color); canvas.drawrect(padding, padding, width-padding, height-padding, backgroundpaint); float x = 0.5f * width; float y = 0.5f * height; Paint paint = new Paint(); paint.setcolor(textcolor); paint.setstrokewidth(2); paint.settextalign(align.center); paint.settextsize(20); canvas.drawtext(symbol, x, y, paint); public TTTButton(Context context, AttributeSet attrs){ super(context, attrs); reset(); public void drawx(){ color = xbackgrcolor; symbol = x; textcolor = xcolor; this.setclickable(false); public void drawo(){ color = obackgrcolor; symbol = o; textcolor = ocolor; this.setclickable(false); public void reset(){ color = voidbackgrcolor; symbol = nosymbol; textcolor = voidcolor; this.setclickable(true); 7

10.3 La clase Main.java Esta clase no cambia con respecto a la de la unidad 9. La incluimos aquí por completitud: src/main.java package com.programming.android.ttt.ttt2; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.textview; public class Main extends Activity implements View.OnClickListener{ private Game game; private TextView textview; private int ids [] = {R.id.button1, R.id.button2, R.id.button3, R.id.button4, R.id.button5, R.id.button6, R.id.button7, R.id.button8, R.id.button9; public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); registerlisteners(); textview = (TextView) findviewbyid(r.id.textview); game = new Game(); private int fromidtoposition (int id){ for (int i=0; i<9; i++) if (id == ids[i]) return i+1; return -1; public void onclick(view v) { TTTButton button = (TTTButton) v; if (!game.isgameactive()) return; if (game.iscurrentsymbolx()) button.drawx(); else button.drawo(); game.play(fromidtoposition(button.getid())); if (game.iswon()) textview.settext("player " + game.getcurrentplayer() + " is the winner"); else if (game.isdrawn()) textview.settext("game drawn"); game.switchcurrentsymbolandplayer(); private void registerlisteners(){ TTTButton button; for (int i=0; i<9; i++) { button = (TTTButton) findviewbyid(ids[i]); button.settext(integer.tostring(i+1)); button.setonclicklistener(this); 8

El fichero de diseño utiliza ahora los nuevos botones, como es natural: res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" > <LinearLayout > <com.programming.android.ttt.ttt2.tttbutton android:id="@+id/button1" android:text="1"/> <com.programming.android.ttt.ttt2.tttbutton android:id="@+id/button2" android:text="2"/> <com.programming.android.ttt.ttt2.tttbutton android:id="@+id/button3" android:text="3"/> </LinearLayout> <LinearLayout > <com.programming.android.ttt.ttt2.tttbutton android:id="@+id/button4" android:text="4"/>... <com.programming.android.ttt.ttt2.tttbutton android:id="@+id/button9" android:text="9"/> </LinearLayout> <TextView android:id="@+id/textview" android:text="scores" /> </LinearLayout> 9

Ejercicio 10.1 En este ejercicio puedes reutilizar las clases Main.java y Game.java del ejercicio 9.2. El único cambio tendrá lugar en la clase TTTButton, en la que vas a adaptar los métodos on() y off() para que ajusten el valor de currentcolor a verde y gris, respectivamente, en lugar de invocar settext(). También tendrás que sobrescribir el método ondraw() para dibujar un círculo de radio 15 centrado en el centro del rectángulo del botón. El método drawcircle() de Canvas tiene el siguiente prototipo: void drawcircle (float x, float y, float radio, Paint paint); donde (x,y) es el centro del círculo, radio es el radio del círculo y paint es la brocha. El color del círculo será currentcolor, de tal forma que aparezca verde cuando el botón está on y gris cuando está off. También puedes utilizar un bitmap diferente para cada estado del botón. 10.3 Animaciones La plataforma Android proporciona cuatro tipos de animaciones: Imágenes GIF animadas. Los GIF animados son ficheros gráficos que contienen varios fotogramas (frames). Animaciones fotograma a fotograma. Mediante la clase AnimationDrawable, el programador suministra los fotogramas y las transiciones entre ellos. Animaciones de interpolación (tweening). Estas animaciones pueden resolverse con código XML y se aplican a cualquier vista. Animaciones con la biblioteca OPEN GL ES. Animaciones de interpolación Estos son los cuatro tipos de animaciones de interpolación: Animación alpha para cambiar la transparencia de una vista. Animación rotate para rotar una vista un cierto ángulo alrededor de un eje o punto de pivote. Animación scale para agrandar o disminuir una vista según el eje X e Y.. Animación translate para desplazar una vista a lo largo del eje X e Y. Las animaciones de interpolación se pueden definir tanto en XML como en Java. Por ejemplo, para crear una animación alpha en XML, añadiremos una carpeta de nombre anim a la carpeta res de nuestro proyecto. Dentro de esta carpeta, añadiremos un archivo de nombre alpha.xml. En el ejemplo siguiente, el atributo android:fromalpha especifica el valor inicial de la trasparencia y 10

android:toalpha el valor final. El atributo android:duration especifica la duración de la animación: res/anim/alpha.xml <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android="http://schemas.android.com/apk/res/android" android:fromalpha="1.0" android:toalpha="0.0" android:duration="5000"> </alpha> El fichero de diseño de este ejemplo especifica dos botones: uno que arranca la animación y otro en el centro del dispositivo que es el botón animado: res/layout/main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".main" > <Button android:id="@+id/button_start" android:layout_centerhorizontal="true" android:text="start alpha animation" /> <Button android:id="@+id/button_animated" android:layout_centerhorizontal="true" android:layout_centervertical="true" android:text="animated button" /> </RelativeLayout> El proceso que asocia una animación definida en un fichero XML a una vista concreta se denomina cargar (load) la animación. Para ello se utiliza la clase de ayuda AnimationUtils. El código que sigue carga la animación definida en alpha.xml y la asocia con el botón de identificador button_animated: 11

src/main.java package com.example.animaciones; import android.os.bundle; import android.app.activity; import android.view.menu; import android.view.view; import android.view.view.onclicklistener; import android.view.animation.animation; import android.view.animation.animationutils; import android.widget.button; import android.widget.toast; public class Main extends Activity { @Override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); Button button_start = (Button) findviewbyid(r.id.button_start); final Button button_animated = (Button) findviewbyid(r.id.button_animated); button_start.setonclicklistener(new OnClickListener() { @Override public void onclick(view v) { // TODO Auto-generated method stub Animation animation = AnimationUtils.loadAnimation(Main.this, R.anim.alpha); button_animated.startanimation(animation); ); Las animaciones se pueden combinar en XML mediante un elemento <set>. En el siguiente fichero se especifica una animación de escala seguida por una de rotación. La segunda empieza cuando acaba la primera pues el atributo android:startoffset de la segunda animación se iguala a la duración de la primera (5000 milisegundos). La primera animación dobla el tamaño de la vista según el eje X y lo triplica según el eje Y. La segunda animación rota la vista alrededor de su punto medio (android:pivoty="50%"): res/anim/alpha.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:fromxscale="1.0" android:toxscale="2.0" android:fromyscale="1.0" android:toyscale="3.0" android:pivotx="50%" android:pivoty="50%" android:duration="5000"/> <rotate android:fromdegrees="0" android:todegrees="360" android:pivotx="50%" android:pivoty="50%" android:duration="4000" android:startoffset="5000"/> </set> 12

El atributo android:fillafter permite especificar si se quiere que la vista vuelva o no a su estado inicial. Si le asignamos el valor true, la vista no volverá a su estado inicial. Ejercicio 10.2 Utiliza una animación para hacer más atractivo el juego. 13