GraphicsControls: Controles dibujados para Xamarin.Forms

Introducción

Xamarin.Forms añ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.

Xamarin.Forms

De la abstracción, en cada plataforma, se crean controles nativos. Es una de las características principales de Xamarin.Forms permitiendo crear apps con controles nativos con la apariencia nativa esperada en cada plataforma, etc. Con propiedades se pueden realizar personalizaciones, y para quien tenga conocimientos de desarrollo móvil nativo en cada plataforma puede llegar mucho más lejos usando Custom Renderers.

Mientras que contar con controles nativos, tiene puntos a favor:

  • Rendimiento nativo.
  • Aspecto nativo.
  • Poder extender creando Custom Renderers con código nativo en cada plataforma.

Pero también alguno negativo:

  • Hay que definir el control en cada plataforma.
  • Los controles tienen apariencia nativa, no la misma. A veces se busca exactamente la misma apariencia y en alguna plataforma hay que añadir código específico para conseguir el resultado.

¿Y sí, pudiéramos elegir si usar un control nativo o un control dibujado?. De esta forma:

  • Quien quiera usar el control nativo, puede.
  • Quien tenga conocimiento de código nativo, puede usar el control nativo y extender usando Custom Renderers.
  • Quien quiera exactamente misma apariencia pixel por pixel, puede usar un control dibujado de exactamente la misma forma en todas las plataformas.
  • Quien quiera extender, y no tenga conocimientos de cada plataforma nativa, puede hacerlo con controles dibujados con una API común.

GraphicsControls

GraphicsControls es una librería experimental de controles dibujados para Xamarin.Forms. En cada plataforma se usan APIs de dibujado nativo:

  • Android -Android Graphics
  • iOS – CoreGraphics
  • macOS – CoreGraphics
  • UWP – Win2D
  • Linux – Skia
  • Tizen – Linux

El objetivo de la librería es ofrecer controles dibujados con soporte a Cupertino, Fluent y Material de todos los controles disponibles en Xamarin.Forms Visual (BoxView, Entry, Button, etc) en todas las plataformas actuales soportadas por Xamarin.Forms.

Controles dibujados

La librería cuenta con controles dibujados. Los controles reproducen la interfaz y comportamiento esperado usando Cupertino, Fluent y Material en todas las plataformas.

Fácil de extender

En cada control, se puede sobrecargar el dibujado del control o de una capa específica de cad control:

public override void Draw(ICanvas canvas, RectangleF dirtyRect)
{

}

Soporte a modo claro/oscuro

Todos los controles tienen soporte para el modo claro y oscuro:

Escritorio y móvil

Se busca dar soporte tanto en plataformas de escritorio como en móvil:

RTL

A pesar de ser controles dibujados, permitir usar los mismos ante cualquier situación es importante. Aspectos como soporte a RTL o accesibilidad es sumamente importante y se tiene en cuenta a la hora de crear los controles:

Accesibilidad

Los controles dibujados usando un Canvas donde dibujar todo el contenido, pero el Canvas se aloja en una vista nativa en cada plataforma. de momento solo se mapea la posibilidad de leer texto pero, de nuevo, a pesar de ser controles dibujados se busca dar el soporte necesario a nivel de accesibilidad.

¿Cuál es el objetivo?

El objetivo buscado es ofrecer una librería de controles dibujados con soporte a Cupertino, Fluent y Material en todas las plataformas soportadas por Xamarin.Forms. Cada control contará con las mismas propiedades y eventos de los controles disponibles en Xamarin.Forms.

Al tener completados todos los controles y dar soporte a todas las plataformas, se creará paquete NuGet.

Tras esto, el feedback e interés en la librería determinará la evolución.

¿Quieres saber más?. Recientemente, hice un streaming enseñando la librería:

Feedback

La librería usa una filosofía diferente a la habitual usada en Xamarin.Forms, controles dibujados en lugar de mapear a controles nativos. Puedes ayudar muchísimo a la evolución de la librería con tu feedback!. ¿Qué te parece la idea?. Recuerda, puedes dejar cualquier feedback en los comentarios de la entrada.

Más información

[Evento TechClub Asturias] Presente y futuro de Xamarin.Forms

El evento

Este 2021 aparece en escena dentro de .NET, .NET MAUI. Se trata de un framework multiplataforma de desarrollo de apps, evolución de Xamarin.Forms. Pero, probablemente existan muchas dudas al respecto, ¿cuál es el estado actual de Xamarin.Forms?, ¿qué ocurrirá con Xamarin.Forms?, ¿qué es exactamente .NET MAUI?. En esta sesión, vamos a realizar un repaso al presente y futuro de Xamarin.Forms intentando resolver todas las dudas con la mayor cantidad de demos posibles.

Tech Club Asturias

La fecha

Será el próximo Miércoles, 27 de Enero de 19:00h a 20:00h (GMT+1).

¿Te apuntas?

Más información

Un vistazo al Xamarin Community Toolkit

