tema del 24 al 37

71
24 - Reproducción de audio (archivo contenido en una tarjeta SD) El objetivo de este concepto es acceder a un archivo mp3 almacenado en la tarjeta SD de nuestro equipo. Problema: Disponer un botón con la etiqueta: "Gato", luego cuando se presione reproducir el archivo de audio respectivo. El archivo de sonido almacenarlo en la tarjeta SD. Luego de crear el proyecto debemos ejecutar la aplicación en modo depuración para poder acceder a la tarjeta SD que crea el emulador Android. Para ejecutar la aplicación en modo "Debug" presionamos el botón derecha del mouse sobre el proyecto y seleccionamos la opción "Debug A" "Android Aplication": Una vez que se este ejecutando la aplicación (no importa que todavía no hemos implementado su funcionalidad) procedemos a abrir la ventana "File Explorer" de Android. Seleccionamos del menú de opciones de Eclipse: Window -> Show View -> Other :

Upload: equipotresamp

Post on 11-Aug-2015

141 views

Category:

Software


4 download

TRANSCRIPT

Page 1: TEMA DEL 24 AL 37

24 - Reproducción de audio (archivo contenido en una tarjeta SD)

El objetivo de este concepto es acceder a un archivo mp3 almacenado en la tarjeta SD de nuestro equipo.

Problema:

Disponer un botón con la etiqueta: "Gato", luego cuando se presione reproducir el archivo de audio respectivo. El archivo de sonido almacenarlo en la tarjeta SD.

Luego de crear el proyecto debemos ejecutar la aplicación en modo depuración para poder acceder a la tarjeta SD que crea el emulador Android. Para ejecutar la aplicación en modo "Debug" presionamos el botón derecha del mouse sobre el proyecto y seleccionamos la opción "Debug A" "Android Aplication":

Una vez que se este ejecutando la aplicación (no importa que todavía no hemos implementado su funcionalidad) procedemos a abrir la ventana "File Explorer" de Android. Seleccionamos del menú de opciones de Eclipse: Window -> Show View -> Other :

Page 2: TEMA DEL 24 AL 37

Y en esta ventana seleccionamos Android -> FileExplorer:

Page 3: TEMA DEL 24 AL 37

Ahora podemos ver la ventana donde administramos los archivos contenidos en la tarjeta SD que emula el "Android Virtual Device":

Page 4: TEMA DEL 24 AL 37

En la carpeta sdcard debemos subir el archivo mp3 (debemos seleccionar esta carpeta con el mouse)Esto lo hacemos mediante un botón que aparece en la parte derecha de esta ventana "Push a file onto device", luego de esto tenemos el archivo montado en la tarjeta SD:

Ahora implementemos la interfaz de nuestra aplicación (un solo botón) que cuando se presione llame al método ejecutar:

Page 5: TEMA DEL 24 AL 37

El código fuente es:

package com.androidya.proyecto021;

import android.app.Activity;import android.media.MediaPlayer;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.View;

public class MainActivity extends Activity {

Page 6: TEMA DEL 24 AL 37

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

public void ejecutar(View v) { Uri datos = Uri.parse(Environment.getExternalStorageDirectory() .getPath() + "/gato.mp3"); MediaPlayer mp = MediaPlayer.create(this, datos); mp.start(); }

}

Creamos un objeto de la clase Uri llamando al método parse donde indicamos el path y nombre del archivo a recuperar:

Uri datos = Uri.parse(Environment.getExternalStorageDirectory().getPath() +"/gato.mp3");

Creamos el objeto de la clase MediaPlayer pasando ahora la referencia del objeto de la clase Uri:

MediaPlayer mp=MediaPlayer.create(this, datos);

Iniciamos la reproducción del mp3:

mp.start();

Recordar que para ejecutar este proyecto se debe subir un archivo mp3 llamado "gato.mp3" a la tarjeta SD.

Page 7: TEMA DEL 24 AL 37

25 - Reproducción de audio (archivo localizado en internet)

Ahora vamos a ver los pasos para reproducir un archivo almacenado en un servidor de internet.

Problema:

Disponer un botón con la etiqueta: "Gato", luego cuando se presione reproducir el archivo de audio respectivo. El archivo de sonido se encuentra almacenado en http://www.codigofuenteya.com.ar/recursos/gato.mp3

El primer paso es modificar el archivo AndroidManifest.xml donde autorizamos a la aplicación a acceder a recursos localizados en internet:

Creamos la interfaz de la aplicación e inicializamos el evento On click del Button con el método que implementaremos:

Page 8: TEMA DEL 24 AL 37

El código fuente es:

package com.androidya.proyecto022;

import java.io.IOException;

import android.app.Activity;import android.media.MediaPlayer;import android.os.Bundle;import android.view.Menu;import android.view.View;

Page 9: TEMA DEL 24 AL 37

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

