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); }
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 }); } }