Partilhar via


AnimationBehavior

O AnimationBehavior é um Behavior que fornece a capacidade de animar qualquer VisualElement ao qual ele está anexado. Por padrão, um TapGestureRecognizer é anexado ao VisualElement e dispara a animação associada quando esse reconhecedor detecta que o usuário tocou ou clicou no VisualElement.

É necessário definir a propriedade AnimationType e as opções possíveis para isso podem ser encontradas em Animações.

Importante

Os comportamentos do .NET MAUI Community Toolkit não definem o BindingContext de um comportamento, porque os comportamentos podem ser compartilhados e aplicados a vários controles por meio de estilos. Para mais informações confira Comportamentos do .NET MAUI

Sintaxe

Os exemplos a seguir mostram como adicionar o AnimationBehavior a um Label e usar o FadeAnimation para animar uma alteração na opacidade.

XAML

Incluir o namespace XAML

Para usar o kit de ferramentas no XAML, o xmlns a seguir precisa ser adicionado à sua página ou exibição:

xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"

Portanto, o seguinte:

<ContentPage
    x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml">

</ContentPage>

Seria modificado para incluir o xmlns conforme o seguinte:

<ContentPage
    x:Class="CommunityToolkit.Maui.Sample.Pages.MyPage"
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">

</ContentPage>

Usando o AnimationBehavior

<ContentPage 
    xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
    x:Class="CommunityToolkit.Maui.Sample.Pages.Behaviors.AnimationBehaviorPage"
    x:Name="Page">

    <Label Text="Click this Label">
        <Label.Behaviors>
            <toolkit:AnimationBehavior>
                <toolkit:AnimationBehavior.AnimationType>
                    <toolkit:FadeAnimation Opacity="0.5" />
                </toolkit:AnimationBehavior.AnimationType>
            </toolkit:AnimationBehavior>
        </Label.Behaviors>
    </Label>

</ContentPage>

C#

O AnimationBehavior pode ser usado da seguinte maneira em C#:

class AnimationBehaviorPage : ContentPage
{
    public AnimationBehaviorPage()
    {
        var label = new Label
        {
            Text = "Click this Label"
        };

        var animationBehavior = new AnimationBehavior
        {
            AnimationType = new FadeAnimation
            {
                Opacity = 0.5
            }
        };

        label.Behaviors.Add(animationBehavior);

        Content = label;
    }
}

Markup do C#

Nosso pacote CommunityToolkit.Maui.Markup fornece uma maneira muito mais concisa de usar esse Behavior em C#.

using CommunityToolkit.Maui.Markup;

class AnimationBehaviorPage : ContentPage
{
    public AnimationBehaviorPage()
    {
        Content = new Label()
            .Text("Click this label")
            .Behaviors(new AnimationBehavior
            {
                AnimationType = new FadeAnimation
                {
                    Opacity = 0.5
                }
            });
    }
}

A captura de tela a seguir mostra o AnimationBehavior resultante no Android: Captura de tela de um AnimationBehavior no Android

Mais exemplos

Lidando com a interação do usuário

O AnimationBehavior responde aos toques e cliques do usuário, é possível lidar com essa interação por meio da propriedade Command no comportamento.

O exemplo a seguir mostra como anexar o AnimationBehavior a uma Image e associar a propriedade Command a uma propriedade em um modelo de exibição.

Exibir

<Image Source="thumbs-up.png" x:Name="ThumbsUpImage">
    <Image.Behaviors>
        <toolkit:AnimationBehavior 
            Command="{Binding ThumbsUpCommand}"
            BindingContext="{Binding Path=BindingContext, Source={x:Reference ThumbsUpImage}, x:DataType=Image}">
            <toolkit:AnimationBehavior.AnimationType>
                <toolkit:FadeAnimation />
            </toolkit:AnimationBehavior.AnimationType>
        </toolkit:AnimationBehavior>
    </Image.Behaviors>
</Image>

Exibir modelo