public void ejecutar(View v) { MediaPlayer mp = new MediaPlayer(); try { mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3"); mp.prepare(); mp.start(); } catch (IOException e) { } }

}

Para recuperar un archivo mp3 de internet procedemos de la siguiente manera, primero creamos un objeto de la clase MediaPlayer:

MediaPlayer mp=new MediaPlayer();

Luego llamamos al método setDataSource indicando la dirección de internet donde se almacena el archivo mp3:

mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3");

Llamamos al método prepare y seguidamente llamamos a start:

mp.prepare(); mp.start();

Todo esto lo hacemos en un bloque try/catch para capturar excepciones de tipo IOException.

Esta primera aproximación para ejecutar un mp3 localizado en internet bloquea la aplicación hasta que se carga por completo el archivo, es decir queda ejecutándose el método mp.prepare() hasta que finaliza la recuperación en forma completa.

Page 10: TEMA DEL 24 AL 37

Problema:

Confeccionar otra aplicación similar a la anterior pero que no se congele la interfaz de la aplicación mientras se carga el mp3. Mostrar un mensaje que el archivo se está cargando.

Desarrollamos un nuevo proyecto, asignamos el permiso de acceder a internet en el archivo AndroidManifest.xmp y creamos una interfaz similar al problema anterior.

El código fuente es:

package com.androidya.proyecto023;

import java.io.IOException;

import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnPreparedListener;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.widget.Toast;

public class MainActivity extends Activity implements OnPreparedListener{ MediaPlayer mp;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

public void ejecutar(View v) { mp = new MediaPlayer(); mp.setOnPreparedListener(this); try { mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3"); mp.prepareAsync(); } catch (IOException e) { } Toast t = Toast.makeText(this, "Espere un momento mientras se carga el mp3", Toast.LENGTH_SHORT); t.show(); }

Page 11: TEMA DEL 24 AL 37

public void onPrepared(MediaPlayer mp) { mp.start(); }

}

Para poder capturar el evento que el archivo se terminó de recuperar debemos implementar la interface OnPreparedListener:

public class Proyecto023Activity extends Activity implements OnPreparedListener {

Con esto decimos que nuestra clase implementará el método onPrepared donde iniciamos la ejecución del mp3:

public void onPrepared(MediaPlayer mp) { mp.start(); }

En el evento click del botón creamos el objeto de la clase MediaPlayer, le pasamos al método setOnPreparedListener la dirección del objeto que capturará el evento de que el recurso está completo. Luego llamamos a los métodos setDataSource y prepareAsync para inicializar la carga del mp3. Finalmente mostramos un mensaje para informar al usuario que el archivo se está descargando:

public void ejecutar(View v) { mp=new MediaPlayer(); mp.setOnPreparedListener(this); try { mp.setDataSource("http://www.codigofuenteya.com.ar/recursos/gato.mp3"); mp.prepareAsync(); }catch(IOException e) { } Toast t=Toast.makeText(this,"Espere un momento mientras se carga el mp3", Toast.LENGTH_SHORT); t.show(); }

Page 12: TEMA DEL 24 AL 37

26 - Reproducción de audio utilizando el reproductor propio de Android (vía Intent)

Otra forma de ejecutar un archivo mp3 es mediante el reproductor interno de Android. Esta aplicación reproduce todos los formatos soportados por Android y tiene una interfaz que le será familiar al usuario de nuestra aplicación.

Problema:

Disponer un botón con la etiqueta: "Ejecutar mp3 con el reproductor propio de Android", luego cuando se presione reproducir el archivo de audio respectivo con el reproductor de Android via Intent. El archivo de sonido almacenarlo en la tarjeta SD.

Luego de crear el proyecto debemos ejecutar la aplicación en modo depuración para poder acceder a la tarjeta SD que crea el emulador Android. Para ejecutar la aplicación en modo "Debug" presionamos el botón derecha del mouse sobre el proyecto y seleccionamos la opción "Debug A" "Android Aplication":

Una vez que se este ejecutando la aplicación (no importa que todavía no hemos implementado su funcionalidad) procedemos a abrir la ventana "File Explorer" de Android. Seleccionamos del menú de opciones de Eclipse: Window -> Show View -> Other :

Page 13: TEMA DEL 24 AL 37

Y en esta ventana seleccionamos Android -> FileExplorer:

Page 14: TEMA DEL 24 AL 37

Ahora podemos ver la ventana donde administramos los archivos contenidos en la tarjeta SD que emula el "Android Virtual Device":

Page 15: TEMA DEL 24 AL 37

En la carpeta sdcard debemos subir el archivo mp3 (debemos seleccionar esta carpeta con el mouse)Esto lo hacemos mediante un botón que aparece en la parte derecha de esta ventana "Push a file onto device", luego de esto tenemos el archivo montado en la tarjeta SD:

Creamos la interfaz con el Button y especificamos el evento On click:

Page 16: TEMA DEL 24 AL 37

El código fuente es:

package com.androidya.proyecto024;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.Menu;import android.view.View;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) {

Page 17: TEMA DEL 24 AL 37

super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

public void ejecutar(View v) { Intent intent = new Intent(android.content.Intent.ACTION_VIEW); Uri data = Uri.parse("file:///sdcard" + "/gato.mp3"); intent.setDataAndType(data, "audio/mp3"); startActivity(intent); }}

Creamos un objeto de la clase Intent y un objeto de la clase Uri referenciando al archivo mp3 almacenado en la tarjeta SD. Indicamos mediante el método setDataAndType el Uri y el tipo de archivo a reproducir. Activamos la aplicación mediante startActivity.

Page 18: TEMA DEL 24 AL 37

27 - Grabación de audio mediante el grabador provisto por Android (via Intent)

La forma más sencilla de capturar audio en Android es mediante el grabador que provee el sistema operativo Android. Invocamos la aplicación de grabación (tiene como ventana que la interfaz le es familiar al usuario, ya que muchas aplicaciones utilizan esta característica) y luego recuperamos el audio grabado.

Problema:

Disponer dos objetos de la clase Button con las etiquetas "Grabar" y "Reproducir". Cuando se presione el primer botón proceder a activar la grabadora provista por Android. Cuando se presione el segundo botón reproducir el audio grabado.

Crear la interfaz e inicializar los eventos On click de cada botón:

El código fuente es:

package com.javaya.proyecto025;

import android.net.Uri;import android.os.Bundle;

Page 19: TEMA DEL 24 AL 37

import android.provider.MediaStore;import android.view.Menu;import android.view.View;

public class MainActivity extends Activity { int peticion = 1; Uri url1;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

public void grabar(View v) { Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); startActivityForResult(intent, peticion); }

public void reproducir(View v) { MediaPlayer mediaPlayer = MediaPlayer.create(this, url1); mediaPlayer.start(); }

protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == peticion) { url1 = data.getData(); } }

}

