public void StartEntranceEffect() { ContainerVisual container = (ContainerVisual)ElementCompositionPreview.GetElementChildVisual(BasePage); Compositor compositor = container.Compositor; // 设置缩放和动画 const float ScaleFactor = 20f; TimeSpan duration = TimeSpan.FromMilliseconds(1200); LinearEasingFunction linearEase = compositor.CreateLinearEasingFunction(); CubicBezierEasingFunction easeInOut = compositor.CreateCubicBezierEasingFunction(new Vector2(.38f, 0f), new Vector2(.45f, 1f)); // 创建淡出动画 ScalarKeyFrameAnimation fadeOutAnimation = compositor.CreateScalarKeyFrameAnimation(); fadeOutAnimation.InsertKeyFrame(1, 0); fadeOutAnimation.Duration = duration; // Grid的动画 Vector2KeyFrameAnimation scaleUpGridAnimation = compositor.CreateVector2KeyFrameAnimation(); scaleUpGridAnimation.InsertKeyFrame(0.1f, new Vector2(1 / ScaleFactor, 1 / ScaleFactor)); scaleUpGridAnimation.InsertKeyFrame(1, new Vector2(1, 1)); scaleUpGridAnimation.Duration = duration; // 初始屏动画 Vector2KeyFrameAnimation scaleUpSplashAnimation = compositor.CreateVector2KeyFrameAnimation(); scaleUpSplashAnimation.InsertKeyFrame(0, new Vector2(1, 1)); scaleUpSplashAnimation.InsertKeyFrame(1, new Vector2(ScaleFactor, ScaleFactor)); scaleUpSplashAnimation.Duration = duration; // 设置Grid的中心缩放视觉 Visual gridVisual = ElementCompositionPreview.GetElementVisual(UIToShow); gridVisual.Size = UIToShow.ActualSize; gridVisual.CenterPoint = new Vector3(gridVisual.Size.X, gridVisual.Size.Y, 0) * .5f; // 创建一个视觉组,当改组所有视觉执行完后不再显示 CompositionScopedBatch batch = compositor.CreateScopedBatch(CompositionBatchTypes.Animation); container.StartAnimation("Opacity", fadeOutAnimation); container.StartAnimation("Scale.XY", scaleUpSplashAnimation); gridVisual.StartAnimation("Scale.XY", scaleUpGridAnimation); batch.Completed += (s, a) => { ElementCompositionPreview.SetElementChildVisual(BasePage, null); SurfaceLoader.Uninitialize(); AnimationCompleted?.Invoke(this, null); }; batch.End(); }
public void StartEntranceEffect() { try { TimeSpan AnimationDuration = TimeSpan.FromMilliseconds(1000); ContainerVisual Container = (ContainerVisual)ElementCompositionPreview.GetElementChildVisual(BasePage); ScalarKeyFrameAnimation FadeOutAnimation = Container.Compositor.CreateScalarKeyFrameAnimation(); FadeOutAnimation.InsertKeyFrame(1, 0); FadeOutAnimation.Duration = AnimationDuration; Vector2KeyFrameAnimation ScaleUIAnimation = Container.Compositor.CreateVector2KeyFrameAnimation(); ScaleUIAnimation.InsertKeyFrame(0.1f, new Vector2(1 / ScaleFactor, 1 / ScaleFactor)); ScaleUIAnimation.InsertKeyFrame(1, new Vector2(1, 1)); ScaleUIAnimation.Duration = AnimationDuration; Vector2KeyFrameAnimation ScaleSplashAnimation = Container.Compositor.CreateVector2KeyFrameAnimation(); ScaleSplashAnimation.InsertKeyFrame(0, new Vector2(1, 1)); ScaleSplashAnimation.InsertKeyFrame(1, new Vector2(ScaleFactor, ScaleFactor)); ScaleSplashAnimation.Duration = AnimationDuration; Visual UIVisual = ElementCompositionPreview.GetElementVisual(UIToShow); UIVisual.Size = new Vector2((float)UIToShow.ActualWidth, (float)UIToShow.ActualHeight); UIVisual.CenterPoint = new Vector3(UIVisual.Size.X, UIVisual.Size.Y, 0) * 0.5f; CompositionScopedBatch BatchAnimation = Container.Compositor.CreateScopedBatch(CompositionBatchTypes.Animation); Container.StartAnimation("Opacity", FadeOutAnimation); Container.StartAnimation("Scale.XY", ScaleSplashAnimation); UIVisual.StartAnimation("Scale.XY", ScaleUIAnimation); BatchAnimation.Completed += (s, a) => { ElementCompositionPreview.SetElementChildVisual(BasePage, null); SurfaceLoader.Uninitialize(); AnimationCompleted?.Invoke(this, null); }; BatchAnimation.End(); } catch (Exception ex) { Debug.WriteLine($"Error in StartEntranceEffect, message:{ex.Message}"); } }