miércoles, 30 de enero de 2013

Chronometro con etapas


El objetivo es crear un chronometro con etapas a modo de aprendizaje, mediante un botón podremos controlar el inicio y pausa del cronómetro. Una vez iniciado el cronómetro, en cada pausa mostraremos los segundos transcurridos desde la última vez que el cronómetro estaba parado o en pausa, llegando a mostrar como mucho os 6 últimos intervalos en funcionamiento.


Ejemplo cronómeto

Documentación base para el desarrollo:
http://developer.android.com/reference/android/widget/Chronometer.html
http://developer.android.com/reference/android/widget/Chronometer.html#setBase(long)
http://developer.android.com/reference/android/os/SystemClock.html#elapsedRealtime()

La función setBase() ajusta el tiempo del cronómetro en referencia al parametro que se le pase de tipo long. Recomiendan utilizar elapsedRealtime() como base. Esta función devuelve en milisegundos el tiempo transcurrido desde que se inició el ordenador.

Elementos y controles de pantalla necesarios:

ToggleButton tBtn; Chronometer  chR; TextView lapsView;
Variables necesarias (es posible que no todas sean imprescindibles):
boolean started = false; //Controlamos si se ha iniciado por primera vez o no long total_elapsed; // Tiempo total que ha pasado desde que estaba a 0 int lap; // numero de intervalos pausados. String timelaps = ""; // Texto para mostrar los intervalos

Funciones necesarias:

  • Función chStart para incio del cronómetro:

       public void chStart(){
 /*llamamos a la función que creamos setTimeBase() para establecer el momento de inicio del cronometro */
                 setTimeBase();
                //iniciamos el cronometro
chR.start();
}

  • Funcion setTimeBase() para establecer el inicio del cronómetro:
         public void setTimeBase(){
//Combrobamos si el inicio es por primera vez o no.
if (!started)
{
                        //Si es por primera vez establecemos como base el tiempo actual del sistema
chR.setBase(SystemClock.elapsedRealtime());
                        // lo marcamos como iniciado
started = true;
}
else
{
                        //Si ya fué iniciado anteriormente, establecemos a la base le añadimos el tiempo total que ha transcurrido
chR.setBase(SystemClock.elapsedRealtime()+total_elapsed); 
}
}

  • Función dentro del OnClick del ToogleButton


// Comprobamos si está iniciado
if ( tBtn.isChecked() )
{
//Iniciar el cronómetro llamando a nuestra funcion chStart()
chStart();
}else
{
              /*Si ya ha sido iniciado primero creamos una variable para almacenar la duración de la última vuelta, si es la última vuelta (la anterior) sería 0. */
long last_lap_duration = total_elapsed;
// Guardamos el tiempo total transcurrido.
total_elapsed = chR.getBase() - SystemClock.elapsedRealtime();
            // Calculamos y guardamos en una variable local  la duración de la última parada 
         long lap_duration = total_elapsed - last_lap_duration;
// Paramos el cronómetro
chStop();
           // Aumentamos la variable de control de vueltas.
lap++;
//Controlamos el envío a pantalla de las vueltas, en función de si ya se ha superado el límite de 6 o no.
if (lap <=6 )
{
showInterval(lap_duration);
}
else
{
timelaps ="";
lap = 1;
showInterval(lap_duration);
}
}
Funciones adicionales:

//Muestra el intervalo en pantalla

public void showInterval(long lap_duration){
timelaps += getResources().getText(R.string.interval) + "\tnº\t" + lap + ":\t"+ getTextMiliseconds(lap_duration) + " \t segundos \n";

lapsView.setText(timelaps);
}
//Devuelve el valor de la variable long en segundos con decimales
public String getTextMiliseconds(long miliseconds) {
float seconds =  ((float)miliseconds /(float) 1000) * -1 ;
String time = "";
time += String.valueOf(seconds);

return time;
}


Resultado:


Un saludo




3 comentarios:

  1. Hola, Muy buen ejemplo, me gustaría guardar las etapas en un txt me podrías dar algún ejemplo o idea de como implementarlo ;) Gracias!!!

    ResponderEliminar
    Respuestas
    1. Hola.
      Te recomiendo que utilices Preferencias para esa operación.
      Un saludo

      Eliminar
  2. Hola y en que versiones de android funciona el script

    ResponderEliminar