Анимация в .NET MAUI позволяет изменять значение свойства элемента управления от одного значения к другому в течение заданного промежутка времени. Наверняка вы встречали такие виды анимации, как затухание, плавное перемещение, вращение элементов управления и т.д. В этом разделе мы рассмотрим основы анимации в .NET MAUI
Базовые анимации в .NET MAUI
Базовые анимации в .NET MAUI создаются с помощью методов расширения VisualElement. Каждая базовая анимация работает с одним свойством, изменяя его от исходного до конечного значения. Так, к базовым анимациям относятся следующие анимации:
| Метод расширения | Анимируемое свойство |
FadeTo |
Opacity |
RelScaleTo |
Scale |
RotateTo |
Rotation |
RelRotateTo |
Rotation |
RotateXTo |
RotationX |
RotateYTo |
RotationY |
ScaleTo |
Scale |
ScaleXTo |
ScaleX |
ScaleYTo |
ScaleY |
TranslateTo |
TranslationX и TranslationY |
Эти методы расширения используют схожие параметры, которые можно описать следующим образом:
public static Task<bool> MethodName(this VisualElement view, property, uint length = 250, Easing? easing = default);
Все методы расширения асинхронные и возвращают true, если анимация была прервана, например, с использованием метода расширения CancelAnimations(). Параметры у метода, представленного выше, следующие:
property— анимируемое свойство и его тип (например,double opacity)length— длительность анимации в миллисекундах (по умолчанию — 250)easing— класс, определяющий плавность анимации
Применение базовой анимации
Для применения анимации мы можем использовать какие-либо события элементов управления или задействовать, например, триггеры событий. В качестве примера, создадим новое приложение .NET MAUI и изменим код страницы MainPage.xaml следующим образом:
?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MauiApp22.MainPage"
xmlns:local="clr-namespace:MauiApp22" Appearing="ContentPage_Appearing">
<ScrollView>
<VerticalStackLayout x:Name="MainLayout"
Padding="30,0"
Spacing="25">
<Image Opacity="0"
Source="dotnet_bot.png"
HeightRequest="185"
Aspect="AspectFit"
SemanticProperties.Description="dot net bot in a hovercraft number nine" />
<Label Opacity="0"
Text="Hello, World!"
Style="{StaticResource Headline}"
SemanticProperties.HeadingLevel="Level1" />
<Label Opacity="0"
Text="Welcome to .NET Multi-platform App UI"
Style="{StaticResource SubHeadline}"
SemanticProperties.HeadingLevel="Level2"
SemanticProperties.Description="Welcome to dot net Multi platform App U I" />
<Button Opacity="0"
x:Name="CounterBtn"
Text="Click me"
SemanticProperties.Hint="Counts the number of times you click"
Clicked="OnCounterClicked"
HorizontalOptions="Fill" >
</Button>
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Здесь мы для всех элементов управления установили значение свойства Opacity равным нулю. То есть, по умолчанию, все элементы будут прозрачными. Дополнительно мы также задали имя контейнеру компоновки:
<VerticalStackLayout x:Name="MainLayout"
а у станицы определили обработчик события Appearing:
Appearing="ContentPage_Appearing"
который в файле отдельного кода выглядит следующим образом:
private void ContentPage_Appearing(object sender, EventArgs e)
{
foreach (var child in MainLayout.Children)
{
(child as View).FadeTo(1, 4000);
}
}
Теперь, если запустить приложение, то вы увидите, что все элементы управления на странице плавно появляются одновременно в течение четырех секунд.
При желании, мы можем применить анимацию в триггере событий. Например, перепишем код кнопки следующим образом:
<Button Opacity="0"
x:Name="CounterBtn"
Text="Click me"
SemanticProperties.Hint="Counts the number of times you click"
Clicked="OnCounterClicked"
HorizontalOptions="Fill" >
<Button.Triggers>
<EventTrigger Event="Clicked">
<EventTrigger.Actions>
<local:FadeInAnimationAction/>
</EventTrigger.Actions>
</EventTrigger>
</Button.Triggers>
</Button>
Здесь мы определили у кнопки триггер события Clicked. Действие триггера будет следующим:
public class FadeInAnimationAction : TriggerAction<Button>
{
protected override async void Invoke(Button sender)
{
sender.Opacity = 1;
await sender.FadeTo(0,4000);
await sender.FadeTo(1, 4000);
}
}
то есть, вначале мы устанавливаем Opacity в значение 1 (полностью непрозрачный элемент), затем запускаем первую анимацию, которая делает полностью прозрачной и только затем — вторую анимацию, которая вернет прозрачность кнопки в исходное состояние.
Составные анимации
Составная анимация — это последовательное сочетание нескольких анимаций. Составная анимация может быть создана с помощью операторов await. Например, у нас сейчас анимация в триггере — составная:
await sender.FadeTo(0,4000); await sender.FadeTo(1, 4000);
Также, мы можем создавать составные анимации из ожидаемых и неожидаемых анимаций. Например, изменим код действия триггера следующим образом:
public class FadeInAnimationAction : TriggerAction<Button>
{
protected override async void Invoke(Button sender)
{
sender.Opacity = 1;
sender.ScaleTo(0.5, 4000);
await sender.FadeTo(0,4000);
sender.ScaleTo(1, 4000);
await sender.FadeTo(1, 4000);
}
}
Теперь наша составная анимация будет выполняться следующим образом: запустится анимация ScaleTo и одновременно FadeTo и, затем — снова запустится та же пара анимаций, но с изменением свойств в обратном направлении:
Итого
Анимация в .NET MAUI создаются с использованием методов расширения ViewElement и выполняют изменение значения одного свойства от исходного значения к конечному за определенный промежуток времени (по умолчанию — 250 миллисекунд). Из базовых анимаций можно делать составные анимации, используя операторы await для ожидания выполнения анимации или чередуя методы с await и без него для того, чтобы анимации запускались параллельно.
