Interfaces de usuario [Entradas en Android] M. en C. Sergio Luis Pérez Pérez UAM C UAJIMALPA , M ÉXICO, D. F. Trimestre 14-P Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 1 / 34 Uso de hilos en Android Uso de hilos en Android 1 Uso de hilos en Android 2 Eventos de usuario 3 Teclado 4 Pantalla táctil 5 Sensores Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 2 / 34 Uso de hilos en Android Uso de hilos en Android I Cada vez que se ejecuta una aplicación en Android el sistema crea un proceso Linux. Si es una aplicación Java el proceso la ejecuta sobre su propia máquina virtual Dalvik. Si es código nativo se ejecuta directamente. El proceso contiene un hilo por defecto llamado hilo principal. Este hilo principal ejecuta los métodos onCreate(), onDraw() y onKeyDown(). Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 3 / 34 Uso de hilos en Android Uso de hilos en Android II Si se desea realizar un trabajo intensivo, como esperar datos de Internet, se debe encargar a otro hilo. Todo hilo seguirá creado por una aplicación seguirá ejecutándose aún cuando la aplicación se encuentre en segundo plano. Otro problema surge cuando dos hilos tratan de acceder a la misma variable al mismo tiempo. Para evitar que un hilo lea datos que están siendo modificados por otro hilo se utiliza la exclusión mutua. En Java, la exclusión mutua se logra mediante la palabra reservada synchronized. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 4 / 34 Uso de hilos en Android Uso de hilos en Android III synchronized permite definir una región crı́tica. El proceso que realiza es el siguiente: 1 2 3 Cada vez que se entra a un método o bloque marcado con esta palabra se pregunta si otro hilo a entrado a la región critica de ese objeto. Si ningún otro hilo ha entrado entonces el actual entra normalmente. Si otro hilo ha entrado entonces el hilo actual es suspendido y espera a que termine el que ya estaba dentro. Las regiones crı́ticas son definidas a nivel de objeto más no de clase, por lo que las regiones crı́ticas de varias instancias son independientes. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 5 / 34 Uso de hilos en Android Uso de hilos en Android IV La región crı́tica se define por clase, es decir, aunque se haya utilizado synchronized en varios métodos, en realidad solo habrá una región crı́tica. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 6 / 34 Eventos de usuario Eventos de usuario 1 Uso de hilos en Android 2 Eventos de usuario 3 Teclado 4 Pantalla táctil 5 Sensores Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 7 / 34 Eventos de usuario Eventos de usuario I Android captura los eventos de forma homogénea y se los pasa a la clase encargada para procesarlos. Los eventos serán procesados generalmente por un objeto de tipo View. Los eventos son atendidos por: Event Listener y Event Handler. Un Event Listener es una interfaz de la clase View y contiene un método callback que debe ser registrado. A continuación se presentan algunos métodos con sus interfaces Event Listener: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 8 / 34 Eventos de usuario Eventos de usuario II Event Listener I onClick: OnClickListener. Es llamado cuando se selecciona un elemento. Responde a la pantalla táctil, las teclas de navegación y el trackball. onLongClick: OnLongClickListener. Es llamado cuando un elemento es seleccionado por más de un segundo. onFocusChange: OnFocusChangeListener. Es llamado cuando se navega dentro o fuera de un elemento. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 9 / 34 Eventos de usuario Eventos de usuario III Event Listener II onKey: OnKeyListener. Es llamado cuando se presiona o se suelta una tecla. onTouch: OnTouchListener. Es llamado cuando se presiona, se suelta o se se desplaza en la pantalla táctil. onCreateContextMenu: onCreateContextMenuListener. Es llamado cuando se crea un menú de contexto. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 10 / 34 Eventos de usuario Eventos de usuario IV Implementación de un Event Listener. (Clase anónima) Button boton = (Button)findViewById(R.id.boton); boton.setOnClickListener( new OnClickListener (){ public void onClick(View vista){ //Instrucciones } }); Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 11 / 34 Eventos de usuario Eventos de usuario V Implementación de un Event Listener. (Implementar interfaz) public class Ejemplo extends Activity{ public void onCreate(Bundle savedValues){ Button boton = (Button)findViewById(R.id.boton); boton.setOnClickListener(new Ejemplo()); } } public class Ejemplo implements OnClickListener{ public void onClick(View vista){ //Instrucciones } } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 12 / 34 Eventos de usuario Eventos de usuario VI El Event Handler permite crear varios métodos callback para los descendientes que sean creados a partir de View. Con Event Handler se pueden utilizar los manejadores por defecto para los descendientes de View. Utilizando los métodos por defecto ya no es necesario implementar las interfaces ni registrar los métodos callback (como setOnClickListener()). A continuación se presentan algunos de estos métodos: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 13 / 34 Eventos de usuario Eventos de usuario VII Handle Listener onKeyDown(int keyCode, KeyEvent e): Es llamado cuando una tecla es presionada. onKeyUp(int keyCode, KeyEvent e): Es llamado cuando una tecla deja de ser presionada. onTrackballEvent(MotionEvent me): Es llamado cuando se mueve el trackball. onTouchEvent(MotionEvent me): Es llamado cuando se presiona la pantalla táctil. onFocusChanged(boolean obtenerFoco, int direccion, Rect rectanguloFoco): Es llamado cuando se cambia el foco. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 14 / 34 Teclado Teclado 1 Uso de hilos en Android 2 Eventos de usuario 3 Teclado 4 Pantalla táctil 5 Sensores Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 15 / 34 Teclado Ejemplo 1 I 1 Crear un proyecto y agregar una etiqueta TextView en la actividad principal. 2 Agregar el siguiente código para que cada que sea presionada una tecla aparezca algún mensaje en la etiqueta. 3 Cada vez que una tecla es presionada el método onKeyDown es llamado. 4 El primer parámetro de onKeyDown (int) denota el código de la tecla presionada y el segundo (KeyEvent) permite obtener la información relacionada al evento. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 16 / 34 Teclado Ejemplo 1 II 5 Los eventos de teclado pueden ser recogidos sólo desde aquellas vistas que tienen la propiedad focusable=“true”. @Override public boolean OnKeyDown(int codigoTecla, KeyEvent evento){ super.onKeyDown(codigoTecla, evento); TextView vista = (TextView)findViewById(R.id.miEtiqueta); switch(codigoTecla){ case KeyEvent.KEYCODE DPAD UP:{ vista.setText(“Arriba”); }break; default:{ vista.setText(“Otra tecla”); }break; } return true; } Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 17 / 34 Pantalla táctil Pantalla táctil 1 Uso de hilos en Android 2 Eventos de usuario 3 Teclado 4 Pantalla táctil 5 Sensores Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 18 / 34 Pantalla táctil Pantalla táctil I La pantalla táctil es el principal dispositivo de entrada. Mediante la pantalla táctil es posible seleccionar, arrastrar y soltar cualquier elemento. También se usa como sustito del teclado en los dispositivos que no cuentan con uno fı́sico. Otra forma de utilizar la pantalla es para los gestos (gestures), soportado a partir del SDK 1.6. El multi-touch es otra posibilidad disponible a partir del SDK 2.0. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 19 / 34 Pantalla táctil Pantalla táctil II El manejo básico de la pantalla táctil es mediante el método onTouchEvent de un clase View. El método onTouchEvent devuelve un objeto de tipo MotionEvent. También se puede implementar mediante la interfaz onTouchListener. Los principales métodos de la clase MotionEvent son: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 20 / 34 Pantalla táctil Pantalla táctil III MotionEvent getAction(): Tipo de acción realizada: ACTION DOWN, ACTION UP, ACTION MOVE, ACTION CANCEL. getX(), getY(): Posición de la pulsación. getDownTime(): Tiempo en milisegundos en que el usuario presionó por primera vez en una cadena de pulsaciones. getEventTime(): Tiempo en milisegundos del evento actual. getPressure(): Estima la presión de la pulsación entre [0, 1]. getSize(): Grosor de la pulsación entre [0, 1]. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 21 / 34 Pantalla táctil Ejemplo: Pantalla Táctil I 1 Crear un proyecto llamado Pantalla, cuya actividad principal se llame main.xml. 2 Cambie el layout de la actividad main.xml a un LinearLayout (Vertical). 3 Agregue una etiqueta TextView (label) y un ScrollView (scroll), además de otra etiqueta TextView (labelScroll) dentro del ScrollView. 4 En el método onCreate() de la clase principal (Main.java) haga referencia a la etiqueta label. TextView entrada = (TextView) findViewById(R.id.label); Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 22 / 34 Pantalla táctil Ejemplo: Pantalla Táctil II 5 Cree una clase (PantallaTactil) que implemente la interfaz OnTouchListener y su método onTouch. class PantallaTactil implements OnTouchListener{ public boolean onTouch(View vista, MotionEvent evento){ TextView salida = (TextView) findViewById(R.id.labelScroll); salida.append(evento.toString()+“\n”); } } 6 En el método onCreate agregue el siguiente código: entrada.setOnTouchListener(new PantallaTactil()); Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 23 / 34 Sensores Sensores 1 Uso de hilos en Android 2 Eventos de usuario 3 Teclado 4 Pantalla táctil 5 Sensores Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 24 / 34 Sensores Sensores I Los sensores son los dispositivos con los que se puede obtener información del mundo exterior (con excepción de la cámara, el micrófono y el GPS). Se pueden manipular de forma homogénea. Aunque es posible emular el comportamiento de los sensores resulta muy laborioso, es mejor contar con algún dispositivo. Se puede acceder a los sensores internos del dispositivo a través de las clases: Sensor, SensorEvent, SensorManager y la interfaz SensorEventListener. Los sensores pueden variar según el dispositivo. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 25 / 34 Sensores Sensores II Clase Sensor public float getMaximumRange(): Rango máximo en las unidades del sensor. public String getName(): Nombre del sensor. public float getPower(): Potencia usada por el sensor mientras está en uso. public float getResolution(): Resolución en las unidades del sensor. public int getType(): Tipo genérico del sensor. public int getVersion(): Versión del sensor. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 26 / 34 Sensores Sensores III Algunas constantes de la clase Sensor I Acelerómetro (TYPE ACCELEROMETER): Mide la aceleración por gravedad y cambios de movimiento. Campo magnético (TYPE MAGNETIC FIELD): Brújula, detecta campos magnéticos. Giroscopio (TYPE GYROSCOPE): Detecta giros. Orientación (TYPE ORIENTATION): Indica la dirección a la que apunta el dispositivo. Luz ambiental (TYPE LIGHT): Ajusta la iluminación de pantalla. Proximidad (TYPE PROXIMITY): Indica si hay un objeto a menos de 5 cm. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 27 / 34 Sensores Sensores IV Algunas constantes de la clase Sensor II Presión atmosférica (TYPE PRESSURE): Altı́metro, barómetro. Gravedad (TYPE GRAVITY): Mide la aceleración debida a la gravedad. Acelerómetro lineal (TYPE LINEAR ACCELERATION): Mide las aceleraciones debidas a la gravedad. Vector de rotación (TYPE ROTATION VECTOR): Detecta giros. Temperatura ambiental (TYPE AMBIENT TEMPERATURE): Mide la temperatura del aire. Humedad relativa (TYPE RELATIVE HUMIDITY): Mide el punto de rocı́o, humedad absoluta y relativa. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 28 / 34 Sensores Ejemplo: Sensores disponibles I Antes de utilizar los sensores es necesario conocer los que tiene disponibles el dispositivo. 1 Crear un proyecto llamado Sensores, cuya actividad principal se llame main.xml. 2 Cambie el layout de la actividad main.xml a un LinearLayout (Vertical). 3 Agregue una etiqueta TextView (salida). 4 En el método onCreate() de la clase principal (Main.java) haga referencia a la etiqueta salida y ponga el siguiente código. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 29 / 34 Sensores Ejemplo: Sensores disponibles II TextView salida = (TextView) findViewById(R.id.salida); SensorManager sensor = (SensorManager)getSystemService(SENSOR SERVICE); List<Sensor> listaSensores = sensor.getSensorList(Sensor.TYPE ALL); salida.setText(); for(Sensor s: listaSensores){ salida.append(s.getName()+“\n”); } 5 Ejecute su aplicación y observe los sensores que posee su dispositivo. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 30 / 34 Sensores Ejemplo: Acceso a los datos de los sensores disponibles I En este ejercicio se desplegarán los datos de los sensores disponibles conforme cambien en tiempo real. También se verá la creación de vistas desde código Java. 1 Crear un proyecto llamado SensoresDatos, cuya actividad principal se llame main.xml. 2 Cambie el layout de la actividad main.xml a un LinearLayout (Vertical) y cambie su id a layout. 3 Elimine el TextView que aparece por defecto en el layout principal. 4 En la clase principal Main.java agregue dos variables globales a la clase: Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 31 / 34 Sensores Ejemplo: Acceso a los datos de los sensores disponibles II private TextView arregloEtiquetas[][]; private List<Sensor> listaSensores; 5 Implemente el método onSensorChanged de la interfaz SensorEventListener como se muestra en la siguiente tabla. 6 Observe que el método onSensorChanged pone todo su código dentro de una región crı́tica, ¿por qué? 7 En el método onCreate agregue el código que le presente el profesor. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 32 / 34 Sensores Ejemplo: Acceso a los datos de los sensores disponibles III class EscuchaSensores implements SensorEventListener{ @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {} @Override public void onSensorChanged(SensorEvent event) { synchronized(this){ int n = 0; for(Sensor sensor: listaSensores){ if(event.sensor == sensor){ for(int i = 0; i < event.values.length; i++){ arregloEtiquetas[n][i].setText(String.valueOf(event.values[i])); }} n++;}}} Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 33 / 34 Sensores Ejemplo: Acceso a los datos de los sensores disponibles IV 8 Ejecute su aplicación y observe como cambian los valores de los sensores que posee su dispositivo. Sergio Luis Pérez (UAM C UAJIMALPA) Curso de Interfaces de Usuario 34 / 34