Android Touch. En esta misma clase modificamos también el método avanza() de tal manera que ahora el elefante pueda desplazarse también en el eje y.



Documentos relacionados
Android Colision. Manifiesto

Animación en Android. Clase Elefante

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

Manual para el uso del Correo Electrónico Institucional Via Webmail

Programación Orientada a Objetos con Java

APLICACIONES PARA EMPRENDEDORES

UNIVERSIDAD AUTÓNOMA DE SINALOA FACULTAD DE INGENIERÍA MOCHIS LIC. EN INGENIERÍA DE SOFTWARE MATERIA: REDES Y COMUNICACIÓN DE DATOS GRUPO: 401

CRM para ipad Manual para Usuario

Pruebas de unidad con JUnit

TUTORIAL PARA REDIMENSIONAR FOTOS

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

Tutorial Enterprise Architect 7.5 Versión en español

Introducción a la Programación de Videojuegos y Gráficos

Programación Gráfica 2D ( IV ) Tilemapping.

Sistema Ventanilla Manual Solicitud Compra DIMERC

15. ANEXO # 5 GAMEPLAYOBJECT

Look!: Framework para Aplicaciones de Realidad Aumentada en Android

Manual del Usuario de NOVIT GPS. Le llegará un como éste. Nombre completo;

Creando scrolls. Scratch: Entorno de programación

Acciones pueden haber en Flash más de 1000 por lo tanto no se trata de aprenderlas de memoria sino de utilizarlas cuando nos interese.

TIPOS DE RESTRICCIONES

CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO CATÁLOGO

GAME MAKER JUEGO DE LABERINTOS

Instalación del Admin CFDI

GUIA BUSQUEDA RAPIDA DE PRODUCTOS

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

Crear una Activity en Android. Paso por paso

Lenguajes de Programación Curso Práctica 4. Herencia. Utilización de interfaces y clases abstractas. 1. Interfaces Clases abstractas 2

Diagrama de Gantt en Excel

Parsear HTML con htmlparser para Android Guillem Pérez

MANUAL COPIAS DE SEGURIDAD

CÓMO AÑADIR UN FORMULARIO NUEVO O MODIFICAR EL DE CONTACTO DE LA WEB

Producto. Información técnica y funcional. Versión 2.8

PRÁCTICAS DE GESTIÓN GANADERA:

Tutorial: Utilización del Mapa de normales, para modificar iluminación virtual.

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

INTELIGENCIA EN REDES DE COMUNICACIONES PRÁCTICA FINAL. Ignacio Ribas Ramos Miguel Flecha Lozano Ingeniería de Telecomunicaciones

Introducción a la Programación Orientada a Objetos

MANUAL DE AYUDA. SAT Móvil (Movilidad del Servicio Técnico)

Actividades con GeoGebra

U.E JUAN DE VELASCO CREAR DATOS EN SQL

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

Primer Parcial Septiembre 5 de 2009

1. Introducción Qué es Draw? Entorno de trabajo Crear un nuevo documento Preparación de la hoja de dibujo...

Desarrolladores: Christian David Merino Cruz. Bryan Alexis Peraza Navas. Erik Alberto Renderos Morales.

Gestor de Expedientes 28/09/2010

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

Plataforma Educativa Manual del Docente Nivel II Módulo 3 Wiki

Manual CMS Mobincube

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

Guía para el tratamiento en Allegro de recibos para centros no pertenecientes a la Generalitat Valenciana.

PSI Gestión es un sistema multiusuario que le permite 2 tipos de configuraciones:

Proceso de Instalación Una vez agregada como aplicación a su sitio y que esté disponible:

MANUAL TARIFICADOR. Clic aquí Descargar Tarificador

Manual Comptavila versión 3

UNIVERSIDAD DE MEDELLÍN NUEVO PORTAL WEB MANUAL DE USUARIO GESTOR DE CONTENIDOS

Figura 1. Pantalla principal de la aplicación. Bits de inteligencia. Nos lleva al espacio dedicado a este tema.

5. Diseño e Implementación del sistema (software)