Hace un tiempo…

Hace ya varios años, y con James Montemagno junto a varios miembros de la comunidad nacía el Xamarin Community Toolkit. La idea era crear una librería con Converters, efectos, controles, etc. donde añadir contenido creado por al comunidad en una librería con respaldo por Microsoft.

Durante un tiempo, se ha mantenido sin grandes movimientos hasta este año…

Vuelve con más y mejor!

Este año, un servidor junto a Gerald Versluis hemos retomado el concepto inicial con la idea de ayudar en el mantenimiento a la hora de revisar PRs, ideas, crear releases, etc. así como ayudar a la comunidad a llegar al Toolkit y…el Xamarin Community Toolkit ha vuelto con más fuerza que nunca!

Xamarin Community Toolkit

¿Qué ofrece el Community Toolkit a día de hoy?

Behaviors

Los Behaviors permiten asociar código que modifica el comportamiento de un elemento visual.

Los Behaviors disponibles son:

  • EmailValidationBehavior: Permite validar si el texto introducido es un email.
  • EventToCommandBehavior: Permite asociar un evento con un comando.
  • NumericValidationBehavior: Valida si el texto introducido es numérico.
  • AnimationBehavior: Permite lanzar animaciones desde código XAML.
  • MaskedBehavior: Permite añadir una máscara para distinguir si los datos que introduce el usuario son apropiados o inapropiados.
  • UriValidationBehavior: Valida si el texto introducido es una Url.
  • MultiValidationBehavior: Uno de los behaviors más versátiles permitiendo hacer múltiples validaciones de forma sencilla.
  • RequiredStringValidationBehavior: Valida si una caja de texto tiene una cadena vacía o no.
  • UserStoppedTypingBehavior: Este behavior espera a que el usuario deje de escribir para ejecutar un comando. El umbral de espera es ajustable, así como también hay una opción para cerrar el teclado después de que el usuario haya dejado de escribir.
  • ImpliedOrderGridBehavior: Valida el orden de filas y columnas de un Grid.
  • MaxLenghtReachedBehavior: Permite detectar si ha alcanzado el límite de caracteres.
  • CharactersValidationBehavior: Permite validar un mínimo o máximo de caracteres y poder reaccionar en ambos casos (cambiar estilos, etc.).

Converters

Los enlaces de datos normalmente transfieren datos desde una propiedad de origen a una propiedad de destino y, en algunos casos, desde la propiedad de destino a la propiedad de origen. Esta transferencia es sencilla cuando las propiedades de origen y destino son del mismo tipo, o cuando un tipo se puede convertir al otro mediante una conversión implícita.

Sin embargo, cuando no es así, debe realizarse una conversión de tipos. Los Converters se encargan de solucionar estos casos y hacer la conversión de tipos necesario.

El Xamarin Community Toolkit intentará agrupar en una misma librería la mayoría de Converters más utilizados, aquellos que usas en cada proyecto y transfieres de un proyecto a otro.

Los Converters disponibles son:

  • ItemTappedEventArgsConverter
  • ItemSelectedEventArgsConverter
  • ByteArrayToImageSourceConverer
  • MultiConverter
  • DateTimeOffsetConverter

Efectos

Con los efectos se pueden personalizar los controles nativos de cada plataforma y normalmente se usan para pequeños cambios de estilo.

En el Toolkit se cuentan con interesantes efectos:

  • SafeAreaEffect: Es un efecto que se puede agregar a cualquier elemento visual a través de una propiedad adjunta para indicar si ese elemento debe tener en cuenta Safe Area (iOS 11 y superior). Específicamente, ayudará a asegurarse de que el contenido no esté recortado por las esquinas redondeadas del dispositivo. El efecto solo es válido en iOS, lo que significa que en otras plataformas no hace nada.
  • RemoveBorderEffect: Eliminar el borde en Entry. Permite crear cajas de texto totalmente personalizadas.
  • SelectAllTextEffect: Permite seleccionar todo el texto de Entry, etc. al tener el foco.
  • IconTintColorEffect: Permite tintar con un color un icono.
  • TouchEffect: Uno de los efectos que añade más posibilidades. Añade múltiples posibilidades con eventos touch como detectar up/down, long press, etc.

Controles

AvatarView

AvatarView representa de forma visual el nombre de un usuario usando las iniciales y un color de fondo generado. Permite diferentes opciones de personalización tanto con iniciales como con imagen asó como personalizar colores, fuente, etc.

BadgeView

Vista utilizada para notificar a los usuarios notificaciones o el estado de algo. Permite posicionar el elemento en cada esquina (arriba izquierda, arriba derecha, abajo izquierda y abajo derecha) además de poder personalizar tamaños, colores o la animación a usar cuando el badge aparece o desaparece.

CameraView

CameraView permite mostrar una vista previa en vivo de la cámara. ¡Puedes tomar fotos, grabar videos y mucho más!.

DockLayout