Cuando se presiona el botón de grabar el audio mediante un Intent activamos la aplicación de grabación propia de Android.Seguidamente llamamos al método startActivityForResult para poder recuperar la grabación luego de finalizada a través del método onActivityResult:

public void grabar(View v) { Intent intent = new Intent(MediaStore.Audio.Media.RECORD_SOUND_ACTION); startActivityForResult(intent, peticion); }

Debemos pasar al método startActivityForResult además de la referencia del Intent una variable con un valor 0 o positivo (luego este valor retornará al método onActivityResult)

Page 20: TEMA DEL 24 AL 37

Cuando finalizamos la grabación se ejecuta el método onActivityResult, donde almacenamos en la variable url1 la referencia al archivo de audio creado:

protected void onActivityResult (int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == peticion) { url1 = data.getData(); } }

Por último para ejecutar el contenido de la grabación utilizamos la clase ya vista MediaPlayer:

public void reproducir(View v) { MediaPlayer mediaPlayer = MediaPlayer.create(this, url1); mediaPlayer.start(); }

Page 21: TEMA DEL 24 AL 37

28 - Captura de audio mediante la clase MediaRecorder

Otra forma de grabar audio en Android es el empleo de la clase MediaRecorder. Esta clase nos da más libertades a la hora de construir una aplicación que requiere grabar audio.

Problema:

Disponer tres objetos de la clase Button con las etiquetas "Grabar", "Detener Grabación" y "Reproducir Grabación". Disponer además un TextView para informar del estado actual.

Cuando se presione el botón "Grabar" permitir registrar todos los sonidos hasta que se presione el botón "Detener Grabación". Cuando se presione el botón "Reproducir Grabación" emitir el archivo de audio previamente generado.

La interfaz visual a implementar es la siguiente:

Tener en cuenta de no olvidar definir los tres métodos para los tres botones: grabar, detener y reproducir.

También debemos modificar el archivo AndroidManifest.xml donde debemos indicar que nuestra aplicación accederá a la grabadora de sonido y a la tarjeta SD donde se almacenará el archivo de sonido.

Esto lo hacemos seleccionando el archivo AndroidManifest.xml y en la pestaña Permissions registramos los dos permisos:

Page 22: TEMA DEL 24 AL 37

El código fuente es:

package com.androidya.proyecto026;

import java.io.File;import java.io.IOException;

import android.app.Activity;import android.media.MediaPlayer;import android.media.MediaPlayer.OnCompletionListener;import android.media.MediaRecorder;import android.os.Bundle;import android.os.Environment;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.TextView;

public class MainActivity extends Activity implements OnCompletionListener { TextView tv1; MediaRecorder recorder; MediaPlayer player; File archivo; Button b1, b2, b3;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

tv1 = (TextView) this.findViewById(R.id.textView1); b1 = (Button) findViewById(R.id.button1); b2 = (Button) findViewById(R.id.button2); b3 = (Button) findViewById(R.id.button3); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

Page 23: TEMA DEL 24 AL 37

public void grabar(View v) { recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); File path = new File(Environment.getExternalStorageDirectory() .getPath()); try { archivo = File.createTempFile("temporal", ".3gp", path); } catch (IOException e) { } recorder.setOutputFile(archivo.getAbsolutePath()); try { recorder.prepare(); } catch (IOException e) { } recorder.start(); tv1.setText("Grabando"); b1.setEnabled(false); b2.setEnabled(true); }

public void detener(View v) { recorder.stop(); recorder.release(); player = new MediaPlayer(); player.setOnCompletionListener(this); try { player.setDataSource(archivo.getAbsolutePath()); } catch (IOException e) { } try { player.prepare(); } catch (IOException e) { } b1.setEnabled(true); b2.setEnabled(false); b3.setEnabled(true); tv1.setText("Listo para reproducir"); }

public void reproducir(View v) { player.start(); b1.setEnabled(false); b2.setEnabled(false); b3.setEnabled(false); tv1.setText("Reproduciendo"); }

public void onCompletion(MediaPlayer mp) { b1.setEnabled(true); b2.setEnabled(true); b3.setEnabled(true); tv1.setText("Listo"); }}

Page 24: TEMA DEL 24 AL 37

Declaramos un objeto de la clase MediaRecorder para grabar audio:

MediaRecorder recorder;

Declaramos un objeto de la clase MediaPlayer para reproducir el archivo de sonido generado:

MediaPlayer player;

Declaramos un objeto de la clase File que hace referencia al archivo que se creará:

File archivo;

Declaramos las variables que harán referencia a los tres botones y al TextView:

TextView tv1; Button b1,b2,b3;

En el método onCreate obtenemos la referencia de los cuatro objetos creados en el archivo XML:

tv1 = (TextView) this.findViewById(R.id.tv1); b1=(Button)findViewById(R.id.button1); b2=(Button)findViewById(R.id.button2); b3=(Button)findViewById(R.id.button3);

El método más importante de este concepto es el grabar:

public void grabar(View v) { recorder = new MediaRecorder(); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); File path = new File(Environment.getExternalStorageDirectory().getPath()); try { archivo = File.createTempFile("temporal", ".3gp", path); } catch (IOException e) { } recorder.setOutputFile(archivo.getAbsolutePath()); try { recorder.prepare(); } catch (IOException e) { } recorder.start(); tv1.setText("Grabando"); b1.setEnabled(false); b2.setEnabled(true); }

Creamos un objeto de la clase MediaRecorder:

Page 25: TEMA DEL 24 AL 37

recorder = new MediaRecorder();

Seguidamente definimos el micrófono como fuente de audio:

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

Luego llamamos al método setOutputFormat especificando que el archivo será almacenado con la especificación 3GPP y con extensión .3gp

recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

Especificamos el codec a emplear llamando al método setAudioEncoder:

recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

Obtenemos el path de la tarjeta SD y creamos un archivo temporal con extensión 3gp:

File path = new File(Environment.getExternalStorageDirectory().getPath()); try { archivo = File.createTempFile("temporal", ".3gp", path); } catch (IOException e) { }

Con el método setOutputFile de la clase MediaRecorder le indicamos el archivo donde debe almacenarse la grabación:

recorder.setOutputFile(archivo.getAbsolutePath());

Llamamos al método prepare y finalmente al método start para comenzar la grabación:

try { recorder.prepare(); } catch (IOException e) { } recorder.start();

El método detener:

public void detener(View v) { recorder.stop(); recorder.release(); player = new MediaPlayer(); player.setOnCompletionListener(this); try { player.setDataSource(archivo.getAbsolutePath()); } catch (IOException e) { } try { player.prepare(); } catch (IOException e) {

Page 26: TEMA DEL 24 AL 37

} b1.setEnabled(true); b2.setEnabled(false); b3.setEnabled(true); tv1.setText("Listo para reproducir"); }

Llamamos primero al método stop de la clase MediaRecorder y liberamos los recursos consumidos llamando a release:

recorder.stop(); recorder.release();

Creamos un objeto de la clase MediaPlayer para poder reproducir el archivo de audio que acabamos de grabar. Indicamos mediante el método setOnCompletionListener la referencia de la clase que será informada cuando el audio finalice:

player = new MediaPlayer(); player.setOnCompletionListener(this);

Referenciamos el archivo a que debe reproducir:

try { player.setDataSource(archivo.getAbsolutePath()); } catch (IOException e) { }

Finalmente llamamos al método prepare de la clase MediaPlayer:

try { player.prepare(); } catch (IOException e) { }

El método reproducir simplemente llama al método start de la clase MediaPlayer para iniciar la reproducción del archivo previamente grabado:

public void reproducir(View v) { player.start(); b1.setEnabled(false); b2.setEnabled(false); b3.setEnabled(false); tv1.setText("Reproduciendo"); }

El método onCompletion se ejecuta cuando termina de reproducirse el archivo de audio:

public void onCompletion(MediaPlayer mp) { b1.setEnabled(true); b2.setEnabled(true); b3.setEnabled(true); tv1.setText("Listo"); }

Page 27: TEMA DEL 24 AL 37

29 - Menú de opciones

En Android la implementación de un menú de opciones permite mostrar opciones de una forma estandarizada entre aplicaciones (esto hace que todos los programas tengan una vista de un menú muy parecidos)

Los menús aparecen en la parte inferior de la pantalla cuando el usuario presiona el botón Menú del celular.

La implementación del menú se puede hacer de forma similar a la interfaz visual de la aplicación mediante la creación de un archivo XML y la construcción del mismo empleando las herramientas que provee el ADT.

Problema:

Confeccionar una aplicación que muestre un menú con dos opciones: una que visualice el "Acerca de..." (nombre de la aplicación, programador etc.) del programa y otra que finalice el programa.

El ADT ya creo el archivo XML para el activity principal y se encuentra localizado en la carpeta res/menu y se llama activity_main.xml

La intefaz del editor de menu que nos provee el plugin de Android para Eclipse es:

Procedemos a insertar la primera opción presionando el botón "Add", seguidamente seleccionamos "Item":

Page 28: TEMA DEL 24 AL 37

Luego nos queda inicializar como mínimo el título de que mostrará dicha opción:

Page 29: TEMA DEL 24 AL 37

Ahora nuevamente presionamos el botón "Add" para añadir la segunda opción. En el diálogo que aparece seleccionamos "Create a new element at the top level, in Menu", seguidamente seleccionamos "Item" y confirmamos:

Configuramos la propiedad Title de la segunda opción:

Page 30: TEMA DEL 24 AL 37

Paso seguido debemos sobreescribir los métodos onCreateOptionsMenu (que ya lo tenemos codificado en el archivo Java) y onOptionsItemSelected heredados de la clase Activity.

El código fuente de la clase Proyecto027Activity.java es:

package com.javaya.proyecto027;

import android.app.Activity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) {

Page 31: TEMA DEL 24 AL 37

super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item1: Toast.makeText(this, "Programador: Diego (23/08/2011)", Toast.LENGTH_SHORT).show(); break; case R.id.item2: finish(); } return true; }

}

En el método onCreateOptionsMenu creamos un objeto de la clase MenuInflater y mediante el método inflate vinculamos el identificador del archivo de recursos: R.menu.activity_main y el objeto de la clase menu que llega como parámetro. Debemos retornar true:

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

