Exemple #1
0
        private void StartClipAnimation(CompositionEllipseGeometry ellipseGeometry, TimeSpan delayTime)
        {
            var compositor = Window.Current.Compositor;
            var animation  = compositor.CreateVector2KeyFrameAnimation();
            var easing     = compositor.CreateCubicBezierEasingFunction(new Vector2(0.1f, 0.9f), new Vector2(0.2f, 1f));

            animation.DelayTime = delayTime;
            animation.Duration  = TimeSpan.FromSeconds(0.7);
            animation.InsertKeyFrame(1, new Vector2(600, 600));
            ellipseGeometry.StartAnimation(nameof(CompositionEllipseGeometry.Radius), animation);
        }
        protected override void OnValueChanged(double oldValue, double newValue)
        {
            //if (newValue > 0)
            //{
            //    newValue = Math.Max(newValue, 0.0001);
            //}
            if (double.IsNaN(newValue))
            {
                newValue = 0;
            }

            if (newValue > 0 && newValue < 0.05)
            {
                newValue = 0.05;
            }

            if (_foreverAnimation != null)
            {
                if (newValue > 0 && newValue < 1)
                {
                    if (!_spinning)
                    {
                        _spinning = true;
                        _visual.RotationAngleInDegrees = 230; // 202
                        _visual.StartAnimation("RotationAngleInDegrees", _foreverAnimation);
                    }
                }
                //else if (_spinning)
                //{
                //    _spinning = false;
                //    _visual.StopAnimation("RotationAngleInDegrees");
                //}
            }

            if (_ellipse != null)
            {
                var diff = Math.Abs(oldValue - newValue);
                if (diff < 0.10 && newValue < 1)
                {
                    _ellipse.TrimStart = 0;
                    _ellipse.TrimEnd   = MathF.Max(0, MathF.Min(1, (float)newValue));
                }
                else
                {
                    var linear    = Window.Current.Compositor.CreateLinearEasingFunction();
                    var trimStart = Window.Current.Compositor.CreateScalarKeyFrameAnimation();
                    var trimEnd   = Window.Current.Compositor.CreateScalarKeyFrameAnimation();

                    if (newValue < 1)
                    {
                        //_ellipse.TrimStart = 0;
                        //_ellipse.TrimEnd = MathF.Max(0, MathF.Min(1, (float)newValue));

                        trimStart.InsertKeyFrame(1, 0, linear);
                        trimEnd.InsertKeyFrame(1, MathF.Max(0, MathF.Min(1, (float)newValue)), linear);

                        _ellipse.StartAnimation("TrimStart", trimStart);
                        _ellipse.StartAnimation("TrimEnd", trimEnd);
                    }
                    else
                    {
                        //_ellipse.TrimStart = 1;
                        //_ellipse.TrimEnd = 1;

                        trimStart.InsertKeyFrame(1, ShrinkOut ? 1 : 0, linear);
                        trimEnd.InsertKeyFrame(1, 1, linear);

                        var batch = Window.Current.Compositor.CreateScopedBatch(CompositionBatchTypes.Animation);
                        batch.Completed += (s, args) =>
                        {
                            if (_foreverAnimation != null && _spinning)
                            {
                                _spinning = false;
                                _visual.StopAnimation("RotationAngleInDegrees");
                            }

                            Completed?.Invoke(this, EventArgs.Empty);
                        };

                        _ellipse.StartAnimation("TrimStart", trimStart);
                        _ellipse.StartAnimation("TrimEnd", trimEnd);

                        batch.End();
                    }
                }
            }

            //if (newValue is >= 1.0 or <= 0.0)
            //{
            //    Visibility = Visibility.Collapsed;
            //}
            //else
            //{
            //    Visibility = Visibility.Visible;
            //}
        }