Es un Layout que facilita el acoplamiento de contenido en las cuatro direcciones (superior, inferior, izquierda y derecha).

GravatarImageSource

GravatarImageSource permite utilizar fácilmente la imagen de Gravatar de un usuario de Gravatar.com usando nada más que su dirección de correo electrónico.

Expander

El control Expander proporciona un contenedor expandible para alojar cualquier contenido. ¿Te suena este control?. Sí, ha sido movido desde Xamarin.Forms (experimental) al Toolkit.

HexLayout

Un Layout que organiza los elementos en un patrón de panal abejas.

MediaElement

Otro control portado de Xamarin.Forms al Toolkit. Es una vista que permite reproducir video y audio.

RangeSlider

El RangeSlider es un control deslizante con dos Thumbs que permite seleccionar rangos numéricos. Con una infinidad de opciones de personalización tanto de fondo, barra y Thumbs, permite adaptar el control a una enorme variedad de necesidades.

SnackBar

Permite mostrar SnackBar, Toasts, etc.

SideMenuView

SideMenuView es un control que permite mostrar un menú derecho/izquierdo de forma simple y flexible.

Shield

Pueden mostrar cierta información de estado de forma similar a una insignia.

StateLayout

Una colección de propiedades adjuntas que le permiten especificar una o más vistas de estado para cualquiera de los Layouts existentes.

TabView

Un control que permite mostrar un conjunto de pestañas y su contenido respectivo. Con posibilidad de personalizar la apariencia de cada pestaña, gestión de animaciones, personalizar la pestaña seleccionada, etc. Abre muchas posibilidades no posibles hasta ahora a la hora de crear pestañas.

UniformGrid

El UniformGrid es como el Grid, pero con todas las filas y columnas con el mismo tamaño.

¿Qué es lo que viene?

La participación y colaboraciones en el Xamarin Community Toolkit por parte de la comunidad Xamarin es cada vez mayor (Gracias!). Gracias a esto, las novedades y nuevas posibilidades llegan de forma frecuente.

Proximamente tendremos:

Popup

Implementación nativa de Popups en cada plataforma.

SegmentedView

SegmentedControl para Xamarin.Forms:

Más información

GitHub: Xamarin Community Toolkit

[Material] Monkey Conf 2020

El evento

En España tenemos una gran comunidad Xamarin y con la idea de contar con un evento de desarrollo relacionado con Xamarin de gran tamaño, hace unos años nacía la Monkey Conf. Tras un par de ediciones, y este año a pesar de las dificultades, queríamos celebrar la tercera edición de la mejor forma posible.

El pasado 02 de Diciembre, celebramos la Monkey Conf 2020. Con una participación constante vía chats, con diferentes speakers de alrededor del mundo y tras ver que los videos del evento ya suman más de 1800 visualizaciones, no me cabe más que agradecer de entrada a sponsors, speakers y asistentes que han hecho el evento posible.

El material

En esta edición, he podido participar en un par de sesiones.

En la primera de las sesiones hable junto a Gerald Versluis acerca del Xamarin Community Toolkit. Se trata de una librería con un conjunto de controles, efectos, converters, etc. que ofrecen funcionalidad extra a Xamarin.Forms.

Mientras que en la segunda sesión, hable de .NET MAUI. El objetivo fundamental de la sesión era hablar de los handlers («nuevos renderers» en .NET MAUI) además de resolver algunas de las preguntas más frecuentes relacionadas con el tema como, ¿funcionaran mis Custom Renderers actuales en .NET MAUI?, ¿cómo será la migración?.

Sesiones

Las casi 12 horas de duración del streaming con todo el evento está disponible en YouTube:

Sin embargo, en el mismo canal de YouTube de la Monkey Conf podrás encontrar cada sesión en un video independiente para facilitarte acceder a la información que deseas.

Más información

El año 2021 será sumamente importante e interesante para los desarrolladores móviles en .NET. Con la llegada de .NET 6 y de .NET MAUI tendremos una enorme cantidad de novedades y temas de los que hablar…

No es raro entonces que, ya hayamos anunciado la Monkey Conf 2021!.

Agenda de la Monkey Conf 2020 disponible!

El evento

El próximo 02 de Diciembre tendrá lugar la tercera edición de la Monkey Conf, el mayor evento de Xamarin celebrado en España.

Monkey Conf 2020

Este año, y debido a las situación actual con el Covid donde lo más importante es cuidar entre todos la salud, el evento será online. Un hecho que ha permitido tener speakers de cualquier lugar del mundo creando una agenda…espectacular!.

La agenda

Ha sido realmente complejo crear la agenda de este año. Por cada sesión elegida se han tenido que rechazar entre otras dos y tres sesiones. La calidad de las sesiones es muy alta!.

La agenda del evento es:

Hora SesiónSpeaker
9:00 – 9:15KeynoteJavier Suarez
 9:20 10:00Xamarin y MonoGameLuis Marcos
