Diferencia entre revisiones de «Usuario:ManuelRomero/Android2/Interfaz»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con '= Descripción general de la aplicación y programa principal = Realizaremos una pequeña api en android para ver diferentes funcionalidades. Para ello la actividad princ…')
 
 
Línea 1: Línea 1:
= Descripción general de la aplicación y programa principal =
+
=== Dscripción general de la aplicación ===
Realizaremos una pequeña api en android para ver diferentes funcionalidades.
+
  
Para ello la actividad principal nos visualizará las diferentes funcionalidades en una lista y se encargará de invocar a cada una de ellas cuando la seleccionemos
+
*Realizaremos una pequeña api en android para ver diferentes funcionalidades.
 +
*Para ello la actividad principal nos visualizará las diferentes funcionalidades en una lista  
 +
*Se encargará de invocar a cada una de ellas cuando la seleccionemos  
 +
*A continuación una lista a priori de las funcionalidades que queremos realizar
  
A continuación una lista a priori de las funcionalidades que queremos realizar  
+
      "CicloVida",
 +
          "SingleTouch",
 +
          "MultiTouch",
 +
          "Teclas",
 +
          "Acelerómetro",
 +
          "Asset",
 +
          "AlmacenamientoExterno",
 +
          "Sonido",
 +
          "Video",
 +
          "Ventana Completa",
 +
          "RenderView",
 +
          "image",
 +
          "Bitmap",
 +
          "Fuente"
 +
          "SurfaceView"
  
* "CicloVida",
+
*En el programa principal usaremos un '''ListActivity''', en lugar de un '''Activity'''
* "SingleTouch",
+
* "MultiTouch",
+
* "Teclas",
+
* "Acelerómetro",
+
* "Asset",
+
* "AlmacenamientoExterno",
+
* "Sonido",
+
* "Video",
+
* "Ventana Completa",
+
* "RenderView",
+
* "image",
+
* "Bitmap",
+
* "Fuente"
+
* "SurfaceView"
+
*
+
  
En el programa principal usaremos un ListActivity.
+
<br>
 
+
== Qué es un ListActivity ==
+
Es una clase que extiende de '''Activity''' y está especializada en trabajar con listas.
+
 
+
Es una actividad que muestra una lista de elementos cuyos valores se toman de algún origen de datos como una matriz o un cursor, y nos ofrece los controles de eventos cuando el usuario selecciona un elemento.
+
 
+
La propia clase implementa un layout contenedor que contiene un '''ListView''', por lo qu''e no necesitamos declararlo, ni asociar la actividad con ningún layout. ''
+
 
+
Esto implica que dentro de la activdad principal ListActivity, no necesitamos usar el callback '''SetContentView(..)'''
+
 
+
=== ListView ===
+
Un ListView es una clase que pertenece al grupo de ViewGroup (view contenedores)&nbsp; que tienen alguna funcionalidad añadida que le permite al usuario interactuar&nbsp; con ella.
+
 
+
Otras clases de este tipo (''Gallery, GridView, ImageSwitcher, ScrollView, TabHost'') .
+
 
+
Muestra una serie de View como una lista, otorgando al usuario la capacidad de navegar entre ellos utilizando la característica de desplazamiento vertical.
+
 
+
Para obtener los datos del array o cursor y asociarlos al ListView necesitamos un la clase '''Adapter'''
+
 
+
Debemos definir un A'''dapter(ArrayAdapter, CursorAdapter o SimpleCursorAdapter), '''&nbsp;para asignar al '''''ListView''''' de la '''''ListActivity''''' los valores que queramos visualizar. Para ello debemos usar el método ''setAdapter()'' de la clase ''ListView'' o como en el caso de nos ocupa usar el método ''setListAdapter'' de la clase '''ListAdapter'''
+
 
+
&nbsp;
+
 
+
ArrayAdapter adaptadorValores;
+
 
+
<nowiki>adaptadorValores=newArrayAdapter<String>( th</nowiki>is,
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; android.R.layout.simple_list_item_1,
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aplicaciones
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )
+
 
+
&nbsp;
+
 
+
Vemos tres parámetros al construir el '''ArrayAdapter'''
+
 
+
ü&nbsp; ''this'' è Es el context de la actividad, es decir la propia actividad
+
 
+
ü&nbsp; ''android.R.layout.simple_list_item_1'' è Es un layout predefinido que incorpora un ListView con el id android:list para incorporar en una lista de valores
+
 
+
ü&nbsp; ''aplicaciones'' è Es la lista de valores
+
 
+
Para asignar al ''ListView'' del ''ListActivity ''&nbsp;los valores que queremos visualizar, en este caso el contenido de la variable ''aplicaciones, ''&nbsp;invocamos al método '''setListAdapter''' y le pasamos el ''adapter'' previamente definido
+
 
+
setListAdapter(adaptadorValores);
+
 
+
=== 1.1.2     Gestionando eventos de selección ===
+
La clase ListActivity tiene un método protegido '''onListItemClick() '''&nbsp;el cual es invocado al seleccionar un elemento.
+
 
+
&nbsp;&nbsp;&nbsp; @Override
+
 
+
protected void onListItemClick(ListView valores, View vista, int pos, long id){
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp; super.onListItemClick(valores, vista, pos, id);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; . . .
+
 
+
}
+
 
+
Este método recibe 4 parámetros
+
 
+
Ø&nbsp; ''valores ''è Es el contenedor ListView que contiene la lista de view donde ha ocurrido el evento
+
 
+
Ø&nbsp; ''vista ''è &nbsp;''es el view del listView que ha sido cliqueado''
+
 
+
Ø&nbsp; ''pos ''è ''es la posición en el vector del elemento del ListView seleccionado''
+
 