En el método onOptionsItemSelected debemos disponer un switch para identificar cual de las opciones del menú fue seleccionado. El parámetro item de la clase MenuItem tiene la referencia del objeto que fue pulsado. Luego obtenemos su Id llamando al método getItemId y a través del switch verificamos con el recurso que coincide y procedemos a efectuar la actividad respectiva (si se selecciona la primer opción mostramos un mensaje mediante la clase Toast, si se seleccionó la segunda opción llamamos al método finish para finalizar el programa:

@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item1:

Page 32: TEMA DEL 24 AL 37

Toast.makeText(this, "Programador: Diego (23/08/2011)", Toast.LENGTH_SHORT).show(); break; case R.id.item2: finish(); } return true; }

Desde el emulador para activar el menú debemos presionar el siguiente botón:

Page 33: TEMA DEL 24 AL 37

30 - Menú de opciones con submenú

Ahora veremos que podemos desplegar un submenú cuando se selecciona una opción del menú principal.

Problema:

Confeccionar una aplicación que muestre un menú con dos opciones: una que visualice el texto "Sitios interesantes..." y al ser seleccionado muestre otro submenú con una serie de buscadores. y otra opción en el menú principal para que finalice el programa.

Modificaremos el archivo activity_main.xml de la carpeta res/menu. Podemos eliminar el item que crea por defecto el ADT (menu_settings(Item)

Primero insertamos un item que mostrará el mensaje "Sitios interesantes..." para esto presionamos el botón "Add" y seleccionamos "Item" en Title disponemos "Sitios interesantes..."

Presionamos "Add" y seleccionamos "Sub-Menu":

Page 34: TEMA DEL 24 AL 37

Luego añadimos varios Menu Item al Sub-Menu (uno por cada sitio web a enlazar):

La estructura final del menú de opciones debe ser la siguiente:

Page 35: TEMA DEL 24 AL 37

El código fuente de la clase Proyecto028Activity.java es:

package com.androidya.proyecto028;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

@Override public boolean onOptionsItemSelected(MenuItem item) {

Page 36: TEMA DEL 24 AL 37

Intent i; switch (item.getItemId()) { case R.id.item2: i = new Intent("android.intent.action.VIEW", Uri.parse("http://www.google.com")); startActivity(i); break; case R.id.item3: i = new Intent("android.intent.action.VIEW", Uri.parse("http://www.yahoo.com")); startActivity(i); break; case R.id.item4: i = new Intent("android.intent.action.VIEW", Uri.parse("http://www.bing.com")); startActivity(i); break; case R.id.item5: finish(); } return true; }

}

El método onCreateOptionsMenu es idéntico al concepto anterior. En el método onOptionsItemSelected verificamos cual de los MenuItem es seleccionado y procedemos a invocar mediante un Intent al navegador configurado por defecto para el dispositivo.

La visualización del submenú en tiempo de ejecución es similar a:

Page 37: TEMA DEL 24 AL 37

31 - Menú de opciones con íconos en los MenuItem

Otra posibilidad es disponer gráficos dentro de los MenuItem de nuestro programa.

Problema:

Confeccionar una aplicación que muestre un menú con dos opciones: una que active el navegador con YouTube y otra que active Facebook. Disponer un ícono para cada MenuItem.

Luego de crear el proyecto procedemos a buscar dos íconos representativos de Youtube y Facebook (dos archivos png de 48 píxeles de ancho y alto) y los almacenamos en la carpeta drawable-mdpi.

Luego de refrescar la carpeta debemos tener en nuestro proyecto en dicha carpeta tres archivos:

Ahora tenemos que crear los dos Item y especificar las propiedades Title (con el texto que queremos que se muestre) y la propiedad Icon.

Para configurar cada icon procedemos a asignar los valores @drawable/youtube y @drawable/facebook (los nombres coinciden con los nombres de archivos que copiamos a la carpeta drawable)

Nos queda agregar solo la funcionalidad de cada MenuItem:

package com.androidya.proyecto029;

import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;

Page 38: TEMA DEL 24 AL 37

import android.view.Menu;import android.view.MenuItem;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

@Override public boolean onOptionsItemSelected(MenuItem item) { Intent i; switch (item.getItemId()) { case R.id.item1: i = new Intent("android.intent.action.VIEW", Uri.parse("http://www.youtube.com")); startActivity(i); break; case R.id.item2: i = new Intent("android.intent.action.VIEW", Uri.parse("http://www.facebook.com")); startActivity(i); } return true; } }

Luego cuando lo ejecutamos podemos observar el ícono que se muestra en cada MenuItem:

Page 39: TEMA DEL 24 AL 37

32 - Menú contextuales

Otra variante de menú de opciones son los menú contextuales que se pueden asociar a distintos componentes visuales del formulario (TextView, EditText, ListView etc.)Un menú contectual aparece cuando el usuario presiona por un tiempo más o menos prolongado el control visual.

Problema:

Confeccionar una aplicación que muestre un EditText y asociarle un menú contextual que permita cambiar el color de fondo del mismo. El menú debe permitir seleccionar entre el rojo, verde y azul.

Primero creamos un proyecto y creamos una interfaz con un control de tipo EditText:

Luego creamos el archivo XML que contendrá el menú de opciones (presionamos el botón derecho del mouse sobre la carpeta res de nuestro proyecto y seleccionamos New -> Android XML File):

Page 40: TEMA DEL 24 AL 37