10:05 10:45Aplicaciones para todos los públicosJorge Diego Crespo
10:50 11:30No sé Xamarin… ¿Puedo hacer apps para móvil en .NET?Eduard Tomàs
11:35 12:15En mi móvil funciona! // Pipelines XamarinJuan María Lao & Javier Pulido
12:20 13:00Fabulous Functional FrontendsMark Allibone
13:05 13:45Xamarin Community Toolkit: More possibilities with Xamarin.Forms!Gerald Versluis & Javier Suarez
13:50 14:30Taking beautiful UIs from Adobe XD to Xamarin FormsAngel Garcia
15:00 15:40Seguridad en mobileJosé Manuel Montero Ortega
15:45 16:25.NET MAUI HandlersJavier Suarez
16:30 17:10Mastering XAML in Xamarin FormsCharlin Agramonte & Rendy Del Rosario
17:15 17:55Secure mobile apps with the Microsoft Identity platformChristos Matskas
18:00 18:40Shell, Duo, and the Xamarin Community ToolkitShane Neuville
18:45 19:05Un vistazo a Grial UI Kit
19:10 19:30Psst, es una sorpresa…
19:35 19:45CierreJavier Suarez

Una agenda variada donde se tratan temas como videojuegos, accesibilidad, DevOps, .NET MAUI, XAML, Shell, Surface Duo, diseño, MVU y mucho más.

¿Nos vemos en el streaming?

Más información

[Evento] Monkey Conf 2020

El evento

En los últimos años, es un placer organizar la  Monkey Conf. Hablamos del mayor evento centrado en Xamarin realizado en España. Una fecha especial para reunir a la comunidad, disfrutar de sesiones técnicas, networking y compartir momentos entre todos.

Este año, debido a la situación con el Covid-19, el formato del evento debe cambiar y buscar nuevas posibilidades en un formato online.

Monkey Conf 2020

Este año el evento se realizará con un streaming en directo donde seguiremos contando con sesiones técnicas además de alguna sesión sorpresa y regalos para los asistentes.

La fecha

Tras recibir información de diferentes fuentes, sponsors, participantes del año anterior o encuestas, este año el evento tendrá lugar entre semana el próximo Miércoles 02 de Diciembre.

De igual forma, al ser el evento online y aunque contar con entradas nos ayudaría a conocer de forma aproximada el interés en el evento, este año no tendremos entradas.

Call 4 Papers

¿Has desarrollado una aplicación con Xamarin?, ¿quieres hablar acerca de cómo usas App Center?, ¿revisar las últimas novedades de Xamarin.Forms?, ¿quieres hablar de .NET MAUI?. El Call 4 Papers del evento ya se encuentra disponible. Este año al ser un evento online nos abre la posibilidad de tener speakers de cualquier lugar del mundo!.

Sponsors

En años anteriores, gracias a sponsors cubríamos costes básicos del evento como goodies (pegatinas, camisetas, etc.), el almuerzo, etc. Este año el evento es online, y seguimos buscando Sponsors.

¿Por qué?.

Creemos que esta siendo un año complicado para todos, y pensamos que gracias a sponsors podríamos sortear y regalar licencias de productos relacionados con el desarrollo o bien, cheques regalo en Amazon, etc. Buscamos tener un pequeño gesto que ayude a alegrar el día a asistentes y esto sería posible gracias a la ayuda de Sponsors.

Si estas interesado en patrocinar el evento, puedes encontrar más información en la página web del evento.

Más información

[Xamarin.Forms] Introducción a TemplateUI

El orgien

Con el soporte a Shapes y Brushes en Xamarin.Forms quería explorar las posibilidades para poder crear controles personalizados directamente con Xamarin.Forms (sin usar Custom Renderers, SkiaSharp, etc.). Tras crear algunas pruebas, combinar todo con la posibilidad de usar ControlTemplate (plantillas para personalizar la definición del control), etc. nace TemplateUI.

Nace TemplateUI

TemplateUI es una librería que contiene diversos controles, todos ellos, permitiendo el uso de ControlTemplate.

TemplateUI

Las plantillas de control de Xamarin.Forms permiten definir la estructura visual de los controles. Permiten separar la interfaz de usuario del control de la lógica que implementa el control. También se puede insertar contenido adicional en el control con la plantilla en un lugar predefinido. Por ejemplo, se puede acceder a la plantilla que define el control Rate y hacer modificaciones para cambiar la orientación o aplicar un borde. Hablamos de opciones que mediante propiedades no se pueden personalizar.

AvatarView

Es una representación visual de la imagen de usuario que se puede personalizar con texto, imagen, etc.

BadgeView

Control usado para notificar al usuario con notificaciones o cambios de estado.

CarouselView

Permiten navegar entre una colección de vistas.

ChatBubble

Muestra un mensaje con la forma de un bocadillo de conversación de chat.

CircleProgressBar

Es un control que muestra el porcentaje de progreso en una forma circular.

ComparerView

