domingo, 12 de abril de 2015


DroidScript Project Manager 1.0, es un pequeño ejercicio que condensa algunas de mis experiencias con esta aplicación Android para hacer aplicaciones Android. He tomado algunas rutinas ya construidas "readRootFolder",  y las que realizan la compresión zip recursíva. 

De cosecha propia son: una librería para escribir layouts y controles, un objeto "Splash" para crear intros y la pequeña libreria grafica que lo asiste, (todo en fase experimental). La aplicación completa en formato zip la encontraras al final de la pagina.

Los ficheros:

- df1.1.js auxiliar para layouts, controles y otros.
- splash.js crear objetos Splash (intros).

- droid projects.js el main de la app.
- layout.js Definicion de la estructura layout

La estructura de la app esta bajo el ambito (namespace) "sys.", primero el objeto "lay" del que cuelgan la capa principal "main" y otro objeto "childs" la estructura básica de capas estará ahí, al igual que "sys.ctrls" contendrá la estructura de controles de cada capa.

Con "df.compile(target,source)" es sencillo compilar los controles de cada capa. He encapsulado cada parte en dos funciones encadenadas: setLay() y setCtrls() de propósito obvio. Esta estructura de programación es altamente re-usable, adaptable y evita escribir código.

Esta no es una aplicación completa es solo un ejercicio. Las funciones "delete project" y "delete file" no están implementadas. 





Pincha aquí para descargar DroidProject Manager

Si no funciona el enlace, captura y ve a esta dirección:
https://www.dropbox.com/s/20ook5ch3sj7wa6/droid%20projects.zip?dl=0

Hasta la próxima!!!

sábado, 4 de abril de 2015

Big Clock / DroidScript Ejempl/Example

Vamos a ver una pequeña aplicación DroidScript completa.

Es un simple reloj y su ciclo de funcionamiento es: inicio/actualizar reloj/dibujar reloj no hace otra cosa. No vamos a usar los controles clásicos: cajas de texto y botones. Dibujaremos nuestro reloj digital en una imagen.

Usaremos un pequeño truco para evitar el parpadeo de la imagen al actualizarla, para ello utilizaremos una imagen [canvas] para dibujar y otra [display] que sera la que mostraremos en pantalla, como display no se borra, si no que se dibuja cada segundo el contenido de canvas, evitamos el parpapedo.

La logica de esta mini aplicación esta bajo el "namespace" (ámbito) de una única variable [sys] que nos facilita el acceso a cualquier atributo o función y es muy flexible para crecer.


Para evitar la redundancia de código hemos creado la función pText que es usada para dibujar cada elemento: hora, minutos, segundos y puntos de separación, también añade una sombra del color especificado a una separación prefijada que con un poco de imaginación podría "customizarse" para
progranar la orientación y la densidad.

Crea una carpeta en DroidScript con el nombre que quieras y copia este fragmento de código
con el mismo nombre de la carpeta en formato .js


/* BIG CLOCK/GRAN RELOJ                  */
/* DroidScript/Javascript code              */
/* cc 2015                                                */

//
// logica de la aplicación encapsulada en una
// única variable [sys] que nos permiter añadir 
// atributos y funciones e incluso eliminarlas 
// 
// STOP variables globales!!!


var sys={
    state:true,
    flag:{
        dotColor:false
     },
     color:{
            display:"#ff0000",
            bg:"#444444",
            dots:{
                 hi:"#ffff00",
                 low:"#888800"
             }, 
             digits:{
                 hi:"#00ff00",
                 low:"#ff0000"
             }, 
             
      }, 
     clock:{ 
          time:{
               hours:0,
               minutes:0,
               seconds:0,
               ampm:""
          },
          update:function(){
               var now=new Date();
               // alert(now.toJSON());
               this.time.hours=pad(now.getHours());
               this.time.minutes=pad(now.getMinutes());
               this.time.seconds=pad(now.getSeconds());
          }
    }
};

// Toda aplicacion DroidScript empieza aqui.
// Called when application is started.
function OnStart()
{
    app.PreventScreenLock( true );
    app.SetScreenMode("Full");

    //Create a layout with objects vertically centered.
    sys.lay = app.CreateLayout( "linear", "VCenter,FillXY" );  
    // imagen mostrada  en pantslla
    sys.display=app.CreateImage(null,1,1,"fix,FontAwesome",800,600);
    sys.display.SetOnTouchUp(userTouch)
    // buffer para dibujar el reloj
    sys.canvas=app.CreateImage(null,1,.5,"fix,FontAwesome",800,200);
    // añadir display al layout principal
    sys.lay.AddChild(sys.display);
    
    
    //Add layout to app.    
    app.AddLayout( sys.lay );
    sys.display.SetColor(sys.color.display);
    update();
}