Aparece un diálogo donde debemos indicar el nombre del archivo de recursos a crear (lo llamamos menu1, este es el nombre del archivo XML que se creará en una carpeta llamada menu que depende de la carpeta res) y seleccionamos el RadioButton de menu

Ya tenemos una nueva carpeta llamada menu y un archivo llamado menu1.

Creamos las tres opciones del menú:

Page 41: TEMA DEL 24 AL 37

Ahora veamos como asociar el archivo XML donde definimos el menú con el código Java:

package androidya.proyecto030;

import android.app.Activity;import android.graphics.Color;import android.os.Bundle;import android.view.ContextMenu;import android.view.ContextMenu.ContextMenuInfo;import android.view.MenuInflater;import android.view.MenuItem;import android.view.View;import android.widget.EditText;

public class Proyecto030Activity extends Activity { EditText et1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et1=(EditText)findViewById(R.id.editText1); registerForContextMenu(et1);

Page 42: TEMA DEL 24 AL 37

} @Override public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { menu.setHeaderTitle("Elija el color de fondo:"); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu1, menu); } @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item1:et1.setBackgroundColor(Color.rgb(255, 0, 0)) ; break; case R.id.item2:et1.setBackgroundColor(Color.rgb(0, 255, 0)) ; break; case R.id.item3:et1.setBackgroundColor(Color.rgb(0, 0, 255)) ; break; } return true; } }

En el método onCreateContextMenu asociamos el archivo XML llamando al método inflate de la clase MenuInflate.Podemos también llamar al método setHeaderTitle para mostrar un título en el menú emergente.

@Override public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { menu.setHeaderTitle("Elija el color de fondo:"); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu1, menu); }

Para la captura de eventos de los MenuItem debemos implementar el método onContextItemSelected donde mediante un switch verificamos cual de los MenuItem fue seleccionado y cambiamos el color de fondo del control EditText:

@Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item1:et1.setBackgroundColor(Color.rgb(255, 0, 0)) ; break; case R.id.item2:et1.setBackgroundColor(Color.rgb(0, 255, 0)) ; break; case R.id.item3:et1.setBackgroundColor(Color.rgb(0, 0, 255)) ; break; } return true; }

Page 43: TEMA DEL 24 AL 37

33 - AlertDialog simple

El diálogo más simple que podemos crear con Android en una ventana con un título, un mensaje y un botón para cerrarlo.

Muy útil si tenemos que informar al usuario y no queremos que la ventana desaparezca hasta que el usuario presione un botón para ocultar el diálogo.

Problema:

Confeccionar una aplicación que muestre un diálogo cada vez que se inicie la aplicación informando que el programa que está ejecutando es un programa de prueba y no el completo.

Primero creamos un proyecto llamado: proyecto031Lo almacenamos en el paquete: androidya.proyecto031

El código fuente de la aplicación queda como sigue:

package androidya.proyecto021;

import android.app.Activity;import android.app.AlertDialog;import android.os.Bundle;

public class Proyecto031Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Importante"); builder.setMessage("Este es un programa solo de prueba y no la versión completa"); builder.setPositiveButton("OK",null); builder.create(); builder.show(); }}

Como queremos que el diálogo aparezca inmediatamente se arranque la aplicación procedemos a incorporar el código en el método onCreate.Primero debemos importar la clase AlertDialog:

import android.app.AlertDialog;

Page 44: TEMA DEL 24 AL 37

La clase AlertDialog contiene otra clase llamada Builder que es la que encapsula la creación de objetos de la clase AlertDialog. Procedemos a definir y crear un objeto de la clase Builder contenida en la clase AlertDialog:

AlertDialog.Builder builder = new AlertDialog.Builder(this);

Una vez creado el objeto procedemos a llamar al método que define el título a mostrar en el diálogo:

builder.setTitle("Importante");

El mensaje propiamente dicho lo configuramos llamando al método setMessage:

builder.setMessage("Este es un programa solo de prueba y no la versión completa");

Mostramos un botón para poder cerrar el diálogo:

builder.setPositiveButton("OK",null);

Finalmente llamamos al método que crea el diálogo y el que lo visualiza:

builder.create(); builder.show();

La interfaz visual del diálogo en tiempo de ejecución es:

Page 45: TEMA DEL 24 AL 37

34 - AlertDialog con botones de confirmar y cancelar

Problema:

Confeccionar una aplicación que muestre un diálogo cada vez que se inicie la aplicación informando: "¿Acepta la ejecución de este programa en modo prueba?" y dos botones para confirmar o rechazar. En caso que se rechace finalizar la ejecución del programa.

Primero creamos un proyecto llamado: proyecto032Lo almacenamos en el paquete: androidya.proyecto032

El código fuente de la aplicación queda como sigue:

package androidya.proyecto032;

import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Bundle;import android.widget.Toast;

public class Proyecto032Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AlertDialog.Builder dialogo1 = new AlertDialog.Builder(this); dialogo1.setTitle("Importante"); dialogo1.setMessage("¿ Acepta la ejecución de este programa en modo prueba ?"); dialogo1.setCancelable(false); dialogo1.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { aceptar(); } }); dialogo1.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { cancelar(); } }); dialogo1.show(); } public void aceptar() { Toast t=Toast.makeText(this,"Bienvenido a probar el programa.", Toast.LENGTH_SHORT); t.show(); }

Page 46: TEMA DEL 24 AL 37

public void cancelar() { finish(); }}

Creamos un objeto de la clase AlertDialog a través de la clase Builder:

AlertDialog.Builder dialogo1 = new AlertDialog.Builder(this);

Configuramos el título del diálogo:

dialogo1.setTitle("Importante");

Configuramos el mensaje del diálogo:

dialogo1.setMessage("¿ Acepta la ejecución de este programa en modo prueba ?");

Evitamos que el diálogo sea salteado por cualquier medio distinto a presionar alguno de los dos botones:

dialogo1.setCancelable(false);

Llamamos al método setPositiveButton indicando el texto a mostrar en el botón y la clase anónima que capturará el evento clic del botón:

dialogo1.setPositiveButton("Confirmar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { aceptar(); } });

De forma similar procedemos con el botón de cancelar:

dialogo1.setNegativeButton("Cancelar", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogo1, int id) { cancelar(); } });

Mostramos el diálogo:

dialogo1.show();

Definimos los métodos del Activity que se llamaran desde las clases anónimas:

public void aceptar() {

Page 47: TEMA DEL 24 AL 37

Toast t=Toast.makeText(this,"Bienvenido a probar el programa.", Toast.LENGTH_SHORT); t.show(); } public void cancelar() { finish(); }

La interfaz del diálogo es similar a esta:

Page 48: TEMA DEL 24 AL 37

35 - Notificaciones o mensajes mediante la clase Toast

La clase Toast nos permite mostrar un mensaje superpuesto a la ventana por un período de tiempo pero sin congelar la aplicación. Este mensaje no permite interactuar con el usuario (no se pueden ingresar datos, seleccionar botones ni obligar a que se cierre)

Eventualmente se lo puede localizar en distintas partes del dispositivo.

Problema:

Confeccionar una aplicación que muestre una serie de botones y active mensajes de notificaciones con la clase Toast.

Primero creamos un proyecto llamado: proyecto033Lo almacenamos en el paquete: androidya.proyecto033

La interfaz visual a implementar son tres botones:

No olvidemos inicializar la propiedad On Click de cada botón con los métodos: prueba1, prueba2 y prueba3.

El código fuente de la aplicación queda como sigue:

package androidya.proyecto033;

Page 49: TEMA DEL 24 AL 37

import android.app.Activity;import android.os.Bundle;import android.view.Gravity;import android.view.LayoutInflater;import android.view.View;import android.widget.Toast;

public class Proyecto033Activity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void prueba1(View v) { Toast toast = Toast.makeText(this, "Mensaje 1", Toast.LENGTH_SHORT); toast.show(); } public void prueba2(View v) { Toast toast = Toast.makeText(this, "Mensaje 2", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); toast.show(); } public void prueba3(View v) { LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.toast1, null); Toast toast = new Toast(getApplicationContext()); toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); toast.setDuration(Toast.LENGTH_LONG); toast.setView(layout); toast.show(); } }

Para el evento click del primer botón mostramos el mensaje con las estructura más simple que nos provee la clase Toast. Definimos un objeto de la clase Toast y llamamos al método makeText pasando como parámetro la referencia del Activity, el mensaje a mostrar y una constante indicando si queremos que el mensaje aparezca por un período corto o largo de tiempo en la pantalla. Por último llamamos al método show para que se muestre el mensaje:

public void prueba1(View v) { Toast toast = Toast.makeText(this, "Mensaje 1", Toast.LENGTH_SHORT); toast.show(); }

Page 50: TEMA DEL 24 AL 37

Si queremos ubicar en otra parte de la pantalla debemos llamar al método setGravity e indicar en el primer parámetro una constante (en este ejemplo lo centramos verticalmente)En el segundo y tercer parámetro de setGravity podemos desplazarlo una cantidad de píxeles hacia derecha o izquierda, arriba o abajo según indiquemos valores positivos o negativos.

Luego el método completo para este segundo Toast es:

public void prueba2(View v) { Toast toast = Toast.makeText(this, "Mensaje 2", Toast.LENGTH_SHORT); toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); toast.show(); }

Page 51: TEMA DEL 24 AL 37

Para generar un Toast customizado debemos crear un archivo XML donde creamos visualmente los controles a mostrar, en este ejemplo creamos el siguiente archivo (crear un archivo llamado toast1.xml):

Page 52: TEMA DEL 24 AL 37

Este recurso luego lo incorporamos en el Toast mediante el siguiente código:

public void prueba3(View v) { LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.toast1,null); Toast toast = new Toast(getApplicationContext()); toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); toast.setDuration(Toast.LENGTH_LONG); toast.setView(layout); toast.show(); }

Mediante la clase LayoutInflate procedemos a leer el contenido del archivo XML creado anteriormente y lo enlazamos con el toast mediante el método:

toast.setView(layout);

En pantalla luego el Toast customizado aparece de la siguiente forma:

Page 53: TEMA DEL 24 AL 37

36 - Dibujar: graficar un píxel

Problema:

Graficar un píxel de color negro en medio de la pantalla del dispositivo.

Para poder hacer esta simple tarea debemos seguir una serie de pasos:

1 - Creamos un proyecto llamado: proyecto034Lo almacenamos en el paquete: com.androidya.proyecto034

Borramos el TextView que agrega automáticamente el plug-in de Eclipse y a definir un id para el RelativeLayout (le asignamos como Id el valor @+Id/layout1) y grabamos las modificaciones:

Ahora codificamos la clase donde se encuentra toda la lógica para encender el píxel:

package com.androidya.proyecto034;

import android.app.Activity;

Page 54: TEMA DEL 24 AL 37

