Llega el evento técnico Xamarin que estabas esperando, Monkey Conf!.
Monkey Conf será un evento gratuito, en el que trataremos temas relacionados con desarrollo móvil, Xamarin, Xamarin.Forms, App Center, testing y más…
La fecha
Será el próximo Sábado, 01 de Diciembre de 09:30h a 18:30h (GMT+1). Tendremos dos tracks en paralelo con diferentes sesiones técnicas de 50 minutos de duración cada una. Además contaremos con regalos y sorpresas!.
NOTA: Las entradas del evento son gratuitas pero limitadas!
El lugar
El evento se celebrará en Liferay. Dirección detallada:
Paseo de la Castellana, 280, 28046 Madrid, Madrid
Call 4 Papers
¿Has desarrollado una aplicación con Xamarin?, ¿quieres hablar acerca de como usas App Center?, ¿revisar las próximas novedades de Xamarin.Forms?, ¿un taller?. El C4Pdel evento está abierto y estoy seguro que puedes hablar sobre algun tema que interese y ayude al resto!
Necesitar personalizar la barra superior de la aplicación añadiendo un logo, o un texto personalizado (utilizando una fuente específica, múltiples líneas, etc.) es bastante habitual. Hasta ahora, en Xamarin.Formsera algo posible pero…utilizando un Custom Renderer. Es un punto positivo de Xamarin.Forms, poder crear un Custom Renderer para acceder a características y elementos específicos de cada plataforma. Sin embargo, añade la necesidad de añadir más código (por plataforma) para conseguir un resultado.
Sin embargo, con la llegada de Xamarin.Forms 3.2 nos llega TitleView, una nueva opción para personalizar la barra superior sin necesidad de llegar a necesitar código específico por plataforma.
TitleView
TitleViewes parte de NavigationPage, donde se muestra el contenido del título de una ContentPage.
Cabecera personalizada
Comenzamos por un ejemplo sencillo. Vamos a personalizar la cabecera con un icono y título:
Mostramos un listado de peliculas de modo que, cada vez que cambia el texto de la barra de búsqueda, se actualiza el contenido de la página con el listado de películas filtrado.
El resultado:
Puedes encontrar el ejemplo en GitHub:
Limitaciones o problemas conocidos actuales
Entre el listado de limitaciones actuales encontramos:
SearchBar debe ser contenido en un panel con HorizontalOptions=LayoutOptions.Fill y VerticalOptions=LayoutOptions.Fill, o bien, utilizar WidthRequest y HeightRequest específicos para que todo se vea correctamente en iOS.
TitleView no es compatible con Android FormsApplicationActivity.
El contenido no puede ser más grande que el tamaño predeterminado de la barra de navegación en iOS/UWP. En caso de intentarlo, habrá recorte de forma automática.
Ya contábamos con las propiedades BackTitle, Title, TitleIcon y ahora con TitleView ocupando el mismo espacio en la barra de navegación, puede que haya conflictos y espacio limitado para admitir todas estas propiedades al mismo tiempo. Esto variará según la plataforma y el tamaño de la pantalla.
El pasado 26 de Septiembre, teníamos en SVQXDGun divertido evento donde abriendo debate e intercambiando ideas algunos de los ejemplos revisamos opciones disponibles para conseguir interfaces atractivas con Xamarin.Forms. Vimos opciones como efectos, Custom Renderers, SkiaSharp, VisualStateManager, etc.
El material
A continuación puedes encontrar la presentación utilizada en el evento:
Las aplicaciones de consola son geniales!. Probablemente, has realizado alguna aplicación de consola con alguna pequeña (o gran) herramienta.Tener una aplicación de consola tiene ventajas: liviana, multiplataforma, rápida, etc.
¿Y si pudiesemos realizar aplicaciones de consola con Xamarin.Forms?.
gui.cs
Estamos ante un Toolkit de UI para .NET, .NET Core y Mono que permite crear apliaciones de consola (si, con interfaz!) para Linux, macOS y Windows. Creado por Miguel de Icaza.
Añade soporte a colores, reescalado de pantalla, eventos, async, etc. A nivel de gestión de vistas es bastante similar a otros frameworks de UI como GTK# .
Conceptos básicos
gui.cs cuenta on Application.Run, que facilita un bucle principal donde:
Procesar eventos de teclado.
Gestiona el foco.
Redibuja áreas de la pantalla.
Timers.
Etc.
Cada elemento visual, hereda de la clase View. Toda View cuenta con propiedades X, Y, Height y Width para la gestión de tamaño y posición. Todo se pone más interesante al poder realizar composición de Views.
¿Y por qué Xamarin.Forms?
Buena pregunta. El framework ya permite grandes posibilidades, es sencillo de usar, así que, ¿por qué?.
Why not?
Xamarin.Forms cada vez llega a más plataformas tras los backends de WPF y GTK, además de seguir aumentando en posibilidades. Ya había utilizada gui.cs para herramientas y pruebas, vi un tweet, nació un reto personal y voila. ¿Por qué no añadir la posibilidad de crear aplicaciones de consola con Xamarin.Forms?.
Backend gui.cs
Disponible en GitHub y en NuGet, nace el backend de Xamarin.Forms de gui.cs.
NOTA: Todos los ejemplos anteriores estan realizados con Xamarin.Forms.
Actualmente con soporte a:
ContentPage
Layouts
Label
Button
Editor
Entry
ListView
ProgressBar
Switch
Paulatinamente se añadirá soporte a otras características y controles.
¿Cómo lo uso?
Partimos de una aplicación de consola. Tras crear la aplicación, añadimos el paquete NuGet Terminal.Gui.Forms:
Se encarga de añadir las referencias necesarias tanto a Terminal.Gui como a Xamarin.Forms.
Creamos un Application de Xamarin.Forms:
public class App : Xamarin.Forms.Application
{
public App()
{
MainPage = new MainView();
}
}
Se encargará de iniciar y establecer la página inicial. La página inicial, creada con XAML:
La página cuenta con una ViewModel enlazada que se encarga de usar un servicio que accederá a información de OpenWeatherMap para informar de datos climatológicos dado un código postal.
Sólo nos falta, en la clase Program, inicializar Terminal.Gui, XamarinForms; cargar nuestra aplicación; y ejecutar la misma:
public class Program
{
public static void Main()
{
Terminal.Gui.Application.Init();
Forms.Init();
var app = new App();
var window = new FormsWindow("WeatherApp");
window.LoadApplication(app);
Terminal.Gui.Application.Run();
}
}
Sencillo, ¿verdad?. Veamos el resultado:
Puedes encontrar el ejemplo en GitHub:
Recuerda, es una Preview…
Estamos ante la primera Preview con un soporte limitado de guis.cs y de Xamarin.Forms. Sin embargo, hay algunas características aun no disponibles:
Xamarin.Formsañade una capa de abstracción sobre la capa de la interfaz de usuario permitiendo definir la misma una única vez siendo válida para todas las plataformas.
A pesar de definir la interfaz de usuario una única vez para todas las plataformas, tenemos la posibilidad de realizar personalizaciones y adaptaciones para ofrecer la mejor experiencia posible en cada una de las plataformas soportadas.
La clase Device
La clase Devicesin duda alguna es una de las claves a la hora de personalizar la interfaz de usuario por plataforma. Esta clase contiene diversas propiedades y métodos para personalizar la UI y la funcionalidad en base a la plataforma.
Hasta ahora…
Dentro de la clase Device, la propiedad OSpermitía identificar la plataforma en la que se ejecuta la aplicación. La extensión demarcado OnPlatformpermite personalizar la interfaz por plataforma. La extensión OnPlatform esta soportada por la clase OnPlatformExtension (se permite la abreviatura OnPlatform desde XAML) que define las siguientes propiedades:
Default: Representa el valor por defecto que aplica a todas las plataformas.
Android: Valor aplicado en Android.
GTK: Valor aplicado en plataformas GTK.
iOS: Valor aplicado en iOS.
macOS: Valor aplicado en macOS.
Tizen: Valor aplicado en plataformas Tizen.
UWP: Valor aplicado en Universal Windows Platform
WPF: Valor aplicado en la plataforma Windows Presentation Foundation.
La extensión de marcado OnIdiompermite realizar personalizaciones de la apariencia basadas en el tipo de dispositivo donde corre la App. Soportado por la clase OnIdiomExtension define las siguientes propiedades:
Default: Valor por defecto, aplicado a todos los dispositivos.
Phone: Valor aplicado a teléfonos.
Tablet: Valor aplicado a tabletas.
Desktop: Aplicado a plataformas de escritorio.
TV: Valor aplicado a plataformas TV.
Watch: En este caso, el valor se aplica a plataformas Watch.
La StatusBar es un área importante de cara al usuario final. Disponible para mostrar información importante relacionada con el estado del sistema (hora, batería, red, etc.) además de notificaciones de otras aplicaciones.
Al desarrollar aplicaciones móviles, entre los objetivos, debemos conseguir un estilo único y uniforme. Para conseguirlo, en ocasiones será necesario modificar el aspecto de la StatusBar o incluso cambiarlo de forma uniforme para adaptarla a diferentes páginas de nuestra aplicación.
¿Cómo personalizamos la StatusBar?. En este artículo vamos a crear un efecto de Xamarin.Forms para personalizar la StatusBar en Android, iOS y en UWP.
Efectos
Un efecto permite el acceso al control nativo de cada plataforma con el objetivo de personalizarlo, principalmente aplicando pequeños cambios estéticos o de comportamiento. Permiten simplificar la personalización del control y sobretodo se convierten en “piezas” reutilizables de código incluso aceptando parametrización.
Crear un efecto
El proceso de creación de un efecto, se puede resumir en una serie de sencillos pasos:
Crear en la libería .NET Standard una clase que herede de RoutingEffect. Código independiente de la plataforma encargado de hacer el wrapping del efecto. Podemos definir distintas propiedades que permitan modificar la acción realizada por el efecto. Por ejemplo, en un efecto encargado de aplicar Blur a una imagen, se puede definir una propiedad encarga de aplicar mayor o menor distorsión.
Crear clases en cada plataforma soportada que hereden de PlatformEffect.
Sobrecargar el método OnAttached y añadir la lógica de personalización del control.
Sobrecargar el método OnDetached y añadir lógica de liberación de recursos.
Añadir el atributo ResolutionGroupName. Este atributo permite establecer el nombre del creador o compañia tras el efecto. Recuerda que uno de los objetivos fundamentales de los efectos es lograr permitir compartir y reutilizar con suma facilidad. Con este atributo se previenen colisiones con otros efectos que compartan nombre.
Añadir el atributo ExportEffect. Este atributo registra el efecto con un identificador único usado por Xamarin.Forms, junto al nombre del grupo, permite localizar y aplicar el efecto.
Definición del efecto
Comenzamos con la definición del efecto. Creamos una clase que hereda de RoutingEffect:
public class StatusBarEffect : RoutingEffect
{
public Color BackgroundColor { get; set; }
public StatusBarEffect() : base("Xamarin.StatusBarEffect")
{
}
}
Fíjate que definimos una propiedad de tipo Color llamada BackgroundColor que nos permitirá establecer el color de la StatusBar.
Android
En Android, accedemos a la Window de la actividad, para modificar el color de la StatusBar utilizando el método SetStatusBarColor:
var statusBarEffect = (StatusBarXamarinForms.Effects.StatusBarEffect)Element.Effects.FirstOrDefault(e => e is StatusBarXamarinForms.Effects.StatusBarEffect);
if (statusBarEffect != null)
{
var backgroundColor = statusBarEffect.BackgroundColor.ToAndroid();
Window currentWindow = GetCurrentWindow();
currentWindow.SetStatusBarColor(backgroundColor);
}
Convertimos el color de Xamarin.Forms a Android utilizando la extensión ToAndroid. Mientras que, para tener acceso de forma sencilla a la actividad actual, usamos el plugin CurrentActivityPlugin:
var window = CrossCurrentActivity.Current.Activity.Window;
iOS
En iOS, accedemos a la StatusBar, y le establecemos el color de fondo utilizando la propiedad BackgroundColor:
if (statusBarEffect != null)
{
UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
if (statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:")))
{
statusBar.BackgroundColor = statusBarEffect.BackgroundColor.ToUIColor();
}
}
En este caso, el color lo convertimos a un UIColor con la extensión ToUIColor.
UWP
En el caso de UWP, contemplamos dos posibilidades:
En los últimos tiempos, la mejora de Xamarin.Forms tanto en posibilidades a nivel de UI (VisualStateManager, FlexLayout, etc.) como a nivel de renderers y rendimiento (a destacar en Android) ha sido importante.
Realmente, en el estado actual de Xamarin.Forms se pueden conseguir aplicaciones nativas de gran escala, con interfaces cuidadas y con alta integración con la plataforma. Hay que tener en cuenta el conjunto de Custom Renderers (código específico en cada plataforma) necesario para lograrlo.
NOTA: La elección entre Xamarin Classic o Xamarin.Forms es importante. Es necesario evaluar la aplicación a desarrollar, el conjunto de características específicas de cada plataforma (que pueden requerir un Custom Renderer), etc.
Es cada vez mayor el recopilatorio de ejemplos Open Source con Xamarin.Forms buscando interfaces complejas:
En este evento, vamos a analizar entre todos, abriendo debate e intercambiando ideas algunos de los ejemplos revisando opciones disponibles para conseguir ciertos resultados. Hablaremos de opciones como efectos, Custom Renderers, SkiaSharp, VisualStateManager, etc.
El lugar
El evento se celebrará en la ETS de Ingeniería Informática.
Dirección detallada:
E.T.S. Ingeniería Informática – Universidad de Sevilla, Aula B1.32 Av. Reina Mercedes s/n Sevilla Se 41012
La fecha
Será el próximo Miércoles, 26 de Septiembre de 19:00h a 20:30h (GMT+1).
OpenJDK es una opción alternativa al JDK de Oracle creada y diseñada con el desarrollo Android en mente. La idea es conseguir una versión más reducida (descarga menor, menos espacio en disco), evitar problemas con instaladores y herramientas de terceros además de mejorar la experiencia de desarrollo evitando que futuras actualizaciones de JDK (9, 10) afecte al desarrollo en Android.
Actualmente ya se puede probar en las últimas versiones de Visual Studio tanto para Windows como macOS y a partir de la versión 15.9 en Windows y 7.7 en macOS, será la opción que vendrá por defecto.
Ventajas
Las principales ventajas son:
Contar siempre con una versión operativa de OpenJDK con desarrollo Android independientemente de JDKs o herramientas de terceros.
Descargas de menor tamaño.
Menor espacio en disco.
Evitar problemas de configuración y versionado relacionadas con JDK.
NOTA: Al momento de escribir este artículo, estamos probando con la versión 1.8.0.9 de OpenJDK . Es posible que pruebes con una versión posterior. Descarga la versión más reciente y el único cambio es la versión y nombre de la carpeta de OpenJDK .
En Windows
Tras descargar, en Windows debemos copiar la carpeta descomprimida en C:\Archivos de programa\Android\jdk\microsoft_dist_openjdk_1.8.0.9
A continuación, accedemos a la configuración de Xamarin, Android Settings:
Y cambiamos la ruta de «Java Development Kit Location» por la de OpenJDK.
En macOS
En macOS debemos descomprimir OpenJDK en $HOME/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_1.8.0.9.
Tras crear la carpeta, desde Visual Studio macOS, accedemos a Tools > SDK Manager > Locations donde cambiaremos la ubicación del SDK de Java por la de OpenJDK.
NOTA: En cualquier momento podemos volver a usar el JDK de Oracle. Bastará con volver a cambiar las rutas y recompilar la solución.
La evolución de Xamarin.Forms es meritoria. En los últimos tiempos se han recibido novedades interesantes como efectos, vistas nativas, Forms Embedding, FlexLayout, etc. Sin embargo, en muchos casos se sigue asociado a desarrollos muy simples o formularios básicos.
Realmente, en el estado actual de Xamarin.Forms se pueden conseguir aplicaciones nativas de gran escala, con interfaces cuidadas y con alta integración con la plataforma. Hay que tener en cuenta el conjunto de Custom Renderers (código específico en cada plataforma) necesario para lograrlo.
NOTA: La elección entre Xamarin Classic o Xamarin.Forms es importante. Es necesario evaluar la aplicación a desarrollar, el conjunto de características específicas de cada plataforma (que pueden requerir un Custom Renderer), etc.
En este artículo, vamos a tomar como referencia un diseño de Dribble, que intentaremos replicar con Xamarin.Forms paso a paso.
Carátula circular
Comenzamos por una de las partes principales de la vista, la carátula circular. Vamos a utilizar FFImageLoading junto a las opciones de transformación disponibles:
Tenemos un botón totalmente circular. Podríamos al igual que la barra de progreso circular, crearlo con SkiaSharp facilmente. Sin embargo, si queremos contar con un botón, debemos crear un Custom Renderer.
Contamos con un botón circular preparado para utilizar con ButtonCirclePlugin. Tras añadir el paquete NuGet, añadimos el namespace:
La única parte con mayor complejidad de la animación, es que:
Por un lado mientras se esta reproduciendo la música, debe estar en ejecución en bucle.
Por otro lado, si el usuario pausa la reproducción o bien, la canción termina; se debe pausar o detener la animación.
Para la reproducción en bucle utilizamos una Task donde repetimos la misma animación. Para cancelar la Task hacemos uso de CancellationTokenSource. Para pausar la animación usamos:
ViewExtensions.CancelAnimations(CoverImage);
Progreso circular
Sin duda alguna, una de las claves de la vista es la barra de progreso circular. Por un lado, podemos irnos a por Custom Renderer y aprovechar código nativo en cada plataforma. Si queremos conseguir todo sólo con código compartido podríamos conseguir una barra circular de forma sencilla con imágenes y rotaciones, por ejemplo.
En este caso, vamos a utilizar SkiaSharp.
public class CircleProgress : SKCanvasView
{
}
Para dibujar el progreso circular, utilizaremos el método DrawPath para dibujar un Path al que le daremos la forma deseada utilizando el método AddArc.
FFImageLoading – Con el objetivo principal de gestionar la carátula circular. Esta librería también nos facilita importante funcionalidad relacionada con el cacheo de imágenes, etc. Aunque recuerda, en este ejemplo todas las imágenes son locales.
ButtonCirclePlugin – De forma sencilla permite crear botones circulares. Ideal para el botón central que gestiona Play/Pause. Además, soporta directamente iconos con algunas de las fuentes más utilizadas.
Y llegamos a la parte final del artículo. Es un concepto de artículo que ya hemos realizado previamente con la creación de la interfaz de Netflix, por ejemplo. Es sumamente divertido preparar un diseño con cierto nivel de «reto» e intetar “desgranar” cada paso a realizar. Pero, ¿qué te parece este tipo de artículos?.
Cualquier duda o comentario es bienvenido en los comentarios!
La evolución de Xamarin.Forms es meritoria. En los últimos tiempos se han recibido novedades interesantes como efectos, vistas nativas, Forms Embedding, FlexLayout, etc. Sin embargo, en muchos casos se sigue asociado a desarrollos muy simples o formularios básicos.
Realmente, en el estado actual de Xamarin.Forms se pueden conseguir aplicaciones nativas de gran escala, con interfaces cuidadas y con alta integración con la plataforma. Hay que tener en cuenta el conjunto de Custom Renderers (código específico en cada plataforma) necesario para lograrlo.
NOTA: La elección entre Xamarin Classic o Xamarin.Forms es importante. Es necesario evaluar la aplicación a desarrollar, el conjunto de características específicas de cada plataforma (que pueden requerir un Custom Renderer), etc.
En este artículo, vamos a tomar como referencia un diseño de Dribble, que intentaremos replicar con Xamarin.Forms paso a paso.
Lo primero que debemos realizar, es un breve análisis de la pantalla:
Simplificando, estamos ante un contador hacia atrás, en concreto, hacia una fecha. En Xamarin.Forms contamos con la clase Device, una clase importante que nos facilita información importante como si estamos en una plataforma u otra, o si ejecutamos la App en teléfono o tableta. Además, Device cuenta con un Timer que podemos utilizar para la cuenta atrás, entre otras opciones.
De lo que más llama la atención de la simple interfaz de usuario, son los degradados. La línea de progreso circular es candidata a realizarse con SkiaSharp. A pesar de poder abordarla con un Custom Renderer, SkiaSharp nos facilitará dibujarla una única vez para todas las plataformas. El botón, a pesar de poder abordarlo también con SkiaSharp, vamos a realizarlo en nativo para poder contar con los diferentes estados, etc. En este caso, vamos a necesitar Custom Renderer o plugin de comunidad.
La carátula circular no es compleja. Entre en conjunto de posibilidades que tenemos, FFImageLoading gana enteros por su facilidad de uso, opciones de cache además de transformaciones.
La rotación de la carátula es una sencilla animación de rotación. Xamarin.Forms cuenta con una API de animaciones bastante completa.
¿Manos a la obra?
Imagen circular
Comenzamos por una de las partes principales de la vista, la imagen circular. Vamos a utilizar FFImageLoading junto a las opciones de transformación disponibles:
Sin duda alguna, la clave de la vista es la barra de progreso circular… y con degradado!. Por un lado, podemos irnos a por Custom Renderer y aprovechar código nativo en cada plataforma. Si queremos conseguir todo sólo con código compartido podríamos conseguir una barra circular de forma sencilla con imágenes y rotaciones, por ejemplo. Sin embargo, necesitamos diferentes recursos gráficos para adaptarnos a diferentes resoluciones. Por otro lado, el degradado añade complejidad.
¿La solución sencilla?
SkiaSharp. Engine gráfico 2D disponible para iOS, Android, UWP, macOS, Windows, etc.
Nos permite trabajar de forma sencilla desde co n figuras básicas a efectos y shaders más complejos.
En este caso, vamos a crear un control personalizado que herede de la clase SKCanvasView.
SKCanvasView es una vista Xamarin.Forms donde podremos dibujar utilizando SkiaSharp.
public class CircleCountdown : SKCanvasView
{
}
Vamos a crear varias BindableProperties para gestionar el comportamiento y apariencia de la barra de progreso:
public static readonly BindableProperty StrokeWidthProperty =
BindableProperty.Create(nameof(StrokeWidth), typeof(float), typeof(CircleCountdown), 10f, propertyChanged: OnPropertyChanged);
public static readonly BindableProperty ProgressProperty =
BindableProperty.Create(nameof(Progress), typeof(float), typeof(CircleCountdown), 0f, propertyChanged: OnPropertyChanged);
public static readonly BindableProperty ProgressStartColorProperty =
BindableProperty.Create(nameof(ProgressStartColor), typeof(Color), typeof(CircleCountdown), Color.Blue, propertyChanged: OnPropertyChanged);
public static readonly BindableProperty ProgressEndColorProperty =
BindableProperty.Create(nameof(ProgressEndColor), typeof(Color), typeof(CircleCountdown), Color.Red, propertyChanged: OnPropertyChanged);
public float StrokeWidth
{
get { return (float)GetValue(StrokeWidthProperty); }
set { SetValue(StrokeWidthProperty, value); }
}
public float Progress
{
get { return (float)GetValue(ProgressProperty); }
set { SetValue(ProgressProperty, value); }
}
public Color ProgressStartColor
{
get { return (Color)GetValue(ProgressStartColorProperty); }
set { SetValue(ProgressStartColorProperty, value); }
}
public Color ProgressEndColor
{
get { return (Color)GetValue(ProgressEndColorProperty); }
set { SetValue(ProgressEndColorProperty, value); }
}
Contamos con:
StrokeWidth: Permite controlar el grosor de la barra de progreso.
Progress: Determina el progreso. Acepta un valor numérico entre 0 y 1.
ProgressStartColor: ¿Recuerdas la necesidad de crear degradado?. Por ese motivo, vamos a contar con esta propiedad para gestionar el color de inicio del degradado.
ProgressEndColor: Color final del degradado.
Para dibujar el progreso circular, utilizaremos el método DrawPath para dibujar un Path al que le daremos la forma deseada utilizando el método AddArc.
using (SKPath path = new SKPath())
{
path.AddArc(rect, StartAngle, angle);
canvas.DrawPath(path, paint);
}
¿Y el degradado?.
En lugar de utilizar un SKColor (color en SkiaSharp) sólido, vamos a crear un shader. Utilizaremos el método CreateSweepGradient para crear el degradado:
El progreso lo tenemos enlazado a una propiedad en la ViewModel donde se irá realizando el cálculo del progreso.
Botón con degradado
Llegamos al botón con degradado. Podríamos al igual que la barra de progreso circular, crearlo con SkiaSharp facilmente. Sin embargo, un botón cuenta con estados que tienen importancia. Habilitado, deshabilitado, pulsado, etc. Si queremos contar con un botón, debemos crear un Custom Renderer. No es complejo haciendo un Custom Renderer del botón y utilizando RippleDrawable con GradientDrawable en Android, y CAGradientLayer en iOS.
Sin embargo, la comunidad de Xamarin es fantástica. Contamos con un botón con degradado preparado para utilizar con Skor.UI. Tras añadir el paquete NuGet, añadimos el namespace:
De nuevo, muy sencillo esta parte de la interfaz, ¿verdad?.
Otros
Y no hay que olvidar que estamos haciendo un contador hacia atrás. ¿Formas de conseguirlo?. Tenemos diferentes opciones, directamente en Xamarin.Forms, tenemos el método StartTimer en la clase Device:
FFImageLoading – Con el objetivo principal de gestionar la imágen circular. Esta librería también nos facilita importante funcionalidad relacionada con el cacheo de imágenes, etc. Aunque recuerda, en este ejemplo todas las imágenes son locales.
SKOR.UI – Nos facilita la creación de botones con degradados evitandonos crear un Custom Renderer.
Y llegamos a la parte final del artículo. Es un concepto de artículo que ya hemos realizado previamente con la creación de la interfaz de Netflix, por ejemplo. Es sumamente divertido preparar un diseño con cierto nivel de «reto» e intetar “desgranar” cada paso a realizar. Pero, ¿qué te parece este tipo de artículos?.
Cualquier duda o comentario es bienvenido en los comentarios!