Ejercicios de pantalla táctil

Actualmente existen dos maneras de enviar y publicar las estadísticas en la página web de la Federación Española de Baloncesto:

Cómo ingresar a la Intranet?

Paso 2 Una vez se ha completado la instalación y ejecutado el programa, veremos esto

Implementación de widgets Avaibook en Blogger

Clases y funciones amigas: friend

Manual de uso. Manual de uso - citanet 1

GUIA DE BLOQUEO Y DESBLOQUEO WEB

MANUAL DE FACTURACIÓN TOUCH SCREEN

Desarrollo de una aplicación de ejemplo: movilidapp. Desarrollado por movilidapp

Modulo 1 El lenguaje Java

Manual para usuarios USO DE ONEDRIVE. Universidad Central del Este

Programación de videojuegos con LibGdx. Javier Villegas Gomez

MANUAL WINDOWS MOVIE MAKER. Concurso de Gipuzkoa

PANEL DE CONTROL (Zona de Administración) MANUAL DE USO Por conexanet. Revisión 1.1 Fecha

ÍNDICE

INSERTAR UNA GALERÍA DE FOTOS REALIZADA EN UNA WEB EXTERNA COMO SLIDE EN UNA PÁGINA O SECCIÓN DE LA WEB

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

MANUAL DE USO PARA EL SOFTWARE AUMENTATY

MANUAL DE ADMINISTRADOR DEL SITIO WEB DEL ISTU

Manual de software. Dynamic Cloud. 10/2014 MS-Dynamic_Cloud v1.2

SISTEMAS DE COORDENADAS SISTEMA COORDENADO UNIDIMENSIONAL

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

Trabajar con diapositivas

Vamos a crear nuestro primer juego en el que tendremos que coger la comida que esta protegida por los gatos

Manual de guía para Clientes Sistema MoTrack

TUTORIAL PRÁCTICO DE BASES DE DATOS EN ACCESS CREAR UNA AGENDA

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

P i. Q i 10% 1,96% 20% 5,24% 30% 9,98% 40% 15,77% 50% 22,84% 60% 31,52% 70% 41,94% 80% 54,71% 90% 70,98% 100% 100,00%

CRM para ipad Manual para Usuario

ZCARTAS: Iniciación a la suma y resta de números enteros Introducción Actividad 1: Escenario con cartas numeradas desde -2 hasta 2...

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Guía de instalación del sistema de contafiscal red

MANUAL DE USO TELÉFONO MÓVIL

Introducción a Moodle

Crear la base de datos antes de la instalación de Wordpress.

Repaso de las características más importantes de la programación Java y su adaptación a Android

Mantenimiento Limpieza

Gestión de Retales WhitePaper Noviembre de 2009

COPIA SEGURIDAD Y RESTAURACIÓN CURSO

GENERACIÓN DE TRANSFERENCIAS

Introducción a Java LSUB. 15 de enero de 2015 GSYC

Transcripción:

Android Touch En este tutorial aprenderemos a utilizar la pantalla táctil de los dispositivos para sacar ventaja de ello en nuestras aplicaciones. Para este tutorial tomaremos como base el tutorial anterior, puedes crear un proyecto nuevo o seguir trabajando sobre el proyecto creado en el tutorial anterior. Si vas a crear un proyecto nuevo crea uno para la plataforma 2.2 y nombra a la Actividad principal TutorialElefanteTouch. La aplicación que desarrollaremos mostrará en pantalla el mismo elefante de la aplicación anterior solo que en esta ocasión podremos modificar su dirección de desplazamiento al tocar la pantalla del dispositivo. La mayoría del código se queda tal cual como en el tutorial anterior por lo cual aquí nos enfocaremos únicamente en las modificaciones que se tienen que hacer. Empecemos por la clase Elefante, dado a que ahora el elefante podrá desplazarse tanto en el eje x como en el eje y necesitamos añadir dos nuevas contantes en la definición de la clase para indicar la dirección del movimiento del elefante. public class Elefante { public static final int LEFT = 1; //Dirección del Elefante, Izquierda public static final int RIGHT = 2; //Dirección del Elefante, Derecha public static final int UP = 3; //Dirección del Elefante, Arriba public static final int DOWN = 4; //Dirección del Elefante, Abajo En esta misma clase modificamos también el método avanza() de tal manera que ahora el elefante pueda desplazarse también en el eje y. public void avanza() { //Avanza a la derecha if (dir == RIGHT) x += 5; //Avanza a la izquierda if (dir == LEFT) x - = 5; //Avanza arriba if (dir == UP) y - = 5; //Avanza abajo if (dir == DOWN) y += 5; Tanto la clase Animacion como el manifiesto de la aplicación permanecen sin cambio alguno por lo cual continuaremos ahora con los cambios a realizar en la Actividad. Empezamos por importar las clases necesarias para la Actividad donde ahora necesitaremos importar también las clases View y OnTouchListener. En la

definición de la clase implementaremos la interfase OnTouchListener y definiremos dos nuevos miembros que nos ayudarán a mapear los toques que se hagan en la pantalla táctil. import android.app.activity; import android.content.context; import android.content.res.assetfiledescriptor; import android.content.res.assetmanager; import android.content.res.configuration; import android.graphics.bitmap; import android.graphics.bitmap.config; import android.graphics.bitmapfactory; import android.graphics.canvas; import android.graphics.rect; import android.media.audiomanager; import android.media.soundpool; import android.os.bundle; import android.os.powermanager; import android.os.powermanager.wakelock; import android.view.motionevent; import android.view.surfaceholder; import android.view.surfaceview; import android.view.view; import android.view.view.ontouchlistener; import android.view.window; import android.view.windowmanager; import java.io.ioexception; import java.io.inputstream; public class TutorialElefanteTouch extends Activity implements OnTouchListener { //Vista de la Actividad ElefanteFastRenderView renderview; //Candado para evitar que el dispositivo duerma WakeLock wakelock; //Objeto Elefante Elefante elefante; //Objeto Animacion Animacion elefanteanim; //Colección de sonidos SoundPool pool; //Identificador de sonido int soundid = - 1; //Posiciones 'x' y 'y' int x, y; //Objetos Bitmap para el manejo de imágenes Bitmap cuadro, framebuffer; //Escala en 'x' y 'y'

float scalex, scaley; Dado a que nosotros primero dibujamos nuestra animación en un buffer virtual y posteriormente lo proyectamos a la vista que se mostrará en la pantalla necesitamos mapear los toques que se hacen en la pantalla táctil. El buffer virtual en el que dibujamos es por defecto de 320 x 480 pixeles, sin embargo el tamaño de la pantalla en la cual se proyectará la imagen no será precisamente de estas mismas medidas por lo cuál al proyectar el buffer en la pantalla es necesario escalar el buffer para que se muestre en pantalla conservando su proporción original y de esta manera garantizar que la imagen se vea siempre igual en proporción en cualquier dispositivo en el cual se corra la aplicación. Dado a que el buffer será escalado es importante para nosotros conocer esa escala que se hará en cada uno de los ejes de tal manera que podamos escalar el toque que se haga en la pantalla para que las coordenadas del toque coincidan con las coordenadas del buffer virtual donde se encuentra el elefante. Los miembros scalex y scaley nos ayudarán a calcular la escala que se aplique a cada uno de los ejes. En el método oncreate() de la Actividad, justo después de crear nuestro buffer virtual calculamos la escala en cada uno de los ejes y los guardamos en los miembros scalex y sacley. //Determina la orientación del dispositivo y crea un buffer en base //a esta boolean islandscape = getresources().getconfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; //Ancho del buffer int framebufferwidth = islandscape? 480 : 320; //Alto del buffer int framebufferheight = islandscape? 320 : 480; //Crea el buffer framebuffer = Bitmap.createBitmap(frameBufferWidth, framebufferheight, Config.RGB_565); //Escala en x basada en el ancho del buffer y el ancho de la //pantalla del dispositivo scalex = (float) framebufferwidth / getwindowmanager().getdefaultdisplay().getwidth(); //Escala en y basada en el alto del buffre y el alto de la pantalla del //dispositivo scaley = (float) framebufferheight / getwindowmanager().getdefaultdisplay().getheight(); Dentro del mismo método utilizamos el método setontouchlistener() para indicar que la Actividad se encargará de manejar los eventos de toque. Esto lo añadimos justo después de que creamos nuestra vista.

//Crea y establece la vista de la Actividad y establece un //OnTouchListener para esta renderview = new ElefanteFastRenderView(this); renderview.setontouchlistener(this); setcontentview(renderview); Sobreescribimos ahora el método ontouch() requerido por la interfase OnTouchListener para manejar los eventos de toque en la Actividad. En este cambiaremos la dirección de movimiento del objeto Elefante dependiendo de la posición donde el usuario toque la pantalla. Al obtener las coordenadas del toque las multiplicamos por los valores de la escala para ajustarlos al tamaño del buffer virtual. /** * Método ontouch sobrescrito de la interface OnTouchListener * Maneja los eventos de contacto en la Actividad * @param v es la vista que contiene el OnTouchListener * @param event son los eventos de contacto atrapados por el *OnTouchListener * @return regresa verdadero cuando es llamado */ @Override public boolean ontouch(view v, MotionEvent event){ //Maneja los eventos de contacto switch (event.getaction()) { //Cuando se hace contacto con el dedo case MotionEvent.ACTION_DOWN: // //Cuando se mueve el dedo haciendo contacto case MotionEvent.ACTION_MOVE: // case MotionEvent.ACTION_CANCEL: // //Cuando se deja de hacer contacto case MotionEvent.ACTION_UP: //Cambia la dirección de movimiento del //objeto Elefante dependiendo del punto de //contacto if ((event.getx() * scalex) < elefante.x) elefante.dir = Elefante.LEFT; else if ((event.getx() * scalex) > elefante.x + elefante.animacion.getcuadro().getwidth()) elefante.dir = Elefante.RIGHT; else if ((event.gety() * scaley) < elefante.y) elefante.dir = Elefante.UP;

else if ((event.gety() * scaley) > elefante.y + elefante.animacion.getcuadro().getheight()) elefante.dir = Elefante.DOWN; return true; Finalmente en el método actualizaelefante() nos aseguramos de checar que el elefante no salga por ninguna de las orillas de la pantalla. /** * Método actualizaelefante * Llamado para actualizar el objeto Elefante * @param tiempo es el tiempo transcurrido desde la última * vez que se actualizó */ private void actualizaelefante(float tiempo) { //Guarda el tiempo transcurrido tiempotick += tiempo; //Actualiza mientras el tiempo transcurrido sea mayor al //tiempo de actualización while(tiempotick > tick) { tiempotick - = tick; //Actualiza la posición del objeto Elefante elefante.avanza(); //Checa colisión con las orillas de la pantalla if(elefante.x + elefante.animacion.getcuadro().getwidth() > framebuffer.getwidth() elefante.x < 0){ //Cambia la dirección en base a la dirección //actual if (elefante.dir == Elefante.RIGHT) elefante.dir = Elefante.LEFT; else elefante.dir = Elefante.RIGHT; //Actualiza la posición del objeto Elefante elefante.avanza(); //Si el sonido ya estaba en reproducción lo //detiene pool.stop(soundid); //Reproduce el efecto de sonido pool.play(soundid, 1, 1, 0, 0, 1); if(elefante.y + elefante.animacion.getcuadro().getheight() > framebuffer.getheight() elefante.y < 0){ //Cambia la dirección en base a la dirección

//actual if (elefante.dir == Elefante.UP) elefante.dir = Elefante.DOWN; else elefante.dir = Elefante.UP; //Actualiza la posición del objeto Elefante elefante.avanza(); //Si el sonido ya estaba en //reproducción lo detiene pool.stop(soundid); //Reproduce el efecto de sonido pool.play(soundid, 1, 1, 0, 0, 1);