+
Ø&nbsp; ''id ''è ''el id de la fila que ha sido seleccionada''
+
 
+
Lo primero que debemos hacer es invocar al método del&nbsp; la clase ListActivity
+
 
+
Y ahora lo que queremos es que se invoque a la clase que realice la acción seleccionada
+
 
+
Para ello usaremos un Intent, como ya sabemos. El nombre de la clase será el contenido del texto del elemento seleccionado. El código que habla por sí sólo quedará como sigue:
+
 
+
. . .
+
 
+
<nowiki>String app = aplicaciones[pos];</nowiki>
+
 
+
try{
+
 
+
&nbsp;&nbsp;&nbsp; Class accion = Class.forName("com.example.api_juegos."+app);
+
 
+
&nbsp;&nbsp;&nbsp; Intent i =new Intent(this,clase);
+
 
+
&nbsp;&nbsp;&nbsp; startActivity(i);
+
 
+
}catch(ClassNotFoundException e){
+
 
+
e.printStackTrace();
+
 
+
}
+
 
+
== 1.2       Combinando con más componentes View ==
+
Si queremos más controles View entonces sí que nos creamos un layout para ello; En este caso debemos definir también un ListView&nbsp;&nbsp; con el identificador android:id=”@'''android:list”'''
+
 
+
Podemos usar un TextView identificado '''@android:id/empty''' y si la lista está vacía se mostrará el contenido de este TextView.
+
 
+
&nbsp;
+
 
+
package com.example.api_juegos;
+
 
+
&nbsp;
+
 
+
import android.app.ListActivity;
+
 
+
import android.content.Intent;
+
 
+
import android.os.Bundle;
+
 
+
import android.util.Log;
+
 
+
import android.view.View;
+
 
+
import android.widget.ArrayAdapter;
+
 
+
import android.widget.ListView;
+
 
+
&nbsp;
+
 
+
public class Api extends ListActivity {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>String aplicaciones []={</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "CicloVida",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SingleTouch",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "MultiTouch",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Key",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Acelerómetro",
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"Asset",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Almacenamiento Externo",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Sonido",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Video",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Ventana Completa",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "RenderView",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Shape",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Bitmap",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Fuente",
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "SurfaceView"};
+
 
+
&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp; @Override
+
 
+
&nbsp;&nbsp;&nbsp; public void onCreate(Bundle savedInstanceState) {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(savedInstanceState);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.i("DEBUGANDI","Antes de setListAdapter");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>setListAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,aplicaciones));</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp; @Override
+
 