import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Bundle;import android.view.Menu;import android.view.View;import android.widget.RelativeLayout;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1); Lienzo fondo = new Lienzo(this); layout1.addView(fondo); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

class Lienzo extends View {

public Lienzo(Context context) { super(context); }

protected void onDraw(Canvas canvas) { int ancho = canvas.getWidth(); int alto = canvas.getHeight(); Paint pincel1 = new Paint(); pincel1.setARGB(255, 0, 0, 0); canvas.drawPoint(ancho / 2, alto / 2, pincel1); } }

}

Debemos crear una clase que herede de la clase View (todos los controles visuales en Android heredan de esta clase) y sobreescribir el método onDraw. El método onDraw se ejecuta cuando tiene que graficarse. Para acceder a las primitivas gráficas hay una clase llamada Canvas que encapsula todo lo relacionado a pintar píxeles, líneas, rectángules etc.:

protected void onDraw(Canvas canvas) { int ancho=canvas.getWidth(); int alto=canvas.getHeight(); Paint pincel1=new Paint();

Page 55: TEMA DEL 24 AL 37

pincel1.setARGB(255,0,0,0); canvas.drawPoint(ancho/2, alto/2, pincel1); }

Lo primero que hacemos en el método onDraw es obtener el ancho y alto en píxeles del dispositivo mediante los métodos getWidth() y getHeight() que nos provee la clase Canvas. Seguidamente creamos un objeto de la clase Paint. Llamamos al método setARGB para definir el color del pincel (el primer parámetro indica el valor de transparencia con 255 indicamos que no hay transparencia, luego indicamos la cantidad de rojo, verde y azul.

Por último debemos llamar al método drawPoint que dibuja el píxel en la columna, fila y pincel que le pasamos como parámetros.

Como podemos observar la clase Lienzo hereda de View e implementa el constructor donde llegará la referencia del Activity donde se inserta:

class Lienzo extends View {

public Lienzo(Context context) { super(context); } protected void onDraw(Canvas canvas) { int ancho=canvas.getWidth(); int alto=canvas.getHeight(); Paint pincel1=new Paint(); pincel1.setARGB(255,0,0,0); canvas.drawPoint(ancho/2, alto/2, pincel1); } }

Por último en el método onCreate del Activity obtenemos la referencia del RelativeLayout que tiene el Activity. Creamos un objeto de la clase Lienzo (llamado fondo) y agregamos el objeto fondo al RelativeLayout llamando al método addView:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1); Lienzo fondo = new Lienzo(this); layout1.addView(fondo); }

Cuando ejecutemos el programa veremos un píxel en medio de la pantalla de color negro:

Page 56: TEMA DEL 24 AL 37
Page 57: TEMA DEL 24 AL 37

37 - Dibujar: pintar fondo y dibujar líneas

Problema:

Pintar el fondo de color amarillo y dibujar una serie de líneas con distintos estilos.

1 - Creamos un proyecto llamado: proyecto035Lo almacenamos en el paquete: com.androidya.proyecto035

Borramos el TextView que agrega automáticamente el plug-in de Eclipse y difinimos el id del RelativeLayout con el valor: @+id/layout1:

Ahora codificamos la clase donde se encuentra toda la lógica para pintar el fondo y dibujar las líneas:

package com.androidya.proyecto035;

import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Paint;import android.os.Bundle;import android.view.Menu;

Page 58: TEMA DEL 24 AL 37

import android.view.View;import android.widget.RelativeLayout;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

RelativeLayout layout1 = (RelativeLayout) findViewById(R.id.layout1); Lienzo fondo = new Lienzo(this); layout1.addView(fondo); }

@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; }

class Lienzo extends View {

public Lienzo(Context context) { super(context); }

protected void onDraw(Canvas canvas) { canvas.drawRGB(255, 255, 0); int ancho = canvas.getWidth(); Paint pincel1 = new Paint(); pincel1.setARGB(255, 255, 0, 0); canvas.drawLine(0, 30, ancho, 30, pincel1); pincel1.setStrokeWidth(4); canvas.drawLine(0, 60, ancho, 60, pincel1); } } }

Veamos el método onDraw donde pintamos el fondo de la componente llamando al método drawRGB donde indicamos la cantidad de rojo, verde a azul:

protected void onDraw(Canvas canvas) { canvas.drawRGB(255,255,0);

Creamos un objeto de la clase paint y definimos el color rojo (recordemos que el primer parámetro indica el valor de la transparencia, si vale 255 es totalmente opaco, con un valor menor el trazo de la línea tendrá transparencia.El método para graficar una línea se llama drawLine y tiene como parámetros la columna y fila del punto inicial y el tercer y cuarto parámetro indica la columna y fila del punto final de la línea (en este ejemplo se dibujará una línea horizontal en la fila 30 y tendrá un ancho

Page 59: TEMA DEL 24 AL 37

que coincide con el ancho del dispositivo), el último parámetro es el objeto de la clase Paint que indica el color de la línea:

Paint pincel1=new Paint(); pincel1.setARGB(255,255,0,0); canvas.drawLine(0, 30, ancho, 30, pincel1);

La siguiente línea la dibujamos en la fila 60 pero previamente cambiamos el grosor del pincel llamando al método setTrokeWidth indicando que serán 4 píxeles el grosor:

pincel1.setStrokeWidth(4); canvas.drawLine(0, 60, ancho, 60, pincel1);

La vista previa en el dispositivo será:

Problema propuesto1. Confeccionar una aplicación que muestre una hoja en la pantalla similar a esta: