コード例 #1
0
        private void ConfigSpringBasedTracker(UIElement element, double periodInMs,
                                              float dampingRatio, float finalValue = 0.0f, double delayInMs = 0.0f)
        {
            ElementCompositionPreview.SetIsTranslationEnabled(element, true);

            var tracker = InteractionTracker.Create(_compositor);

            tracker.InteractionSources.Add(_interactionSource);
            tracker.MaxPosition = new Vector3(Root.RenderSize.ToVector2(), 0.0f);
            tracker.MinPosition = -tracker.MaxPosition;

            var modifier        = InteractionTrackerInertiaNaturalMotion.Create(_compositor);
            var springAnimation = _compositor.CreateSpringScalarAnimation();

            springAnimation.Period       = TimeSpan.FromMilliseconds(periodInMs);
            springAnimation.DampingRatio = dampingRatio;
            springAnimation.FinalValue   = finalValue;
            // This will cause a black screen for a few seconds. Bug??
            springAnimation.DelayTime = TimeSpan.FromMilliseconds(delayInMs);

            modifier.Condition     = _compositor.CreateExpressionAnimation("true");
            modifier.NaturalMotion = springAnimation;

            tracker.ConfigurePositionXInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier });
            tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier });

            var imageVisual = ElementCompositionPreview.GetElementVisual(element);

            imageVisual.StartAnimation("Translation", -tracker.GetReference().Position);
        }
コード例 #2
0
        private void ActivateSpringForce()
        {
#if SDKVERSION_15063
            //
            // On newer builds, use the Spring NaturalMotion
            //
            if (MainPage.RuntimeCapabilities.IsSdkVersionRuntimeSupported(RuntimeSupportedSDKs.SDKVERSION._15063))
            {
                var modifier        = InteractionTrackerInertiaNaturalMotion.Create(_compositor);
                var springAnimation = _compositor.CreateSpringScalarAnimation();
                springAnimation.Period       = TimeSpan.FromSeconds(.15);
                springAnimation.DampingRatio = .4f;
                springAnimation.FinalValue   = 0.0f;

                modifier.Condition     = _compositor.CreateExpressionAnimation("true");
                modifier.NaturalMotion = springAnimation;
                _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier });
            }
            //
            // On older builds, use a custom force that behaves like a spring
            //
            else
#endif
            {
                var dampingConstant = 5;
                var springConstant  = 20;
                var modifier        = InteractionTrackerInertiaMotion.Create(_compositor);

                // Set the condition to true (always)
                modifier.SetCondition((BooleanNode)true);

                // Define a spring-like force, anchored at position 0.
                var target = ExpressionValues.Target.CreateInteractionTrackerTarget();
                modifier.SetMotion((-target.Position.Y * springConstant) - (dampingConstant * target.PositionVelocityInPixelsPerSecond.Y));
                _tracker.ConfigurePositionYInertiaModifiers(new InteractionTrackerInertiaModifier[] { modifier });
            }
        }