lunes, 25 de enero de 2016

Artículo técnico sobre la Design Library de Android: Conociendo al Coordinator Layout.

Colaborador: Saul Molinero , GDG Santiago de Compostela  


En el Google I/O 15, Google lanzó una librería de diseño que implementa varios componentes estrictamente relacionados con la especificación de Material Design, entre ellos se encuentran nuevos ViewGroups  como es el AppbarLayout, CollapsingToolbarLayout y CoordinatorLayout.


Bien combinados y configurados estos Viewgroups pueden ser muy poderosos, aquí van unos ejemplos.

CoordinatorLayout



Como su propio nombre indica, el objetivo y filosofía de este ViewGroup es el de coordinar las vistas de su interior.


Veamos la siguiente imagen:


simple_coordinator.gif


En este ejemplo se puede apreciar cómo las vistas se coordinan entre sí, a simple vista podemos ver que algunas dependen de otras, por ejemplo, el contenido scrolleable está relacionado con la cabecera y con el FAB.
Veamos el código que conforma este ejemplo:

`


Si examinamos el esqueleto de este layout probablemente parezca más sencillo, el CoordinatorLayout tiene únicamente tres hijos: un AppbarLayout, una vista scrolleable y un FloatingActionBar.



Empecemos a examinar estos componentes.

AppBarLayout



Se podría decir que un AppBarLayout es un LinearLayout con superpoderes, los hijos de este ViewGroup se colocan en forma vertical unos debajo de otros que, con ciertos parámetros, permiten aparecer y desaparecer con diferentes animaciones en función del movimiento de scroll que se realice sobre el contenido.


Puede sonar algo confuso al principio, por eso creo que una imagen vale más que mil palabras y si es un .gif, todavía mejor:


2015-10-27-03_51_37.gif


El AppBarLayout en este caso es la vista coloreada de azul, colocada debajo de la imagen que se colapsa, contiene un Toolbar, un LinearLayout con el título,un subtítulo y un TabLayout.




Podemos gestionar el comportamiento de los hijos directos de un AppbarLayout con el atributo: layout_scrollFlags. El valor layout_scrollFlags está presente en casi todas las vistas, si no fuera especificado en ninguna, los componentes dentro del AppbarLayout quedarán estáticos permitiendo que el contenido scrollable pase por detrás de esta.


Con el valor: snap, evitamos caer en medios estados logrando que siempre se oculte o expanda el alto total de la vista. El LinearLayout que contiene el texto será mostrado siempre que el usuario haga un movimiento de scroll hacia arriba (valor enterAlways), y el TabLayout, siempre quedará a la vista, ya que no se ha especificado ninguna bandera.


                                                                        
SCROLL_FLAG_ENTER_ALWAYS: When entering (scrolling on screen) the view will scroll on any downwards scroll event, regardless of whether the scrolling view is also scrolling.


SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED: An additional flag for enterAlways which modifies the returning view to only initially scroll back to it's collapsed height.                      


SCROLL_FLAG_EXIT_UNTIL_COLLAPSED: When exiting (scrolling off screen) the view will be scrolled until it is 'collapsed'.                              


SCROLL_FLAG_SCROLL: The view will be scroll in direct relation to scroll events.
                                                                                       
SCROLL_FLAG_SNAP: Upon a scroll ending, if the view is only partially visible then it will be snapped and scrolled to it's closest edge.                       


Estos son los parámetros disponibles, de acuerdo a la documentación en Google Developers. De todos modos, mi recomendación es siempre jugar con el ejemplo. En este repositorio se pueden encontrar el conjunto de código de donde se han extraídos los snippets que se muestran en este artículo.


CoordinatorLayout Behaviors



Hagamos una pequeña prueba, vayamos a Android Studio y creamos un proyecto con la siguiente plantilla: Scrolling Activity. Sin hacer ninguna modificación, lo compilamos y esto será lo que nos encontremos:


unmodified_template.gif

Si revisamos el código generado, ni en los layouts como en las clases java generadas no encontraremos nada en cuanto a una animación que oculta y muestra el FAB. ¿Por qué?


La respuesta está en el propio código fuente del FloatingActionButton, desde que Android Studio en su v1.2 incluye un decompilador java, hacemos ctrl/cmd + click en el nombre de la clase y ya tendremos el código fuente:




Quien se está encargando de la animación de ocultar y mostrar el FAB es un elemento llamado behavior, en concreto una extensión de CoordinatorLayout.Behavior<FloatingAcctionButton>, el cual, dependiendo de algunos factores, muestra el FAB o no.


Los behaviors, como su propio nombre indican, permiten controlar el comportamiento de los elementos dispuestos dentro de un CoordinatorLayout. Antes hemos mencionado que la filosofía de éste ViewGroup era la de coordinar las vistas de su interior, pues con los behaviors, podremos especificar esta coordinación entre las vistas. Interesante, ¿verdad?.


SwipeDismissBehavior



Sigamos buceando, si buscamos dentro del paquete de la design support library, nos encontraremos con una clase pública llamada: SwipeDismissBehavior. Con este behavior  muy fácilmente podremos implementar la funcionalidad swipe to dismiss:


sypw.gif



Custom Behaviors



Crear un behavior personalizado no es tan difícil como pueda parecer, únicamente hay que tener en cuenta dos elementos clave: el elemento hijo y dependencia y tener clara la dinámica del CoordinatorLayout.


child_dependency.png

El hijo es la vista que realzará el comportamiento, la dependencia será quien sirva de disparador para interactuar con el elemento hijo, en el siguiente ejemplo el hijo sería el ImageView del perro y la dependencia el Toolbar, de tal modo que siempre que se mueva el Toolbar se moverá el ImageView.


behavior.gif


Para crear un behavior personalizado, lo primero es extender de: CoordinatorLayout.Behavior<T>, siendo T la clase a la que pertenece la vista que nos interese coordinar, posteriormente hay que sobreescribir dos métodos:


- layoutDependsOn
- onDependentViewChanged


El método layoutDependsOn se llamará cada vez que algo ocurra algo en el layout, lo que tendremos que hacer será devolver true cuando se produzcan cambios relacionados con nuestra dependencia, por ejemplo, cuando se haya hecho scroll, de esta forma podremos hacer que nuestra vista hija reaccione en consecuencia.




Siempre que se devuelve true en layoutDependsOn se llamará el segundo método clave: onDependentViewChanged, aquí es donde debemos implementar las animaciones, translaciones o movimientos deseados en nuestra vista hija en función de los parámetros actuales de la dependencia que llega por parámetro.






Recursos


Introduction to coordinator layout on Android - Grzesiek Gajewski

miércoles, 20 de enero de 2016

Artículo técnico: Material Design + Bootstrap (Español and English) por Samuel Hindley del GDG Málaga

Colaborador: Samuel Hindley, GDG Málaga
Artículo técnico: Material Design + Bootstrap (Español and English)

Nota del equipo editorial: Comenzamos una serie de posts con contenidos más técnicos, en esta caso con ejemplos de código. Iremos publicando nuevos artículos en esta línea en los próximos semanas, así como anunciamos que estamos abiertos a recibir propuestas de artículos.

Material Design + Bootstrap (Español)


banner.jpg


En cuanto a desarrollo front-end se refiere, son pocas las personas que no conocen Bootstrap. Y para quien no lo sepa se trata de uno de los frameworks más populares, creado por Twitter, para el desarrollo de proyectos web móviles y “responsivas” en HTML, CSS y JavaScript. Bootstrap ofrece un extenso catálogo de elementos HTML y CSS modificados para crear unos diseños espectaculares con un esfuerzo mínimo.


bootstrap.png


Por otro lado, el concepto Material Design se refiere a una filosofía y conjunto de pautas enfocadas al diseño en Android, aunque hoy en día estos populares principios de diseño para UI/UX se están utilizando para todo tipo de plataformas. Fue Google quien lo creó y lo implementó en su sistema operativo móvil desde la versión 5.0 Lollipop y a partir de ahí la mayoría de las grandes aplicaciones Android empezaron a adoptar este diseño.


Recibe su nombre por basarse en objetos materiales donde la profundidad de las capas, las superficies, los bordes, las sombras y los colores juegan un papel muy importante.
materialdesign.png


Ahora, siendo un amante de los principios del Material Design creados por Google y frecuente usuario de Bootstrap quería alguna forma de combinar estos dos elementos para mi página web personal. Ya existen frameworks muy buenos para implementar Material Design como Polymer o AngularJS, pero no los había usado nunca, entonces con una simple consulta en nuestro buscador favorito encontré el resultado de Material Design + Bootstrap:  un gran proyecto en GitHub de FezVrasta llamado Material Design for Bootstrap.


Se trata de un tema de Bootstrap para incluir fácilmente todos los diseños, formas y colores de Material Design en vuestras aplicaciones web basadas en Bootstrap 3 (está en constante desarrollo por lo que no aseguran que funcione al 100% en versiones anteriores).


Se puede incluir de varias formas: usando Bower, Meteor o simplemente incluyendo los archivos CSS después del CSS de Bootstrap y lo mismo con los archivos JavaScript, de forma local o si lo prefieres a través de su CDN oficial. Los archivos JavaScript son muy importantes ya que contienen el código necesario para conseguir ese efecto de “onda” cuando pulsamos sobre alguno de los botones. Con todo esto, nuestros botones, barras de progreso, barras de navegación, etc. serán convertidos automáticamente a ese Material Design que buscamos. A continuación pueden ver algunos ejemplos de cómo quedan los componentes de Bootstrap que estamos acostumbrados a usar:


ejemplos.jpg


Animo a todo aquel que use Bootstrap a probar este tema, muy fácil de usar como habréis visto, y muy útil para darle un “look” más moderno y familiar a vuestros usuarios. Para más información detallada sobre cómo usarlo y sobre cada uno de los elementos podéis visitar el repositorio oficial aquí, donde también podréis apoyar al proyecto y realizar aportaciones al código.


Y para aquellos ansiosos por la versión 4 de Bootstrap, os adelanto que el creador FezVrasta, me ha confirmado que se está trabajando en ello para que tenga total compatibilidad con futuras versiones.

Material Design + Bootstrap (English)


banner.jpg


When it comes to front-end development, there are few people that don´t know what Bootstrap is. And for those who don’t, it's one of the most popular frameworks, created by Twitter, for development in mobile and responsive web projects in HTML, CSS and JavaScript. Bootstrap offers an extensive catalogue of HTML and CSS elements modified to create spectacular designs with minimum effort.


bootstrap.png


On the other hand, the Material Design concept refers to a philosophy and set of guidelines focused on Android design, although nowadays these popular design principles for UI/UX are being used for all kinds of platforms. Google created it and implemented it in their own mobile operating system since version 5.0 Lollipop and from then on most of the major Android apps have begun to adopt this design.


It receives its name because it is based on material objects where the depth of the layers, surfaces, edges, shadows and colours play an important role.


materialdesign.png


Now, being a big fan of the Material Design principles created by Google and a frequent user of Bootstrap I wanted a way of combining these two elements for my personal website. There are already very good frameworks for implementing Material Design like Polymer or AngularJS, but I had never used them before, so with a simple query in our favourite search engine I found the result to Material Design + Bootstrap: a great project on GitHub by FezVrasta called Material Design for Bootstrap.


It consists of a Bootstrap theme to easily include all the designs, shapes and colours of Material Design in your web applications based on Bootstrap 3 (it is in constant development so it is not guaranteed to work 100% on previous versions).


It can be included in several ways: using Bower, Meteor or simply including the CSS files after the Bootstrap CSS and the same with the JavaScript files, locally, or if your prefer through their official CDN. The JavaScript files are very important as they contain the necessary code to achieve that “wave” effect when we press one of the buttons. With all this, our buttons, progress bars, navigation bars, etc. will all be converted automatically to that Material Design we’re looking for. Here you can see some examples of how the Bootstrap components that we’re used to using would look:


ejemplos.jpg


I encourage anyone who uses Bootstrap to try out this theme, very easy to use as you’ve seen, and very useful for giving a more modern and familiar look to our users. For more detailed information about how to use this and about each of its elements you can visit the official repository here, where you can also support the project and make contributions to the code.

And for those anxious for version 4 of Bootstrap, I can tell you that the creator FezVrasta, has confirmed that he is currently working on it so that there will be full compatibility with future versions.