public InertiaProcessor(Manipulation owner, Point position, ManipulationDelta cumulative, ManipulationVelocities velocities) { _owner = owner; _position0 = position; _cumulative0 = cumulative; _velocities0 = velocities; _isTranslateInertiaXEnabled = _owner._isTranslateXEnabled && _owner._settings.HasFlag(Input.GestureSettings.ManipulationTranslateInertia) && Abs(velocities.Linear.X) > _owner._inertiaThresholds.TranslateX; _isTranslateInertiaYEnabled = _owner._isTranslateYEnabled && _owner._settings.HasFlag(Input.GestureSettings.ManipulationTranslateInertia) && Abs(velocities.Linear.Y) > _owner._inertiaThresholds.TranslateY; _isRotateInertiaEnabled = _owner._isRotateEnabled && _owner._settings.HasFlag(Input.GestureSettings.ManipulationRotateInertia) && Abs(velocities.Angular) > _owner._inertiaThresholds.Rotate; _isScaleInertiaEnabled = _owner._isScaleEnabled && _owner._settings.HasFlag(Input.GestureSettings.ManipulationScaleInertia) && Abs(velocities.Expansion) > _owner._inertiaThresholds.Expansion; global::System.Diagnostics.Debug.Assert(_isTranslateInertiaXEnabled || _isTranslateInertiaYEnabled || _isRotateInertiaEnabled || _isScaleInertiaEnabled); // For better experience, as soon inertia kicked-in on an axis, we bypass threshold on the second axis. _isTranslateInertiaXEnabled |= _isTranslateInertiaYEnabled && _owner._isTranslateXEnabled; _isTranslateInertiaYEnabled |= _isTranslateInertiaXEnabled && _owner._isTranslateYEnabled; _timer = DispatcherQueue.GetForCurrentThread().CreateTimer(); _timer.Interval = TimeSpan.FromMilliseconds(1000d / _framesPerSecond); _timer.IsRepeating = true; _timer.Tick += (snd, e) => Process(snd.LastTickElapsed.TotalMilliseconds); }
internal ManipulationCompletedEventArgs( PointerIdentifier[] pointers, Point position, ManipulationDelta cumulative, ManipulationVelocities velocities, bool isInertial, uint contactCount, uint currentContactCount) { global::System.Diagnostics.Debug.Assert(pointers.Length > 0 && pointers.All(p => p.Type == pointers[0].Type)); Pointers = pointers; Position = position; Cumulative = cumulative; Velocities = velocities; IsInertial = isInertial; ContactCount = contactCount; CurrentContactCount = currentContactCount; }
internal ManipulationInertiaStartingEventArgs( PointerIdentifier[] pointers, Point position, ManipulationDelta delta, ManipulationDelta cumulative, ManipulationVelocities velocities, uint contactCount, GestureRecognizer.Manipulation.InertiaProcessor processor) { global::System.Diagnostics.Debug.Assert(pointers.Length > 0 && pointers.All(p => p.Type == pointers[0].Type)); Pointers = pointers; PointerDeviceType = pointers[0].Type; Position = position; Delta = delta; Cumulative = cumulative; Velocities = velocities; ContactCount = contactCount; Processor = processor; }
protected virtual GestureEnd EndMove(bool isInertial, ManipulationDelta cumulative, ManipulationVelocities velocities, Point position) { this.dragLock = DragLock.Unset; this.dragging = false; double angle = 0.0; if (isInertial) { angle = GestureService.AngleFromVector(velocities.Linear.X, velocities.Linear.Y); if (angle <= 45.0 || angle >= 315.0) { angle = 0.0; } else if (angle >= 135.0 && angle <= 225.0) { angle = 180.0; } this.ReleaseMouseCaptureAtGestureOrigin(); } return new GestureEnd(angle, isInertial, cumulative.Translation, position); }