Es un control que permite mostrar dos vistas (puede ser cualquier tipo de contenido) para realizar una comparativa lado a lado.

ComparerView

DataVisualization

Un conjunto de gráficas creadas usando Shapes. Contiene:

  • Line Chart
  • Area Chart
  • Bar Chart

GridSplitter

Control que permite redistribuir el espacio entre las columnas o filas de un Grid.

Marquee

Usa este control al querer llamar la atención del usuario; añade un texto que hara scroll de forma automática y continua por la pantalla.

ProgressBar

Representa una barra de progreso horizontal que se va rellenando en base a un valor de tipo float.

ProgressBar

Rate

Permite al usuario seleccionar un valor de un grupo de símbolos visuales como una estrella.

SegmentedControl

Es un segmento lineal creado con un conjunto de segmentos que permiten al usuario seleccionar una opción.

Shield

Shield es un tipo de badge.

Slider

Es una barra horizontal que puede ser manipulada para seleccionar un valor de tipo doble entre un rango de opciones.

Slider

Tag

Control para crear tags.

ToggleSwitch

Un control que permite al usuario manipular para alternar entre los estados on y off, que están representados por un valor de tipo boolean.

ToggleSwitch

TreeView

Permite crear una lista con jerarquía de modo que se puede expandir o contraer los nodos que contienen otros nodos anidados.

¿Qué es lo próximo?

Como puedes ver, ya hay una gran cantidad de controles y vienen mas en camino!. En próximos artículos conoceremos cómo usar los controles, opciones de personalización con propiedades y usando plantillas de control, etc.

Más información

[Xamarin.Forms] Brushes

Introducción

Con la llegada de Xamarin.Forms 4.8 llega una funcionalidad altamente esperada, la posibilidad de usar Brushes o lo que es lo mismo, gradientes. En este artículo, vamos a conocer las nuevas posibilidades que tenemos usando brushes.

Brushes

Podemos usar un Brush para pintar el interior y el contorno (en algunos casos) de las vistas, Layouts y formas que componen la interfaz de usuario.

Para usar un gradiente en el fondo de cualquier View, podemos usar la propiedad Fill que espera un valor de tipo Brush. Tenemos las siguientes opciones:

  • SolidColorBrush
  • LinearGradientBrush
  • RadialGradientBrush

SolidColorBrush

SolidColorBrush pinta un área con un único color, como por ejemplo rojo o azul. Se trata del Brush más básico. Desde código XAML podemos usar SolidColorBrush de diferentes maneras:

  • Creando un objeto de tipo SolidColorBrush.
  • Usando una cadena que de formato al color que define al Brush (Ejemplo, color hexadecimal).

Veamos ejemplos:

<Grid
     Background="#FF9988"/>

En el ejemplo anterior, gracias a un TypeConverter podemos definir el Brush de forma sencilla, de forma similar a establecer un color de fondo.

<SolidColodBrush x:Key="MyBrush" Color="#FF9988" />


<Grid
     Background="{StaticResource MyBrush}"/>

LinearGradientBrush

LinearGradientBrush pinta un área con un degradado que se define a lo largo de una línea. Esta línea es el eje de degradado. Los colores del degradado y su ubicación en el eje de degradado se especifican con objetos de tipo GradientStop.

NOTA: Por defecto, el eje de degradado va de la esquina superior izquierda a la esquina inferior derecha, es decir, se crea un degradado en diagonal.

Cada GradientStop especifica el Color que se utiliza en el eje hasta cierto Offset. El color se puede establecer usando un nombre de color predefinido o mediante valores mientras que la propiedad Offset especifica la posición de cada GradientStop en el eje de degradado. Un objeto Offset es de tipo double con valores entre 0 y 1. Un Offset con un valor de 0 sitúa el GradientStop al principio del eje de degradado; es decir, cercano a su StartPoint. Por otro lado, un Offset con un valor de 1 sitúa el GradientStop en su EndPoint.

Para cambiar la dirección del degradado usamos las propiedades StartPoint y EndPoint. Podemos crear degradados horizontales o verticales, invertir el sentido de degradado, etc.

Veamos un ejemplo:

<LinearGradientBrush 
     StartPoint="0, 0" EndPoint="1, 0">
     <LinearGradientBrush.GradientStops>
          <GradientStop Color="Red" Offset="0.1" />
          <GradientStop Color="Pink" Offset="1.0" />
     </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

El resultado:

LinearGradientBrush

RadialGradientBrush

Dibuja un degradado radial definido por las propiedades Center, RadiusX y RadiusY. El origen del degradado se establece usando la propiedad Center.

NOTA: Los colores del degradado se inician en el centro de la elipse y terminan en el radio.

Al igual que usando LinearGradientBrush, los colores del degradado radial se definen creando una colección de GradientStops.

Veamos un ejemplo:

<RadialGradientBrush 
     Center="0.5, 0.5">
     <RadialGradientBrush.GradientStops>
          <GradientStop Color="Red" Offset="0.1" />
          <GradientStop Color="Pink" Offset="1.0" />
     </RadialGradientBrush.GradientStops>
</RadialGradientBrush>

El resultado:

RadialGradientBrush

Gradientes en todas partes!

VisualElement cuenta ahora con una nueva propiedad Background esperando un objeto de tipo Brush. ¿Qué quiere decir esto?. Significa que cualquier View en Xamarin.Forms, es decir, en los controles, layouts e incluso páginas podemos usar gradientes ahora.

E incluso en NavigationPage o TabbedPage:

Gradientes en todas partes!

O usando Shapes:

Gradientes en Shapes

NOTA: Puedes notar que al usar Shapes se pueden usar brushes no solo para rellenar la figura, también para definir el contorno.

Usando CSS

Podemos definir brushes en código XAML y C#, pero en Xamarin.Forms también podemos configurar la apariencia de la aplicación usando CSS. Llega también el soporte a brushes usando CSS.

Veamos un ejemplo:

.linearGradientStyleWithCss90deg {
background: linear-gradient(90deg, rgb(255, 0, 0) 0%,rgb(255, 153, 51) 60%);
}

.linearGradientStyleWithCss180deg {
background: linear-gradient(180deg, rgb(255, 0, 0) 0%,rgb(255, 153, 51) 60%);
}

.linearGradientStyleWithCss270deg {
background: linear-gradient(270deg, rgb(255, 0, 0) 0%,rgb(255, 153, 51) 60%);
}

.radialGradientStyleWithCss {
background: radial-gradient(circle, rgb(255, 0, 0) 25%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 75%);
}

.radialGradientStyleWithCssLeft {
background: radial-gradient(circle at left, rgb(255, 0, 0) 25%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 75%);
}

.radialGradientStyleWithCssRight {
background: radial-gradient(circle at right, rgb(255, 0, 0) 25%, rgb(0, 255, 0) 50%, rgb(0, 0, 255) 75%);
}

El resultado:

Usando CSS

En las últimas versiones de Xamarin.Forms hemos ido recibiendo algunas novedades relacionadas puramente con las posibilidades a la hora de crear interfaces de usuario personalizadas. Funcionalidad como shapes, poder hacer clip de vistas o brushes permiten un número mayor de posibilidades para personalizar la interfaz de usuario y también a la hora de crear controles personalizados.

¿Qué te parecen estas novedades?. Recuerda, puedes dejar tu duda o pregunta en los comentarios de la entrada.

Más información

[Xamarin.Forms] Recortar vistas (Clip)

La llegada de Shapes a Xamarin.Forms

Con la llegada de Xamarin.Forms 4.7 nos llega la posibilidad de dibujar formas. Sin embargo, ¿sabías que además de poder dibujar una forma podemos cortar cualquier vista con una forma específica?. En este artículo, vamos a aprender cómo cortar vistas con formas.

Clip

La clase VisualElement cuenta ahora con una nueva propiedad llamada Clip de tipo Geometry que define el contorno del contenido.

La clase Geometry (y las clases que derivan de ella) permiten describir la geometría de una forma 2D.

En Xamarin.Forms contamos con geometrías simples como EllipseGeometry, LineGeometry o RectangleGeometry y geometrías más complejas como PathGeometry.

De modo que podemos recortar una imagen para tener una imagen circular de forma sencilla de la siguiente forma:

<Image 
     Source="image.png">
     <Image.Clip>
          <EllipseGeometry 
               RadiusX="100"
               RadiusY="100"
               Center="180,180" />
     </Image.Clip>
</Image>

Ejemplo:

Recortando imágenes!

Se pueden utilizar desde geometrías básicas a complejas usando un Path para definir exactamente la forma deseada.

Pero…funciona con cualquier View!

¿Recuerdas que mencionamos que la propiedad Clip estaba definido en VisualElement?. Esto se traduce en poder recortar cualquier tipo de vista en Xamarin.Forms, no solo imágenes.

Clip Views

De igual forma, recortar dinámicamente cualquier vista y también deshacer el recorte.

Clip Views dinámicamente

Añadir:

var ellipseGeometry = new EllipseGeometry
{
     Center = new Point(75, 75),
     RadiusX = 60,
     RadiusY = 60
};

Image.Clip = ellipseGeometry;

Quitar:

Image.Clip = null;

¿Qué te parece esta funcionalidad?. Recuerda, cualquier duda o comentario es bienvenido en la entrada.

Más información

Microsoft Docs: Xamarin.Forms Shapes

[Xamarin.Forms] Trucos y consejos a la hora de trabajar con Shapes

Trucos y consejos a la hora de trabajar con Shapes

Desde Xamarin.Forms 4.7 contamos en el namespace Xamarin.Forms.Shapes con soporte a dibujar formas en la pantalla en Android, iOS, macOS, UWP y WPF.
Contamos con formas sencillas pero también opciones más complejas que nos permiten dibujar practicamente lo que queramos. Pero…¿cómo dibujamos una forma específica?. En este artículo vamos a conocer trucos y consejos a la hora de conseguir dibujar formas en Xamarin.Forms.