+
&nbsp;&nbsp;&nbsp; protected void onListItemClick(ListView valores, View vista, int pos, long id){
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp; super.onListItemClick(valores, vista, pos, id);
+
 
+
<nowiki>&nbsp;&nbsp;&nbsp; &nbsp; String app = aplicaciones[pos];</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp; try{
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class clase = Class.forName("com.example.api_juegos."+app);
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Intent i =new Intent(this,clase);
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startActivity(i);
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp; }catch(ClassNotFoundException e){
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp; &nbsp;
+
 
+
}&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp; Concepto de Listas ListView Adaptar (ArrayAdapter) y método Adapter.setAdaptaer
+
 
+
&nbsp;&nbsp;&nbsp; ListView vistaLista = (ListView)findViewById(R.id.''listaActividades'');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''i''("DEBUGANDO", "he llamado al super de oncreate");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''i''("DEBUGANDO", "definido vistaLista");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>ArrayAdapter <String> listaAdaptada = </nowiki>new <nowiki>ArrayAdapter<String>(</nowiki>this,android.R.layout.''simple_list_item_1'',aplicaciones);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''i''("DEBUGANDO", "Hecho arrayAdapter");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vistaLista.setAdapter(listaAdaptada);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''i''("DEBUGANDO", "adaptada lista");
+
 
+
'''ListView''' è es un View que muestra cada control View&nbsp; como un elemento&nbsp; de una lista otorgando al usuario la capacidad de navegar entre ellos utilizando la característica de desplazamiento vertical.
+
 
+
'''Adapter è&nbsp; '''&nbsp;es un objeto &nbsp;que va a leer datos de alguna fuente y va a genera datos&nbsp; para un control ListView,. Las clases Adapter más comunes son
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''ArrayAdapter'' è Los datos los cojo de un array
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''CursorAdapter''è Los datos los cojo de una base de datos como resultado de una consulta
+
 
+
'''AdapterViewè '''Un conjunto de controles View que muestran datos de alguna fuente
+
 
+
O usar directamente una subclase ListActivity que ya está preparada para visualizar con un ListView como en el ejemplo
+
 
+
== 1.3     Primera actividad : Ciclo de vida ==
+
Nuestra primera actividad de nuestro '''api''' es mostrar un ciclo de vida de una actividad.
+
 
+
En el wiki tenemos una pequeña explicación de los estados en los que se puede encontrar una actividad, y los métodos que se ejecutan al pasar de un estado a otro
+
 
+
Esta imagen está en la página de developer de android. La siguiente muestra los estados de las actividades
+
 
+
Se pretende que me muestre el estado en el que se encuentra la actividad y el instante en el que se ha producido.
+
 
+
La actividad debe mostrar el estado en el que se encuentra y el instante en el que se pasó a esa actividad.
+
 
+
Una posible idea es tener un método información al que le pasamos el&nbsp; nombre del estado y nos visualizará dicho string junto con el instante de tal acción
+
 
+
package com.example.api_juegos;
+
 
+
&nbsp;
+
 
+
import java.text.SimpleDateFormat;
+
 
+
&nbsp;
+
 
+
import android.app.Activity;
+
 
+
import android.os.Bundle;
+
 
+
import android.util.Log;
+
 
+
import android.widget.TextView;
+
 
+
&nbsp;
+
 
+
public class CicloVida&nbsp; extends Activity{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder builder = new StringBuilder();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView texto;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;long fecha;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;SimpleDateFormat df;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void informacion (String text){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fecha = System.currentTimeMillis();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; df = new SimpleDateFormat("h-m-s");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String curTime = df.format(fecha);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d("CicloVida ",text);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.append(curTime+"-"+text);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; builder.append('\n');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.setText(texto.getText()+builder.toString());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onCreate(Bundle estado){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(estado);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto = new TextView (this);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.setText(builder.toString());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(texto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; informacion("ejecución");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void onResume(){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onResume();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log("detenido");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void onPause(){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onPause();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log("pausado");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(isFinishing()){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log("terminado");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;
+
 
+
}
+
 
+
== 1.4     Segunda actividad : SingleTouch ==
+
Ahora pasamos a la segunda actividad
+
 
+
El evento singleTouch es un evento que se genera cuando se recibe un toque en la pantalla. La pantalla al ser&nbsp; táctil&nbsp; al pulsar o tocar en ella se genera este evento
+
 
+
Implementa la interfaz '''''OnTouchListener'''''
+
 
+
Esta interfaz sólo tiene un método abstracto que habrá que implementar
+
 
+
public abstract boolean onTouch(View vista, MotionEvent evento);
+
 
+
Para asociar el Listener a un objeto de tipo view y recoger los eventos de toque en dicho objeto se usa el método
+
 
+
View.setOnTouchListener()
+
 
+
La clase MotionEvent tiene tres métodos importantes
+
 
+
float getX() è Coordenada x
+
 
+
float getY() è Coordenada y
+
 
+
getAction() ètipo de evento táctil. Tenemos los siguientes posibles eventos
+
 
+
MotionEvent.ACTION_DOWN
+
 
+
MotionEvent.ACTION_MOVE
+
 
+
MotionEvent.ACTION_CANCEL
+
 
+
MotionEvent.ACTION_UP
+
 
+
&nbsp;
+
 
+
Hacer el programa para que cuando toque con el dedo ponga el tipo de evento y la posición en la que se ha producido
+
 
+
'''public''' '''class''' SingleTouch '''extends''' Activity '''implements''' OnTouchListener{
+
 
+
&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder texto <nowiki>= </nowiki>'''new''' StringBuilder();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView cajaTexto<nowiki>;</nowiki>
+
 
+
&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''void''' onCreate(Bundle instancia){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''super'''.onCreate(instancia);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto <nowiki>= </nowiki>'''new''' TextView('''this''');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("Multiple toque en pantalla");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setOnTouchListener('''this''');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(cajaTexto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp; @Override
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''boolean''' onTouch(View v, MotionEvent evento) {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.setLength(0);//Borramos lo que había en el texto
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''switch''' (evento.getAction()){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Presionamos un dedo
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''case''' MotionEvent.''ACTION_DOWN'':
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("Down, ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''break'''<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''case''' MotionEvent.''ACTION_UP'':
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("Up, ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''break'''<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''case''' MotionEvent.''ACTION_CANCEL'':
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("Cancel, ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''break'''<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''case''' MotionEvent.''ACTION_MOVE'':
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("Move, ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''break'''<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(", ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(evento.getX());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(", ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(evento.getY());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("\n");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText(texto.toString());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''return''' '''true'''<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
== 1.5  Tercera actividad : MultiTouch ==
+
El evento que se produce, la interfaz y el método abstracto son iguales que en el caso anterior, &nbsp;pero a diferencia de él, éste incorpora más eventos, ya que puedo presionar hasta con 10 dedos, dependiendo de lo que implemente el dispositivo. Normalmente dispositivos móviles no suele tener mucho sentido que implementen más de 5 toques
+
 
+
Aquí aparecen además de los eventos anteriores dos más con lo que en total tendremos
+
 
+
MotionEvent.ACTION_POINTER_DOWN
+
 
+
MotionEvent.ACTION_POINTER_UP
+
 
+
Ahora un único MotionEvent puede tener datos para varios eventos. De hecho los eventos anteriores ocurren cuando presionamos o levantamos un toque que no sea el primero.
+
 
+
Para saber cuántos eventos está gestionando un MotionEvent tenemos el método
+
 
+
MotionEvent.getPointerCount();
+
 
+
En el propio evento ''MotionEvent.getAction() ''nos viene codificado el tipo de evento y el índice de qué toque es el que en un momento dado está produciendo el evento si no es el primero
+
 
+
Para quedarnos sólo con el tipo de evento invocamos al método ''MotionEvent.getActionMasked()''
+
 
+
Respecto con el resto de toques que no sean el primero se gestionan en un vector.
+
 
+
Podemos acceder al índice y al identificador
+
 
+
int MotionEvent.getActionIndex()
+
 
+
int MotionEvent.getPointerIdentified()
+
 
+
=== 1.5.1     Identificador e Indice ===
+
int indice = MotionEvent.getActionIndex()
+
 
+
int identificardor = MotionEvent.getPointerIdentified(inidice)
+
 
+
'''Índice''' es un valor que corresponde a un índice de los arrays internos de MotionEvent, por lo que no corresponde con el toque después de primer 0,1,2,…
+
 
+
identificador es un entero que retorna el identificador del puntero del dedo, en este caso sí que corresponde al toque 0,1,2,…
+
 
+
package com.example.api_juegos;
+
 
+
import android.app.Activity;
+
 
+
import android.os.Bundle;
+
 
+
import android.util.Log;
+
 
+
import android.view.MotionEvent;
+
 
+
import android.view.View;
+
 
+
import android.view.View.OnTouchListener;
+
 
+
import android.widget.TextView;
+
 
+
&nbsp;
+
 
+
public class MultiTouch extends Activity implements OnTouchListener{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder texto = new StringBuilder();
+
 
+
TextView cajaTexto;
+
 
+
<nowiki>float[]x = new float[10];</nowiki>
+
 
+
<nowiki>float[]y = new float[10];</nowiki>
+
 
+
<nowiki>boolean[]tocado = new boolean[10];</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
public void onCreate(Bundle instancia){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(instancia);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto = new TextView(this);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("Multiple toque en pantalla");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setOnTouchListener(this);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(cajaTexto);
+
 
+
}
+
 
+
private void actualizaCajaTexto(){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.setLength(0);//Borramos lo que había en el texto
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>for (int i = 0; i<10; i++){</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>texto.append(tocado[i]);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(", ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>texto.append(x[i]);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(", ");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>texto.append(y[i]);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("\n");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText(texto.toString());
+
 
+
}
+
 
+
@Override
+
 
+
public boolean onTouch(View v, MotionEvent evento) {
+
 
+
//Primero obtenemos el tipo de evento
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int accion = evento.getActionMasked();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int indiceToque = evento.getActionIndex();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int idToque = evento.getPointerId(indiceToque);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch (accion){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Presionamos un dedo
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MotionEvent.ACTION_DOWN:
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MotionEvent.ACTION_POINTER_DOWN:
+
 
+
<nowiki>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tocado[idToque]=true;</nowiki>
+
 
+
<nowiki>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x[idToque]=(int)evento.getX(indiceToque);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>y[idToque]=(int)evento.getY(indiceToque);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MotionEvent.ACTION_UP:
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MotionEvent.ACTION_POINTER_UP:
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MotionEvent.ACTION_CANCEL:
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>tocado[idToque]=false;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>x[idToque]=(int)evento.getX(indiceToque);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>y[idToque]=(int)evento.getY(indiceToque);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case MotionEvent.ACTION_MOVE:
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int contadorToque=evento.getPointerCount();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>for(int i=0;i<contadorToque;i++){</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; indiceToque=i;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; idToque=evento.getPointerId(indiceToque);
+
 
+
<nowiki>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; x[idToque]=(int)evento.getX(indiceToque);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <nowiki>y[idToque]=(int)evento.getY(indiceToque);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; actualizaCajaTexto();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return true;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
}
+
 
+
&nbsp;
+
 
+
== 1.6  Cuarta actividad: el Teclado ==
+
Estos eventos se generan cuando la aplicación detecta acciones sobre el teclado. Estos eventos pueden ser del teclado, de la pantalla &nbsp;(soft ), teclado hard, si el dispositivo lo tiene o entradas del sistema.
+
 
+
Interfaz '''OnKeyListener''' con un único método '''onKey().'''
+
 
+
public boolean onKey (View vista, int keyCode, KeyEvent evento)
+
 
+
Los parámetros
+
 
+
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vista&nbsp; es la vista sobre que recibe el evento del teclado
+
 
+
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keyCode es el código de la tecla que he presionado; este código corresponde&nbsp; a una constante de la clase KeyEvent (Por ejemplo la tecla Z corresponde a la constante '''KeyCode.KEYCOD_Z'''
+
 
+
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; evento es el propio evento que se ha generado.
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
=== 1.6.1     Eventos de la clase ===
+
La clase KeyEvento tiene dos métodos
+
 
+
KeyEvent.getAction
+
 
+
KeyEvent.getUnicodeChar()
+
 
+
En el primer caso nos devuelve el tipo de evento generado, pudiendo ser uno de los siguientes
+
 
+
KeyEvent.ACTION_DOWN
+
 
+
KeyEvent.ACTION_UP
+
 
+
KeyEvent.ACTION_MULTIPLE
+
 
+
El Segundo método nos retorna el código Unicode de la tecla presionada para poder, por ejemplo escribirla.
+
 
+
=== 1.6.2     Trabajar con eventos del teclado sobre la vista ===
+
View.setFocusableInTouchMode(true);
+
 
+
View.requestFocus();
+
 
+
A continuación el código para conseguir este funcionamiento
+
 
+
Para poder ver el funcionamiento, debemos tener visible el teclado
+
 
+
Para ello vamos a ver el siguiente código
+
 
+
&nbsp;&nbsp; InputMethodManager teclado =
+
 
+
&nbsp;&nbsp; (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
+
 
+
&nbsp;&nbsp; teclado.toggleSoftInput(InputMethodManager.SHOW_FORCED,
+
 
+
&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputMethodManager.HIDE_IMPLICIT_ONLY);
+
 
+
Obtenemos una referencia de la clase que administra los métodos de entrada y la instanciamos a partir del servicio del sistema que nos informa de cual es el servicio del sistema para insertar datos por el teclado
+
 
+
Posteriormente llamamos al método toggleSoftInput que lo que hace es cambiar el método de entrada (teclado ) que se visualiza por la pantalla
+
 
+
void toggleSoftInput( int showFlags, int hideFlags)
+
 
+
Le pasamos dos flag tiene el siguiente valor que nos indica cuando cambiar de modo de visualizar a modo oculto
+
 
+
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputMethodManager.SHOW_FORCED&nbsp; è Se ha forzado que aparezca el teclado y no desaparecerá hasta que explícitamente se indique
+
 
+
·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputMethodManager.HIDE_IMPLICIT_ONLY è El teclado solo debe de estar oculto si el usuario lo indica de forma explícita
+
 
+
== 1.7  Quinta actividad  Acelerómetro ==
+
Es una funcionalidad que está muy de moda y es un reclamo muy interesante para el mundo de los juegos, y muchas aplicaciones interesantes.
+
 
+
El acelerómetro es un sensor que nos facilita la ubicación espacial del dispositivo respecto a un eje de tres coordenadas
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
El acelerómetro utiliza la interfaz '''SensorEventListener'''
+
 
+
Esta interfaz tiene dos métodos
+
 
+
public void onSensorChage(SensorEvent evento)
+
 
+
public void onAccurrencyChanged(Sensor sensor, int accurrency)
+
 
+
El primer método se invoca cuando se cambia la posición del móvil respecto a la última que tenía
+
 
+
Entre otros métodos y datos del SensorEvent tenemos la nueva posición que nos la da un vector
+
 
+
<nowiki>evento.values[0 ]</nowiki>
+
 
+
<nowiki>evento.values[1 ]</nowiki>
+
 
+
<nowiki>evento.values[2 ]</nowiki>
+
 
+
El segundo cuando cambian el número de sensores de acelerómetro que tiene el dispositivo.
+
 
+
A la hora de hacer la aplicación, primero debemos verificar que el dispositivo tenga acelerómetro, y en caso de que exista asociar el listener de este evento al Adminstrador del sistema de sensores
+
 
+
//Verificamos que el dispositivo tenga acelerómetros
+
 
+
SensorManager sm =(SensorManager) getSystemService (''SENSOR_SERVICE'');
+
 
+
<nowiki>List<Sensor>listaAcelerometros = sm.getSensorList(Sensor.</nowiki>''TYPE_ACCELEROMETER'');
+
 
+
if (listaAcelerometros.size()>0)
+
 
+
//Registramos el acelerómetro para recoger los eventos
+
 
+
sm.registerListener(this,listaAcelerometros.get(0),SensorManager.''SENSOR''
+
 
+
''_DELAY_GAME'');
+
 
+
&nbsp;
+
 
+
Una vez que hemos hecho esto &nbsp;ya solo queda juntar todo y nos quedará el siguiente código
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
'''package''' com.example.api_juegos;
+
 
+
&nbsp;
+
 
+
'''import''' java.util.List;
+
 
+
'''import''' android.app.Activity;
+
 
+
'''import''' android.hardware.Sensor;
+
 
+
'''import''' android.hardware.SensorEvent;
+
 
+
'''import''' android.hardware.SensorEventListener;
+
 
+
'''import''' android.hardware.SensorManager;
+
 
+
'''import''' android.os.Bundle;
+
 
+
'''import''' android.util.Log;
+
 
+
'''import''' android.view.KeyEvent<nowiki>;</nowiki>
+
 
+
'''import''' android.view.View<nowiki>;</nowiki>
+
 
+
'''import''' android.widget.TextView;
+
 
+
&nbsp;
+
 
+
'''public''' '''class''' Acelerometro&nbsp; '''extends''' Activity '''implements''' SensorEventListener{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer texto <nowiki>= </nowiki>'''new''' StringBuffer();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView cajaTexto<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''void''' onCreate(Bundle estado){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''super'''.onCreate(estado);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto <nowiki>= </nowiki>'''new''' TextView ('''this''');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("Controlando el acelerómetro");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Verificamos que el dispositivo tenga acelerómetros
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SensorManager sm =(SensorManager) getSystemService (''SENSOR_SERVICE'');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <nowiki>List<Sensor> listaAcelerometros = sm.getSensorList(Sensor.</nowiki>''TYPE_ACCELEROMETER'');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''if''' (listaAcelerometros.size()>0)
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Registramos el acelerómetro para recoger los eventos
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm.registerListener('''this''',listaAcelerometros.get(0),SensorManager.''SENSOR_DELAY_GAME'');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(cajaTexto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''void''' onSensorChanged(SensorEvent evento) {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // '''TODO''' Auto-generated method stub
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.setLength(0);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("X=");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(evento.values<nowiki>[0]);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("Y=");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(evento.values<nowiki>[1]);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append("Z=");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(evento.values<nowiki>[2]);</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String t = texto.toString();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''d''("KeyText",t);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText(t);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; @Override
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''void''' onAccuracyChanged(Sensor sensor, '''int''' accuracy) {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // '''TODO''' Auto-generated method stub
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
}&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
== 1.8  Sexta actividad: Assets ==
+
Queremos acceder a ficheros ubicados en un almacenamiento externo, generalmente una tarjeta SD
+
 
+
En '''android''' los ficheros que incorporamos a nuestra aplicación y que con ella los queremos distribuir pueden estar ubicados en '''res/ '''&nbsp;o en '''assets/'''
+
 
+
Los ficheros ubiados en '''res/''' deben cumplir ciertas restricciones, no siendo así en los ubicados en '''assets/'''
+
 
+
Queremos trabajar con ficheros que vamos a ubicar en '''assets/'''
+
 
+
Necesitmos un objeto de la clase '''AssetManager'''
+
 
+
Para instanciar &nbsp;obtenemos una referencia del método '''''getAssets() '''''&nbsp;la interfaz '''''Context'''''
+
 
+
AssetManager fileAdmin = context.getAssets();
+
 
+
Con este objeto podemos acceder a los ficheros. Para abrir los ficheros
+
 
+
InputStream file = fileAdmin.open(“datos.txt”);
+
 
+
La ubicación del fichero estará dentro del directorio '''assets. '''
+
 
+
Una vez que hemos abierto el fichero de manera tan sencilla ahora tenemos que leerlo. Si trabajamos con ficheros que ubicamos en nuestra aplicación hemos de saber que sólo se pueden abrir en modo de lectura, y no de escritura
+
 
+
Ahora nos queda leer los datos del fichero
+
 
+
Para ello trabajaremos con la clase '''ByteArrayOutputStream''', y usaremos el método '''read() '''de la clase &nbsp;'''InputStream'''
+
 
+
ByteArrayOutputStream byteStream = '''new''' ByteArrayOutputStream();
+
 
+
'''byte'''<nowiki>[] bytes = </nowiki>'''new''' '''byte'''<nowiki>[4096];</nowiki>
+
 
+
'''int''' len = 0;
+
 
+
'''while'''((len = fa.read(bytes))>0){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byteStream.write(bytes,0,len);
+
 
+
String texto = byteStream.toByteArray();
+
 
+
En nuestro api haremos que se visualice el contenido de un fichero llamado '''datos.txt''' que estará dentro de la capeta ''assets/datos.txt''
+
 
+
A continuación el código
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
'''package''' com.example.api_juegos;
+
 
+
&nbsp;
+
 
+
'''import''' java.io.ByteArrayOutputStream;
+
 
+
'''import''' java.io.IOException;
+
 
+
'''import''' java.io.InputStream;
+
 
+
'''import''' android.app.Activity;
+
 
+
'''import''' android.content.res.AssetManager;
+
 
+
'''import''' android.os.Bundle;
+
 
+
'''import''' android.util.Log;
+
 
+
'''import''' android.widget.TextView;
+
 
+
&nbsp;
+
 
+
'''public''' '''class''' Asset&nbsp; '''extends''' Activity {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer texto <nowiki>= </nowiki>'''new''' StringBuffer();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView cajaTexto<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''public''' '''void''' onCreate(Bundle estado){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''super'''.onCreate(estado);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto <nowiki>= </nowiki>'''new''' TextView ('''this''');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream file='''null'''<nowiki>;</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AssetManager adminAsset = getAssets();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(cajaTexto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''i''("ASSETS","Antes de abrirlo el fichero");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''try'''{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; file = adminAsset.open("datos.txt");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Log.''i''("ASSETS","Fichero abierto");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; String texto = leeFichero(file);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cajaTexto.setText(texto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }'''catch'''(IOException e){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("No puedo cargar el fichero”);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }'''finally'''{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''if''' (file!='''null''')
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''try'''{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file.close();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }'''catch'''(IOException e){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("No puedo cerrar el fichero");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''private''' String leeFichero(InputStream fa) '''throws''' IOException{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ByteArrayOutputStream byteStream = '''new''' ByteArrayOutputStream();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''byte'''<nowiki>[] bytes = </nowiki>'''new''' '''byte'''<nowiki>[4096];</nowiki>
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''int''' len = 0;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''while'''((len = fa.read(bytes))>0)
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byteStream.write(bytes,0,len);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.''i''("ASSET","justo antes de retornar");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''return''' '''new''' String(byteStream.toByteArray());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
}
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
== 1.9       Septima actividad  AlmacenamientoExterno ==
+
En este caso queremos almacenar la información en la tarjeta SD en lugar de almacenarlo junto a la aplicación y distribuirlo.
+
 
+
En este caso ya sí que podemos&nbsp; realizar operaciones de lectura y escritura
+
 
+
Para acceder a este dispositivo debemos tener permiso para acceder a este dispositivo de almacenamiento externo '''<nowiki><uses-permission>. </nowiki>'''Para el acceso a la tarjeta SD
+
 
+
<nowiki><user-permission android.name= ”android.permission.WRITE_EXTERNAL_STORAGE” ></nowiki>
+
 
+
Posteriormente debemos comprobar que existe o tenemos disponible dicho dispositivo
+
 
+
String estado = Enviroment.getExternalStorageState()
+
 
+
La clase Enviroment define entre otras cosas la constante '''''Enviroment.MEDIA_MOUNTED''''' Si el método anterior nos retorna dicho valor, implica que tendremos acceso en lectura y escritura a dicho dispositivo
+
 
+
Ahora nos queda obtener la ubicación de este dispositivo, es decir el directorio donde esté montado
+
 
+
File directorioSD= Enviroment.getExternalStorageDirectory()
+
 
+
En estos momentos podemos disponernos a abrir el fichero
+
 
+
File fichero = new File(directorioSD.getAbsolutePath()+File.''separator''+ "texto.txt");
+
 
+
Ahora a usar las clases de java de I/O para leer y escribir en ficheros.
+
 
+
El código de esta actividad completa se muestra a continuación
+
 
+
&nbsp;
+
 
+
package com.example.api_juegos;
+
 
+
&nbsp;
+
 
+
import java.io.BufferedReader;
+
 
+
import java.io.BufferedWriter;
+
 
+
import java.io.File;
+
 
+
import java.io.FileReader;
+
 
+
import java.io.FileWriter;
+
 
+
import java.io.IOException;
+
 
+
&nbsp;
+
 
+
import android.app.Activity;
+
 
+
import android.os.Bundle;
+
 
+
import android.os.Environment;
+
 
+
import android.widget.TextView;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
public class AlamcenamientoExterno&nbsp; extends Activity {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer texto = new StringBuffer();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView cajaTexto ;
+
 
+
&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void onCreate(Bundle estado){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(estado);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto = new TextView (this);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(cajaTexto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp; estadoSD = Environment.getExternalStorageState();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!estadoSD.equals(Environment.MEDIA_MOUNTED)){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("No está disponible la tarjeta SD");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File directorioSD= Environment.getExternalStorageDirectory();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File fichero = new File(directorioSD.getAbsolutePath() +
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File.separator + "texto.txt");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; escribeTexto(fichero,"Esto es una línea que quiero escribier
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; en mi fichero");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String t = leeTexto(fichero);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText(t);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(IOException e){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cajaTexto.setText("Error accediendo "+e.getMessage());
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;}
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private String leeTexto(File fichero) throws IOException {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated method stub
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader r = new BufferedReader( new FileReader(fichero));
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuilder texto = new StringBuilder();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String linea;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((linea=r.readLine())!=null){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append(linea);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; texto.append('\n');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; r.close();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return r.toString();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private void escribeTexto(File fichero, String texto) throws
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOException {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedWriter w = new BufferedWriter( new FileWriter(fichero));
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.write(texto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; w.close();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
}
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
== 1.10              "Sonido" ==
+
== 1.11              "Video", ==
+
== 1.12              "Ventana Completa", ==
+
== 1.13              "RenderView", ==
+
=== 1.13.1Programación básico de gráficos ===
+
Librería&nbsp; '''Skia'''
+
 
+
==== 1.13.1.1 Desbloquear la pantalla ====
+
la pantalla bloqueada pierde el brillo con el objetivo de economizar.
+
 
+
Por software podemos crear un bloqueo&nbsp; para que esto no ocurra y asignarlo a la aplicación.
+
 
+
Para hacerlo por software debemos dar permisos a la aplicación; Para que la aplicación solicite permisos cuando se instala (antes de estar ejecutándose), hay que especificarlo en el fichero '''Manifest '''&nbsp;con el elemento '''''uses-permission'''''
+
 
+
<nowiki><uses-permission></nowiki>
+
 
+
android.permission.WAKE_LOCK
+
 
+
<nowiki></uses_permission></nowiki>
+
 
+
Este permiso permite el uso de objetos PowerManager y WakeLock para evitar que el procesador deje de funcionar al 100% cuando no hay eventos en el sistema con el objetivo de ahorrar energía.
+
 
+
Son muchos los permisos que puede solicitar la aplicación al sistema antes de instalarse . ver http://developer.android.com/reference/android/Manifest.permission.html
+
 
+
Una vez hecho esto ya podemos definer un objeto de la clase '''WakeLock '''y un objeto de la clase '''PowerManager.'''
+
 
+
A partir del sistema ''context'' obtenemos un objeto de la clase '''PowerManager''' y con el método ''nextWakeLock ''&nbsp;instanciamos un objeto de la clase '''WaleLock.'''
+
 
+
Este método genera un wake lock (bloqueo para que no se duerma el sistema) según los dos parámetros que le pasemos:
+
 
+
''1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''El tipo de bloqueo que lo pasamos con una constante, en este caso queremos un bloqueo completo (''que no se duerma aunque no haya eventos en el sistema) ''PowerManager.''FULL_WAKE_LOCK''
+
 
+
2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Un&nbsp; tag (etiqueta que pongamos a ese bloqueo para identificarlo) ¿??
+
 
+
PowerManager power <nowiki>;</nowiki>
+
 
+
WakeLock bloqueo <nowiki>;</nowiki>
+
 
+
&nbsp;
+
 
+
power <nowiki>= (PowerManager) getSystemService(Context.</nowiki>''POWER_SERVICE'');
+
 
+
bloqueo <nowiki>= </nowiki>power.newWakeLock(PowerManager.''FULL_WAKE_LOCK'',"My bloqueo");
+
 
+
Una vez creado el bloqueo (en realidad el desbloqueo) hay que cargarlo con el método '''acquire() '''Y cuando la actividad finalice hay que desactívalo, o liberar el bloque con el método '''release(). '''Ambos métodos de la clase '''WaleLock '''Recordar que debemos invocarlo en los callback onResume() {… objetoWakeLock.acquire()…} y&nbsp; onPause{… objetoWakeLock.release()…}
+
 
+
==== 1.13.1.2 Pantalla completa ====
+
&nbsp;Consiste en eliminar del espacio visual elementos ajenos a nuestra aplicación o que formen parte de ella pero no de la vista principal como el barra del título, o menus o barra de notificación.
+
 
+
Especialmente en juegos queremos disponer de toda la pantalla
+
 
+
Para ello realizaremos las siguientes llamadas
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Haciendo la pantalla completa y sin los meús o títulos
+
 
+
requestWindowFeature(Window.''FEATURE_NO_TITLE'');
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getWindow().setFlags(WindowManager.LayoutParams.''FLAG_FULLSCREEN'',
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WindowManager.LayoutParams.''FLAG_FULLSCREEN'');
+
 
+
Vemos como el primer método quita la barra de título
+
 
+
El segundo se encarga que nuestra actividad ocupe toda la pantalla completa y no use la barra de notificación
+
 
+
==== 1.13.1.3 El código ====
+
Para probar la aplicación completa, reescribimos el método '''''SingleTouch ''&nbsp;'''
+
 
+
package com.example.api_juegos;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
&nbsp;
+
 
+
import android.app.Activity;
+
 
+
import android.content.Context;
+
 
+
import android.os.Bundle;
+
 
+
import android.os.PowerManager;
+
 
+
import android.os.PowerManager.WakeLock;
+
 
+
import android.util.Log;
+
 
+
import android.view.MotionEvent;
+
 
+
import android.view.View;
+
 
+
import android.view.View.OnTouchListener;
+
 
+
import android.view.Window;
+
 
+
import android.view.WindowManager;
+
 
+
import android.widget.TextView;
+
 
+
&nbsp;
+
 
+
public class SingleTouch extends Activity implements OnTouchListener{
+
 
+
&nbsp;
+
 
+
StringBuilder texto = new StringBuilder();
+
 
+
TextView cajaTexto;
+
 
+
&nbsp;
+
 
+
PowerManager power ;
+
 
+
WakeLock bloqueo;
+
 
+
public void onCreate(Bundle instancia){
+
 
+
super.onCreate(instancia);
+
 
+
//desbloqueo
+
 
+
power = (PowerManager)getSystemService(Context.POWER_SERVICE);
+
 
+
bloqueo = power.newWakeLock(PowerManager.FULL_WAKE_LOCK,"Mi bloqueo");
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
//Pantalla completa
+
 
+
requestWindowFeature(Window.FEATURE_NO_TITLE);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+
 
+
&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
 
+
&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
cajaTexto = new TextView(this);
+
 
+
cajaTexto.setText("Multiple toque en pantalla");
+
 
+
cajaTexto.setOnTouchListener(this);
+
 
+
setContentView(cajaTexto);
+
 
+
&nbsp; }
+
 
+
@Override
+
 
+
protected void onPause() {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onPause();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bloqueo.release();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d("SINGLETOUCH","On Pause");
+
 
+
}
+
 
+
@Override
+
 
+
protected void onResume() {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onResume();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bloqueo.acquire();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d("SINGLEtOUCH","On resume");
+
 
+
}
+
 
+
@Override
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean onTouch(View v, MotionEvent evento) {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Igual que antes, no ha cambiado nada
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
+
 
+
=== 1.13.2Dibujando en la interfaz de usuario ===
+
Hasta ahora dibujábamos (escribíamos) en un view que era una caja de texto que se dibujaba en la pantalla cuando invocamos a '''setContentView()'''
+
 
+
Ahora vamos a crear nuestra propia vista
+
 
+
Para ello tenemos que crear una clase que extienda de '''View'''
+
 
+
class RederView extends View{
+
 
+
&nbsp;//Codigo
+
 
+
}
+
 
+
&nbsp;
+
 
+
La clase View tiene un método que se llama '''onDraw(Canvas lienzo)''' que android lo&nbsp; invonca siempre que el view se tenga que dibujar
+
 
+
protected void onDraw (Canvas miLienzo){
+
 
+
//dibujar lo que quiero que aparezca en miLienzo….
+
 
+
}
+
 
+
Para que se redibuje a sí sola usamos el método '''invalidate().'''
+
 
+
De esta manera se volverá a dibujar una y otra vez, pero lo hará en el mismo hilo de ejecución, pues no hemos creado ningún thread
+
 
+
'''Canvas''' es una clase muy especial que engloba una api llamada '''Skia.'''
+
 
+
Con Canvas vamos a poder dibujar tanto formas, mapas de bits como texto
+
 
+
''Canvas ''&nbsp;en este caso dibuja dentro del espacio que ocupa View, no dibuja directamente en la pantalla, sino dentro de algún mapa de bit.
+
 
+
Vamos a hacer en nuestra api una aplicación que me muestre como el método '''invalídate() '''da una frecuencia de ejecución al método '''onDraw()''' como si de un bucle en un programa principal se tratara.
+
 
+
Para ello usaremos el método de Canvas
+
 
+
Canvas.drawRGB( int red, int green, int blue) que da un color&nbsp; de fondo a la pantalla según los colores que le pasemos
+
 
+
demosle colores aleatorios
+
 
+
canvas.drawRGB(rand.nextInt(256),rand.nextInt(256),rand.nextInt(256));
+
 
+
Observemos el código completo y ejecutalo (cuidado, no te marees).
+
 
+
intenta relentizar la ejecución
+
 
+
//package e imports igual que en el caso anterior ... creo…
+
 
+
&nbsp;
+
 
+
public class RenderView&nbsp; extends Activity {
+
 
+
&nbsp;
+
 
+
PowerManager power ;
+
 
+
WakeLock bloqueo ;
+
 
+
//Creamos nuestra propia view
+
 
+
class MiRender extends View{
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Random rand = new Random();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; public MiRender(Context contexto){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; super (contexto);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; protected void onDraw(Canvas canvas){
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;canvas.drawRGB(rand.nextInt(256),
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rand.nextInt(256),
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rand.nextInt(256));
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; invalidate();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; }
+
 
+
}
+
 
+
@Override
+
 
+
protected void onCreate(Bundle estado) {
+
 
+
super.onCreate(estado);
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+
 
+
//Desbloqueando la pantalla configurando
+
 
+
power = (PowerManager) getSystemService(Context.POWER_SERVICE);
+
 
+
bloqueo = power.newWakeLock(PowerManager.FULL_WAKE_LOCK,"Mi bloqueo");
+
 
+
&nbsp;
+
 
+
//Haciendo la pantalla completa y sin los meús o títulos
+
 
+
requestWindowFeature(Window.FEATURE_NO_TITLE);
+
 
+
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WindowManager.LayoutParams.FLAG_FULLSCREEN);
+
 
+
&nbsp;
+
 
+
setContentView(new MiRender(this));
+
 
+
&nbsp;&nbsp;&nbsp; }
+
 
+
@Override
+
 
+
protected void onPause() {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onPause();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bloqueo.release();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d("SINGLETOUCH","On Pause");
+
 
+
}
+
 
+
@Override
+
 
+
protected void onResume() {
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onResume();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bloqueo.acquire();
+
 
+
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Log.d("SINGLEtOUCH","On resume");
+
 
+
}
+
 
+
}
+
 
+
&nbsp;
+
 
+
== 1.14              "image", ==
+
== 1.15              "Bitmap", ==
+
== 1.16              "Fuente" ==
+
== 1.17  "SurfaceView" ==
+

Última revisión de 00:33 22 may 2013

Dscripción general de la aplicación

  • Realizaremos una pequeña api en android para ver diferentes funcionalidades.
  • Para ello la actividad principal nos visualizará las diferentes funcionalidades en una lista
  • Se encargará de invocar a cada una de ellas cuando la seleccionemos
  • A continuación una lista a priori de las funcionalidades que queremos realizar
   	   "CicloVida",
          "SingleTouch",
          "MultiTouch", 
          "Teclas",
          "Acelerómetro",
          "Asset",
          "AlmacenamientoExterno",
          "Sonido",
          "Video",
          "Ventana Completa",
          "RenderView",
          "image",
          "Bitmap",
          "Fuente"
          "SurfaceView"
  • En el programa principal usaremos un ListActivity, en lugar de un Activity