public ICommand ThumbsUpCommand { get; }

public MyViewModel()
{
    ThumbsUpCommand = new Command(() => OnThumbsUp())
}

public void OnThumbsUp()
{
    // perform the thumbs up logic.
}

Disparando programaticamente a animação

O AnimationBehavior fornece a capacidade de disparar animações programaticamente. O AnimateCommand pode ser executado para disparar o tipo de animação associado.

O exemplo a seguir mostra como adicionar o AnimationBehavior a uma Entry, associar o AnimatedCommand e, em seguida, executar o comando de um modelo de exibição.

Exibir

<Entry Placeholder="First name (Required)"
       Text="{Binding FirstName}"
       x:Name="FirstNameEntry">
    <Entry.Behaviors>
        <toolkit:AnimationBehavior 
            AnimateCommand="{Binding TriggerAnimationCommand}"
            BindingContext="{Binding Path=BindingContext, Source={x:Reference FirstNameEntry}, x:DataType=Entry}">
            <toolkit:AnimationBehavior.AnimationType>
                <toolkit:FadeAnimation />
            </toolkit:AnimationBehavior.AnimationType>
        </toolkit:AnimationBehavior>
    </Entry.Behaviors>
</Entry>

Exibir modelo

private string firstName;

public string FirstName
{
    get => firstName;
    set => SetProperty(ref firstName, value);
}

public ICommand TriggerAnimationCommand { get; set; }

public void Save()
{
    if (string.IsNullOrEmpty(FirstName))
    {
        TriggerAnimationCommand.Execute(CancellationToken.None);
        return;
    }

    // save code.
}

Observação

A propriedade AnimateCommand é somente leitura e espera um modo de associação de BindingMode.OneWayToSource. Você também não precisa atribuir um valor à propriedade comando em seu modelo de exibição (TriggerAnimationCommand no exemplo acima), isso ocorre porque a associação atribuirá o valor à sua propriedade a partir do valor criado no AnimationBehavior.

Isso fornece a capacidade de disparar uma animação de dentro de um modelo de exibição.

Disparando a animação de eventos de controle

O AnimationBehavior fornece os mesmos recursos subjacentes que o EventToCommandBehavior. Por meio do uso da propriedade EventName, o tipo de animação associado pode ser disparado quando um evento que corresponde ao nome fornecido é acionado.

Usando a seguinte implementação de animação de exemplo:

class SampleScaleToAnimation : BaseAnimation
{
    public double Scale { get; set; }

    public override Task Animate(VisualElement view) => view.ScaleTo(Scale, Length, Easing);
}

O exemplo a seguir mostra como podemos atribuir duas instâncias AnimationBehavior a uma Entry; uma para disparar uma animação quando o evento Focalizado é acionado e outra para disparar uma animação diferente quando o evento Sem foco é acionado.

<Entry Placeholder="Animate on Focused and Unfocused">
    <Entry.Behaviors>
        <toolkit:AnimationBehavior EventName="Focused">
            <toolkit:AnimationBehavior.AnimationType>
                <behaviorPages:SampleScaleToAnimation 
                    Easing="{x:Static Easing.Linear}"
                    Length="100"
                    Scale="1.05"/>
            </toolkit:AnimationBehavior.AnimationType>
        </toolkit:AnimationBehavior>

        <toolkit:AnimationBehavior EventName="Unfocused">
            <toolkit:AnimationBehavior.AnimationType>
                <behaviorPages:SampleScaleToAnimation 
                    Easing="{x:Static Easing.Linear}"
                    Length="100"
                    Scale="1"/>
            </toolkit:AnimationBehavior.AnimationType>
        </toolkit:AnimationBehavior>
    </Entry.Behaviors>
</Entry>

Exemplos

Você pode encontrar um exemplo desse comportamento em ação no Aplicativo de exemplo do .NET MAUI Community Toolkit.

API

O código-fonte do AnimationBehavior pode ser encontrado no repositório GitHub do .NET MAUI Community Toolkit.