De diseño a Shapes

A la hora de desarrollar aplicaciones móviles, un muchas ocasiones se parte de un diseño. Hay una enorme variedad de herramientas de diseño como Figma, Adobe XD o Sketch por ejemplo. En algunos casos existen plugins para exportar a XAML aunque lo que se cuenta en todas ellas, es la posibilidad de exportar a SVG¿Sabías que podemos convertir cualquier SVG a un Shape de forma sencilla?.
Por ejemplo, tomemos un SVG relativamente complejo compuesto por diferentes paths:
<svg viewBox='0 0 104 97' xmlns='http://www.w3.org/2000/svg'>
<path d='M14,85l3,9h72c0,0,5-9,4-10c-2-2-79,0-79,1' fill='#7C4E32'/>
<path d='M19,47c0,0-9,7-13,14c-5,6,3,7,3,7l1,14c0,0,10,8,23,8c14,0,26,1,28,0c2-1,9-2,9-4c1-1,27,1,27-9c0-10,7-20-11-29c-17-9-67-1-67-1' fill='#E30000'/>
<path d='M17,32c-3,48,80,43,71-3 l-35-15' fill='#FFE1C4'/>
<path d="M17,32c9-36,61-32,71-3c-20-9-40-9-71,3" fill="#8ED8F8"/>
<path d='M54,35a10 8 60 1 1 0,0.1zM37,38a10 8 -60 1 1 0,0.1z' fill='#FFF'/>
<path d='M41,6c1-1,4-3,8-3c3-0,9-1,14,3l-1,2h-2h-2c0,0-3,1-5,0c-2-1-1-1-1-1l-3,1l-2-1h-1c0,0-1,2-3,2c0,0-2-1-2-3M17,34l0-2c0,0,35-20,71-3v2c0,0-35-17-71,3M5,62c3-2,5-2,8,0c3,2,13,6,8,11c-2,2-6,0-8,0c-1,1-4,2-6,1c-4-3-6-8-2-12M99,59c0,0-9-2-11,4l-3,5c0,1-2,3,3,3c5,0,5,2,7,2c3,0,7-1,7-4c0-4-1-11-3-10' fill='#FFF200'/>
<path d='M56,78v1M55,69v1M55,87v1' stroke='#000' stroke-linecap='round'/>
<path d='M60,36a1 1 0 1 1 0-0.1M49,36a1 1 0 1 1 0-0.1M57,55a2 3 0 1 1 0-0.1M12,94c0,0,20-4,42,0c0,0,27-4,39,0z'/>
<path d='M50,59c0,0,4,3,10,0M56,66l2,12l-2,12M25,50c0,0,10,12,23,12c13,0,24,0,35-15' fill='none' stroke='#000' stroke-width='0.5'/>
</svg>
Dibuja al personaje Cartman de South Park. Podemos transformar el código anterior a XAML de forma muy sencilla:
<Grid>
     <Path Data="M14,85l3,9h72c0,0,5-9,4-10c-2-2-79,0-79,1" Fill="#7C4E32"/>
     <Path Data="M19,47c0,0-9,7-13,14c-5,6,3,7,3,7l1,14c0,0,10,8,23,8c14,0,26,1,28,0c2-1,9-2,9-4c1-1,27,1,27-9c0-10,7-20-11-29c-17-9-67-1-67-1" Fill="#E30000"/>
     <Path Data="M17,32c-3,48,80,43,71-3 l-35-15" Fill="#FFE1C4"/>
     <Path Data="M17,32c9-36,61-32,71-3c-20-9-40-9-71,3" Fill="#8ED8F8"/>
     <Path Data="M54,35a10 8 60 1 1 0,0.1zM37,38a10 8 -60 1 1 0,0.1z" Fill="#FFF"/>
     <Path Data="M41,6c1-1,4-3,8-3c3-0,9-1,14,3l-1,2h-2h-2c0,0-3,1-5,0c-2-1-1-1-1-1l-3,1l-2-1h-1c0,0-1,2-3,2c0,0-2-1-2-3M17,34l0-2c0,0,35-20,71-3v2c0,0-35-17-71,3M5,62c3-2,5-2,8,0c3,2,13,6,8,11c-2,2-6,0-8,0c-1,1-4,2-6,1c-4-3-6-8-2-12M99,59c0,0-9-2-11,4l-3,5c0,1-2,3,3,3c5,0,5,2,7,2c3,0,7-1,7-4c0-4-1-11-3-10" Fill="#FFF200"/>
     <Path Data="M56,78v1M55,69v1M55,87v1" Stroke="#000" StrokeLineCap="Round"/>
     <Path Data="M60,36a1 1 0 1 1 0-0.1M49,36a1 1 0 1 1 0-0.1M57,55a2 3 0 1 1 0-0.1M12,94c0,0,20-4,42,0c0,0,27-4,39,0z" Stroke="#000"/>
     <Path Data="M50,59c0,0,4,3,10,0M56,66l2,12l-2,12M25,50c0,0,10,12,23,12c13,0,24,0,35-15" Stroke="#000" StrokeThickness="0.5"/>
