Design & UX

13 mar, 2019

O X do Xamarin Forms – 3.6: bem-vindo, Material Design

Publicidade

Fala, galera! Beleza?

Diretamente do bloco “Unidos do Xamarin.Forms”, acaba de sair o update 3.6!

Em um resumo geral, tivemos diversas alterações/correções que vocês podem ver clicando aqui.

Dentre todas as alterações do link acima, tivemos a chegada do Xamarin.Forms.Visual.Material, que adiciona controles do Material Design ao Xamarin.Forms. Sensacional, não?

Não? Então espera que eu vou te mostrar!

Antes de mais nada, creio que você saiba o que é Material Design. Porém, caso não conheça, ele foi introduzido pela Google em 2014 (pode ver como funciona clicando aqui). O Material Design possibilita criar interfaces muito bonitas seguindo um conjunto de padrões definidos pelo Google.

Certo, Google e Android – mas e o iOS? Não se preocupe, a Google também disponibiliza um conjunto de controles para o iOS, então é possível utilizar o material design nele.

Só que mais incrível que isso é a possibilidade de utilizar nas duas plataformas ao mesmo tempo, seguindo um mesmo padrão, com o nosso amado Xamarin.Forms!

Antes de começarmos, existem alguns pré requisitos a serem seguidos no projeto Android:

  • Xamarin.Forms 3.6
  • FormsAppCompatActivity
  • Android Support Libraries 28.0.0 ou maior.
  • Target Android framework (v9.0 atual)
  • Versão mínima do Android 5.0 (API 21)

Certo, agora vamos lá!

Configurando o pacote

Vamos ao Nuget instalar o pacote Xamarin.Forms.Visual.Material em todos os projetos:

No iOS, em AppDelega.cs, vamos iniciar o global::Xamarin.Forms.FormsMaterial.Init();:

using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using UIKit;

namespace MaterialDesingExemplo.iOS
{
    // The UIApplicationDelegate for the application. This class is responsible for launching the 
    // User Interface of the application, as well as listening (and optionally responding) to 
    // application events from iOS.
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        //
        // This method is invoked when the application has loaded and is ready to run. In this 
        // method you should instantiate the window, load the UI into it and then make the window
        // visible.
        //
        // You have 17 seconds to return from this method, or iOS will terminate your application.
        //
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            global::Xamarin.Forms.Forms.Init();
            global::Xamarin.Forms.FormsMaterial.Init();
            LoadApplication(new App());

            return base.FinishedLaunching(app, options);
        }
    }
}

Já no Android, na MainActivity.cs:

using System;
using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;

namespace MaterialDesingExemplo.Droid
{
    [Activity(Label = "MaterialDesingExemplo", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(savedInstanceState);

            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            global::Xamarin.Forms.FormsMaterial.Init(this, savedInstanceState);
            LoadApplication(new App());
        }
       
    }
}

Pronto, vamos brincar!

Utilizando o material

Até o momento deste artigo foram adaptados 11 controles para o Material, sendo eles:

  • ActivityIndicator
  • Button
  • DatePicker
  • Editor
  • Entry
  • FramePicker
  • ProgressBar
  • Slider
  • Stepper
  • TimePicker

Por padrão será exibido o visual normal que estamos acostumados, então, para habilitar o visual “Material” basta utilizar a tag “Visual”. Veja no exemplo:

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:MaterialDesingExemplo" 
             Padding="0,60,0,0"
             x:Class="MaterialDesingExemplo.MainPage">
    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Ola Material Design!"  />
        
        <Button Text="Botão do Forms"/>
        <Button Text="Botão com Material" Visual="Material"/>
    </StackLayout>
</ContentPage>

Com isso, temos:

Bem legal, né?

Essa tag é tão sensacional que também existe a Visual=”Default”. Mas o que tem de sensacional nisso? Você pode ativar e desativar o Material em tempo de execução! Imagine as possibilidades.

O Material possui um sistema de herança, ou seja, você pode declarar o Visual em qualquer layout, ContentPage ou até mesmo no nível do aplicativo e ele se tornará cascata para todos os controles filho:

<?xml version="1.0" encoding="utf-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
             xmlns:local="clr-namespace:MaterialDesingExemplo" 
             Padding="0,60,0,0"
             Visual= "Material"
             x:Class="MaterialDesingExemplo.MainPage">
    <StackLayout>
        <!-- Place new controls here -->
        <Label Text="Ola Material Design!"  />
        
        <Button Text="Botão do Forms" Visual="Default"/>
        <Button Text="Botão com Material" />
    </StackLayout>
</ContentPage>

Mesmo resultado:

Sensacional, né?

Lembrando que os controles ficam dessa forma pois seguem as diretrizes do Material, da Google. Caso queira altera-los, é possível criar effects, renderes, behaviors e etc.

Acabou? Não. Você também pode criar seus próprios controles!

Para isso vamos precisar criar um Custom Renderer (caso não saiba o que é um Custom Renderer, clique aqui).

Para criar seu controle basta utilizar o IVisual:

namespace MaterialDesingExemplo
{
    public class MeuMaterialControle : IVisual
    {
       
    }
}

E um botão, por exemplo:

using System;
using Android.Content;
using MaterialDesingExemplo;
using MaterialDesingExemplo.Droid.Renderers;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

[assembly: ExportRenderer(typeof(Xamarin.Forms.Button), typeof(MeuMaterialControleRenderer), new[] { typeof(MeuMaterialControle) })]
namespace MaterialDesingExemplo.Droid.Renderers
{
    public class MeuMaterialControleRenderer : ButtonRenderer
    {
        public MeuMaterialControleRenderer(Context context) : base(context)
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e)
        {
            base.OnElementChanged(e);
            Element.Text = "Meu Botão customizado :)";
        }
    }
}

Em resumo, o Material pode ser utilizado nos controles existentes e você ainda pode criar o seu!

Seja bem-vindo ao Xamarin.Forms, Material Design!

Quer ver exemplos com o Material? Se liga nesse exemplo do David Ortinau.

Quer ver outros artigos sobre Xamarin? Clique aqui.

Espero ter ajudado. Aquele abraço!