Use this reference when Fluent shell polish needs deeper composition control than simple transitions.
Primary APIs:
ElementComposition, CompositorImplicitAnimationCollectionCompositionAnimationGroupCompositionPropertySetExpressionAnimationCompositionObject.StartAnimationGroup(...)Compositor.CreateColorKeyFrameAnimation(), CreateVector3KeyFrameAnimation(), CreateScalarKeyFrameAnimation()ExpressionAnimation.SetScalarParameter(...)Advanced Fluent motion should:
Use deeper composition choreography for:
using System;
using Avalonia.Rendering.Composition;
var visual = ElementComposition.GetElementVisual(ShellPane)!;
var compositor = visual.Compositor;
var offsetAnimation = compositor.CreateVector3KeyFrameAnimation();
offsetAnimation.Target = "Offset";
offsetAnimation.InsertExpressionKeyFrame(1f, "this.FinalValue");
offsetAnimation.Duration = TimeSpan.FromMilliseconds(180);
var implicitAnimations = compositor.CreateImplicitAnimationCollection();
implicitAnimations["Offset"] = offsetAnimation;
visual.ImplicitAnimations = implicitAnimations;
Use this for:
using System;
using System.Numerics;
using Avalonia.Rendering.Composition;
var visual = ElementComposition.GetElementVisual(CommandSurface)!;
var compositor = visual.Compositor;
var scale = compositor.CreateVector3KeyFrameAnimation();
scale.Target = "Scale";
scale.InsertKeyFrame(0f, new Vector3(0.985f, 0.985f, 1f));
scale.InsertKeyFrame(1f, new Vector3(1f, 1f, 1f));
scale.Duration = TimeSpan.FromMilliseconds(160);
var slide = compositor.CreateVector3KeyFrameAnimation();
slide.Target = "Offset";
slide.InsertKeyFrame(0f, new Vector3(0f, 6f, 0f));
slide.InsertKeyFrame(1f, new Vector3(0f, 0f, 0f));
slide.Duration = TimeSpan.FromMilliseconds(160);
var group = compositor.CreateAnimationGroup();
group.Add(scale);
group.Add(slide);
visual.StartAnimationGroup(group);
var emphasis = compositor.CreateExpressionAnimation("baseOpacity * emphasis");
emphasis.Target = "Opacity";
emphasis.SetScalarParameter("baseOpacity", 1f);
emphasis.SetScalarParameter("emphasis", 0.98f);
visual.StartAnimation("Opacity", emphasis);
CompositionPropertySet exists in Avalonia 11.3.12, but app code typically drives shared composition input through animation parameters because there is no public compositor factory for constructing property sets directly.
CompositionPropertySet construction in app code on Avalonia 11.3.12.Do:
Do not:
Compositor API: api-docs.avaloniaui.net/docs/T_Avalonia_Rendering_Composition_CompositorCompositionPropertySet API: api-docs.avaloniaui.net/docs/T_Avalonia_Rendering_Composition_CompositionPropertySetCompositionAnimationGroup API: api-docs.avaloniaui.net/docs/T_Avalonia_Rendering_Composition_Animations_CompositionAnimationGroupStartAnimationGroup API: api-docs.avaloniaui.net/docs/M_Avalonia_Rendering_Composition_CompositionObject_StartAnimationGroupCreateColorKeyFrameAnimation API: api-docs.avaloniaui.net/docs/M_Avalonia_Rendering_Composition_Compositor_CreateColorKeyFrameAnimationSetScalarParameter API: api-docs.avaloniaui.net/docs/M_Avalonia_Rendering_Composition_Animations_ExpressionAnimation_SetScalarParameter