</Grid>
El resultado:

Dibujando usando SVG

Cada Path dibuja un elemento del personaje de modo que podemos aplicar transformaciones, animaciones, etc. a cada pequeña parte que compone el dibujo. Ah, recuerda que XAML Hot Reload funciona con Shapes:

Usando Hot Reload

Dibujando con herramientas

Una herramienta perfecta para crear Shapes es Blend. Entre el conjunto de Assets puedes directamente arrastrar y soltar cualquier tipo de Shape, y luego hacer cualquier transformación como rotar, escalar, etc.

Shapes

Dibujando Shapes con Blend

Otra herramienta clásica pero que nos permite dibujar y exportar directamente código XAML que podremos utilizar en nuestra aplicación Xamarin.Forms es Inkscape. Herramienta de dibujado disponible para Windows, macOS y Linux nos permite una gran variedad de opciones (que podemos extender usando plugins) para dibujar:

Inkscape

Y exportar el código directamente a XAML:
<?xml version="1.0" encoding="UTF-8"?>
<!--This file is NOT compatible with Silverlight-->
<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Stretch="Uniform">
<Canvas Name="svg8" Width="210" Height="297">
<Canvas.RenderTransform>
<TranslateTransform X="0" Y="0"/>
</Canvas.RenderTransform>
<Canvas.Resources/>
<!--Unknown tag: sodipodi:namedview-->
<!--Unknown tag: metadata-->
<Canvas Name="layer1">
<Path xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="path10" StrokeThickness="0.264583" Stroke="#FF000000">
<Path.Data>
<PathGeometry Figures="m 130.77975 114.90475 c -1.28867 2.76686 -4.36546 -0.37204 -4.5987 -2.14187 -0.63208 -4.79613 4.79124 -7.58089 8.88244 -7.05555 7.31819 0.93971 11.05326 8.94515 9.51239 15.62302 -2.26128 9.80005 -13.14527 14.60051 -22.36359 11.96923 -12.28658 -3.50708 -18.17801 -17.36047 -14.42608 -29.10417 4.72141 -14.778243 21.58254 -21.770781 35.84475 -16.882919 17.27344 5.919857 25.37235 25.808419 19.33976 42.585329 -7.1092 19.771 -30.03665 28.97944 -49.3259 21.7966 C 91.374607 143.40155 81.054615 117.42797 89.391371 95.627942 98.864123 70.857366 127.88874 59.424405 152.19843 68.917654 c 27.27179 10.649991 39.81874 42.729096 29.16713 69.547636 -11.82531 29.77366 -46.96143 43.43535 -76.28821 31.62397" FillRule="EvenOdd"/
</Path.Data>
</Path>
</Canvas>
</Canvas>
</Viewbox>
De modo que, podemos utilizar el resultado en nuestras aplicaciones:
<Path
     StrokeThickness="0.264583"
     Stroke="#FF000000">
     <Path.Data>
          <PathGeometry
               Figures="m 130.77975 114.90475 c -1.28867 2.76686 -4.36546 -0.37204 -4.5987 -2.14187 -0.63208 -4.79613 4.79124 -7.58089 8.88244 -7.05555 7.31819 0.93971 11.05326 8.94515 9.51239 15.62302 -2.26128 9.80005 -13.14527 14.60051 -22.36359 11.96923 -12.28658 -3.50708 -18.17801 -17.36047 -14.42608 -29.10417 4.72141 -14.778243 21.58254 -21.770781 35.84475 -16.882919 17.27344 5.919857 25.37235 25.808419 19.33976 42.585329 -7.1092 19.771 -30.03665 28.97944 -49.3259 21.7966 C 91.374607 143.40155 81.054615 117.42797 89.391371 95.627942 98.864123 70.857366 127.88874 59.424405 152.19843 68.917654 c 27.27179 10.649991 39.81874 42.729096 29.16713 69.547636 -11.82531 29.77366 -46.96143 43.43535 -76.28821 31.62397" FillRule="EvenOdd"/>
     </Path.Data>
</Path>

El resultado

Otras herramientas

Hay una enorme variedad de herramientas y posibilidades para trabajar con Shapes. Sin embargo, me gustaría también recomendar Metro Studio. Es una herramienta gratuita de SyncFusion que cuenta con más de 7000 iconos y formas diferentes que exportar a código XAML. Podemos aprovechar este código XAML para crear iconos usando Shapes y dibujar diferentes figuras.

Metro Studio

Snippets de código

Para facilitar la creación de Shapes puedes encontrar un listado de snippets para Visual Studio en este enlace.

Más información