function update(){
       
      drawClock();
      sys.display.DrawImage(sys.canvas,0,.3,1,.4)
  //    display.DrawImage(canvas,0,.45,1,.5)
      if(sys.state)
          setTimeout(update,1000);


function drawClock(){
      var colordots=(sys.flag.dotColor? sys.color.dots.low:sys.color.dots.hi),
           // colordigits=sys.color.digits.hi 
            colordigits=(!sys.flag.dotColor? sys.color.digits.low:sys.color.digits.hi),
            time=sys.clock.time,
            canvas=sys.canvas;

            sys.clock.update();

            canvas.SetTextSize(200);
            canvas.Save();
            canvas.Clear();
            canvas.SetColor(sys.color.bg);

            //  
            pText(canvas, time.hours, colordigits, .05, .85, "#000000");
            pText(canvas, time.minutes,colordigits,.36,.85, "#000000" );
            pText(canvas, time.seconds,colordigits,.68,.85, "#000000" );
            pText(canvas, ":", colordots, .31, .75, "#000000" );
            pText(canvas, ":", colordots, .62, .75, "#000000" );


            canvas.Update()

            sys.flag.dotColor= !sys.flag.dotColor;
}

// dibujar en el destino [el] indicado un texto, su posicion,
// el color y el color de sombra.
//
// nota: mejora esta función. Controla el desplazamiento 
// x e y de la sombra, su densidad.
//
function pText(el,text,color,x,y,shadowColor){
    el.SetPaintColor(shadowColor);
    el.DrawText(text,x+.005,y+.02); 
    el.SetPaintColor(color);
    el.DrawText(text,x,y); 
}

// añade un cero si num < 10
//
function pad(num){    return num<10? "0"+num:num;  } 

// en una futura mejora con alarma y otras
// funciones, detectaremos donde libera un
// toque el usuario
//
function userTouch(ev){  
//  app.ShowPopup(ev.X+"/"+ev.Y); 
}

Que disfrutes modificando u aprendiendo más sobre DroidScript con este simple
ejemplo.

Y en siguientes ediciones: SPLASH 3D o como construir intros con texto pseudo 3D.




viernes, 3 de abril de 2015

El cielo y el infierno de DroidScript

En este blog siempre defenderemos DroidScript como aplicación sencilla y eficaz. Escribir codigo es una tarea sencilla. Mantenerlo y actualizarlo es otra cosa. DroidScript nos permite escribir aplicaciones android de forma rápida y sencilla.

DroidScript tiene un motor Rhino para procesar el código javascript, esto nos proporciona librerías, código ya probado para realizar las tareas mas básicas de cualquier lenguaje: cadenas de texto, arrays, flujo, variables, objetos, funciones y montones de tutoriales sobre cualquier tema. Es importante contar con librerías como underscore.org para realizar las tareas más compelas de forma muy sencilla.

En una aplicación sencilla no es problema el código, pocas lineas y punto. Cuando nuestra aplicación requiere algo de complejidad es necesario tener claros los actores que intervienen en la obra. 


En la imagen anterior describo a mi entender los modulos básicos para contruir una aplicación compleja. En resources (recursos) tendremos las imagenes, sonidos, código diverso y otros "etceteras".

En la caja de la derecha del diagrama encontramos los tres bloques básicos en una app DroidScript, layout (los paneles maestros) controls (botones, listas, textos, imagenes, etc.) y por último lógic (la lógica de la aplicación) que podrá estar en diferentes ficheros.

Preparados para escribir nuestra primera app android ?




El infierno DroidScript

Bueno, es un infierno general en la programación de aplicaciones: minimizar la repetición de código. Veamos un ejemplo necesitamos cuatro botones para que el usuario indique la dirección:

  btnL = app.CreateButton( "Left", 0.2, 0.16 );
 btnL.SetOnTouch( btn_l );
 moveButtons.AddChild( btnL );

  btnR = app.CreateButton( "Right", 0.2, 0.16 );
 btnR.SetOnTouch( btn_r );
 moveButtons.AddChild( btnR );

  btnU = app.CreateButton( "Up", 0.2, 0.16 );
 btnU.SetOnTouch( btn_u );
 moveButtons.AddChild( btnU );

  btnD = app.CreateButton( "Down", 0.2, 0.16 );
 btnD.SetOnTouch( btn_d );
 moveButtons.AddChild( btnL );


Ahora "refactoricemos" el código anterior para escribir menos y con la minima repetición. Una función generara nuestros botones, la misma para todos:

// generar botones
function getButton(target, label, w,h,callback){
    var el = app.CreateButton( label, w, h );
    el.SetOnTouch( callback );
    target.AddChild( el );
    return el;
}

Y una única llamada crea cada una de nuestros cuatro botones:

  btnL = getButton( moveButtons, "Left", 0.2, 0.16, btn_l );
  btnR = getButton( moveButtons, "Rigth", 0.2, 0.16, btn_r );
  btnU = getButton( moveButtons, "Up", 0.2, 0.16, btn_u );
  btnD = getButton( moveButtons, "Down", 0.2, 0.16, btn_d );

Podemos enviar más parámetros: color de fondo, color de texto, posición, etc y la función aplicará todos los procesos al elemento, en una sola pasada.

continuará...

920 Text Editor y ES File Explorer herramientas para desarrollar apps con DroidScript

DroidScript incorpora un editor que puede funcionar en dos modos:

   - Desde en el dispositivo con la propia aplicación.
   - Via web desde navegador

El editor nativo satisface las minimas necesidades pero no permite
editar otros ficheros salvo el de la app que estamos creando. El editor web tiene más funcionalidades permitiendo la edición de otros ficheros de la aplicación que desarrollamos.

Es por ello que necesitamos un buen editor auxiliar para editar los ficheros auxiliares que necesitemos para nuestra aplicación.

Como editor de texto recomiendo 920 Text Editor una app, gratuita y excelente que cumple a la perfección con la tarea de editar los ficheros auxiliares de nuestra app.

La segunda aplicación necesaria es un sistema de ficheros. Recomiendo ES File Explorer. Crear carpetas, copiarlas, renombrar, duplicar y cualquier cosa que necesitemos para organizar nuestros ficheros.


Es importante que las herramientas estén a nuestro servicio y no a la inversa.

Por eso esto son solo recomendaciones. Usa las que mejor te parezcan. Lo importante es que empieces a programar y descubras las posibilidades de DroidScript.