Пример #1
0
        void manipulationProcessor_Affine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            inertiaProcessor.InitialOrigin = e.ManipulationOrigin;

            inertiaProcessor.InitialVelocity          = e.Velocity;
            inertiaProcessor.InitialExpansionVelocity = e.ExpansionVelocity;
            inertiaProcessor.InitialAngularVelocity   = e.AngularVelocity;

            inertiaProcessor.DesiredDeceleration          = 0.002;
            inertiaProcessor.DesiredAngularDeceleration   = 0.0005f;
            inertiaProcessor.DesiredExpansionDeceleration = 0.0002f;

            inertiaProcessor.Begin();
        }
Пример #2
0
 /// <summary>
 /// Unused
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
 {
 }
Пример #3
0
        /// <summary>
        /// Start the flicking behavior. 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            if (inertiaProcessor != null)
            {
                inertiaProcessor.Affine2DInertiaDelta -= OnAffine2DInertiaDelta;
                inertiaProcessor.Affine2DInertiaCompleted -= OnAffine2DInertiaCompleted;
                inertiaProcessor = null;
            }

            // The Manipulations should all run in screen space so don't convert between spaces.
            VectorF initialVelocity;
            VectorF maxViewPortSize;
            if (Orientation == Orientation.Horizontal)
            {
                initialVelocity = new VectorF(e.VelocityX, 0);
                maxViewPortSize = new VectorF(numberOfPixelsInAxis * viewportSize, 0);
            }
            else
            {
                initialVelocity = new VectorF(0, e.VelocityY);
                maxViewPortSize = new VectorF(0, numberOfPixelsInAxis * viewportSize);
            }

            // Check velocity.
            if (initialVelocity.Length < FlickUtilities.MinimumFlickVelocity)
            {
                return;
            }

            if (initialVelocity.Length >= MaximumFlickVelocity)
            {
                // If velocity is too large, reduce it to a reasonable value.
                initialVelocity.Normalize();
                initialVelocity = MaximumFlickVelocity * initialVelocity;
            }

            VectorF flickDistance;

            if (FlickUtilities.TryGetFlickDistance(initialVelocity, out flickDistance, maxViewPortSize))
            {
                processInertia = true;
                inertiaProcessor = new Affine2DInertiaProcessor();

                inertiaProcessor.Affine2DInertiaDelta += OnAffine2DInertiaDelta;
                inertiaProcessor.Affine2DInertiaCompleted += OnAffine2DInertiaCompleted;

                float displacement = 0;

                if (flickDistance.X == 0)
                {
                    displacement = flickDistance.Y;
                }
                else if (flickDistance.Y == 0)
                {
                    displacement = flickDistance.X;
                }
                else
                {
                    displacement = Math.Min(flickDistance.X, flickDistance.Y);
                }

                inertiaProcessor.DesiredDisplacement = float.IsInfinity(displacement) ? 0 : Math.Abs(displacement);
                inertiaProcessor.InitialTimestamp = stopwatch.ElapsedTicks;
                inertiaProcessor.InitialVelocityX = initialVelocity.X;
                inertiaProcessor.InitialVelocityY = initialVelocity.Y;

                inertiaProcessor.InitialOriginX = ToScreenSpace(Value);
                inertiaProcessor.InitialOriginY = ToScreenSpace(Value);
            }
        }
Пример #4
0
        /// <summary>
        /// Set the flick to completed so that it stops moving.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void OnAffine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            processInertia = false;
            manipulationProcessor = null;

            if (inertiaProcessor != null)
            {
                inertiaProcessor.Affine2DInertiaDelta -= new EventHandler<Affine2DOperationDeltaEventArgs>(OnAffine2DInertiaDelta);
                inertiaProcessor.Affine2DInertiaCompleted -= new EventHandler<Affine2DOperationCompletedEventArgs>(OnAffine2DInertiaCompleted);
                inertiaProcessor = null;
            }
        }
Пример #5
0
            //==========================================================//
            /// <summary>
            /// Event handler for the manipulation processor's completed event. 
            /// Occurs whenever the manipulation processor processes manipulator 
            /// data where all remaining contacts have been removed.
            /// Check final deltas and start the inertia processor if they are high enough
            /// </summary>
            /// <param name="sender">The manipulation processor that raised the event</param>
            /// <param name="e">The event args for the event</param>
            private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
            {
                // manipulation completed
                manipulating = false;

                // Get the inital inertia values
                //Vector2 initialVelocity = new Vector2(e.VelocityX, e.VelocityY);
                float angularVelocity = e.AngularVelocity;
                float expansionVelocity = e.ExpansionVelocity;

                // Calculate the deceleration rates

                // 4 inches/second squared (4 inches * 96 pixels per inch / (1000 per millisecond)^2)
                const float deceleration = 4.0f * 96.0f / (1000.0f * 1000.0f);
                const float expansionDeceleration = 4.0f * 96.0f / (1000.0f * 1000.0f);

                // 90 degrees/second squared, specified in radians (180 * pi / (1000 per miliseconds)^2)
                const float angularDeceleration = 90.0f / 180.0f * (float)Math.PI / (1000.0f * 1000.0f);

                // Rotate around the center of the item
                //inertiaProcessor.InitialOriginX = TransformedCenter.X;
                //inertiaProcessor.InitialOriginY = TransformedCenter.Y;
                inertiaProcessor.InitialOriginX = e.ManipulationOriginX;
                inertiaProcessor.InitialOriginY = e.ManipulationOriginY;

                // set initial velocity if translate flicks are allowed
                //if (canTranslateFlick)
                //{
                    inertiaProcessor.InitialVelocityX = e.VelocityX;
                    inertiaProcessor.InitialVelocityY = e.VelocityY;
                    inertiaProcessor.DesiredDeceleration = deceleration;
                //}
                /*else
                {
                    inertiaProcessor.InitialVelocityX = 0.0f;
                    inertiaProcessor.InitialVelocityY = 0.0f;
                    inertiaProcessor.DesiredDeceleration = 0.0f;
                }*/

                // set expansion velocity if scale flicks are allowed
                if (Math.Abs(expansionVelocity)> 0.00001 /*&& canScaleFlick*/)
                {
                    inertiaProcessor.InitialExpansionVelocity = expansionVelocity;
                    //inertiaProcessor.InitialRadius = (AxisAlignedBoundingRectangle.Width / 2 + AxisAlignedBoundingRectangle.Height / 2) / 2;
                    inertiaProcessor.InitialRadius = 100;
                    inertiaProcessor.DesiredExpansionDeceleration = expansionDeceleration;
                }
                /*else
                {
                    inertiaProcessor.InitialExpansionVelocity = 0.0f;
                    inertiaProcessor.InitialRadius = 1.0f;
                    inertiaProcessor.DesiredExpansionDeceleration = 0.0f;
                }*/

                // set angular velocity if rotation flicks are allowed
                if (Math.Abs(angularVelocity)> 0.00001 /*&& canRotateFlick*/)
                {
                    inertiaProcessor.InitialAngularVelocity = angularVelocity;
                    inertiaProcessor.DesiredAngularDeceleration = angularDeceleration;
                }
                /*else
                {
                    inertiaProcessor.InitialAngularVelocity = 0.0f;
                    inertiaProcessor.DesiredAngularDeceleration = 0.0f;
                }*/

                // Set the boundaries in which manipulations can occur
                /*inertiaProcessor.LeftBoundary = parent.Left - parent.BoundaryThreshold;
                inertiaProcessor.RightBoundary = parent.Right + parent.BoundaryThreshold;
                inertiaProcessor.TopBoundary = parent.Top - parent.BoundaryThreshold;
                inertiaProcessor.BottomBoundary = parent.Bottom + parent.BoundaryThreshold;
                */
                extrapolating = true;
            }
Пример #6
0
 //==========================================================//
 /// <summary>
 /// Event handler for the inertia processor's complete event.
 /// Occurs whenever the item comes to rest after being flicked
 /// </summary>
 /// <param name="sender">The inertia processor that raised the event</param>
 /// <param name="e">The event args for the event</param>
 private void OnAffine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
 {
     extrapolating = false;
 }
        /// <summary>
        /// When the manipulation is completed, either spring the content back into bounds, or begin inertia.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="Microsoft.Surface.Presentation.Manipulations.Affine2DOperationCompletedEventArgs"/> instance containing the event data.</param>
        private void ContentManipulationProcessor_Affine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            if (Spring())
            {
                return;
            }

            Rect bounds = GetContentBounds();
            _inertiaProcessor.InitialOrigin = new Point();
            _inertiaProcessor.InitialVelocity = e.Velocity;
            _inertiaProcessor.Bounds = new Thickness(ActualWidth - bounds.BottomRight.X, ActualHeight - bounds.BottomRight.Y, -bounds.TopLeft.X, -bounds.TopLeft.Y);
            _inertiaProcessor.Begin();
        }
Пример #8
0
 void inertiaProcessor_Affine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
 {
 }
Пример #9
0
 //==========================================================//
 /// <summary>
 /// Event handler for the inertia processor's complete event.
 /// Occurs whenever the item comes to rest after being flicked
 /// </summary>
 /// <param name="sender">The inertia processor that raised the event</param>
 /// <param name="e">The event args for the event</param>
 private void OnAffine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
 {
     extrapolating = false;
 }
Пример #10
0
            //==========================================================//
            /// <summary>
            /// Event handler for the manipulation processor's completed event.
            /// Occurs whenever the manipulation processor processes manipulator
            /// data where all remaining contacts have been removed.
            /// Check final deltas and start the inertia processor if they are high enough
            /// </summary>
            /// <param name="sender">The manipulation processor that raised the event</param>
            /// <param name="e">The event args for the event</param>
            private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
            {
                // manipulation completed
                manipulating = false;

                // Get the inital inertia values
                //Vector2 initialVelocity = new Vector2(e.VelocityX, e.VelocityY);
                float angularVelocity   = e.AngularVelocity;
                float expansionVelocity = e.ExpansionVelocity;

                // Calculate the deceleration rates

                // 4 inches/second squared (4 inches * 96 pixels per inch / (1000 per millisecond)^2)
                const float deceleration          = 4.0f * 96.0f / (1000.0f * 1000.0f);
                const float expansionDeceleration = 4.0f * 96.0f / (1000.0f * 1000.0f);

                // 90 degrees/second squared, specified in radians (180 * pi / (1000 per miliseconds)^2)
                const float angularDeceleration = 90.0f / 180.0f * (float)Math.PI / (1000.0f * 1000.0f);

                // Rotate around the center of the item
                //inertiaProcessor.InitialOriginX = TransformedCenter.X;
                //inertiaProcessor.InitialOriginY = TransformedCenter.Y;
                inertiaProcessor.InitialOriginX = e.ManipulationOriginX;
                inertiaProcessor.InitialOriginY = e.ManipulationOriginY;

                // set initial velocity if translate flicks are allowed
                //if (canTranslateFlick)
                //{
                inertiaProcessor.InitialVelocityX    = e.VelocityX;
                inertiaProcessor.InitialVelocityY    = e.VelocityY;
                inertiaProcessor.DesiredDeceleration = deceleration;
                //}

                /*else
                 * {
                 *  inertiaProcessor.InitialVelocityX = 0.0f;
                 *  inertiaProcessor.InitialVelocityY = 0.0f;
                 *  inertiaProcessor.DesiredDeceleration = 0.0f;
                 * }*/


                // set expansion velocity if scale flicks are allowed
                if (Math.Abs(expansionVelocity) > 0.00001 /*&& canScaleFlick*/)
                {
                    inertiaProcessor.InitialExpansionVelocity = expansionVelocity;
                    //inertiaProcessor.InitialRadius = (AxisAlignedBoundingRectangle.Width / 2 + AxisAlignedBoundingRectangle.Height / 2) / 2;
                    inertiaProcessor.InitialRadius = 100;
                    inertiaProcessor.DesiredExpansionDeceleration = expansionDeceleration;
                }

                /*else
                 * {
                 *  inertiaProcessor.InitialExpansionVelocity = 0.0f;
                 *  inertiaProcessor.InitialRadius = 1.0f;
                 *  inertiaProcessor.DesiredExpansionDeceleration = 0.0f;
                 * }*/


                // set angular velocity if rotation flicks are allowed
                if (Math.Abs(angularVelocity) > 0.00001 /*&& canRotateFlick*/)
                {
                    inertiaProcessor.InitialAngularVelocity     = angularVelocity;
                    inertiaProcessor.DesiredAngularDeceleration = angularDeceleration;
                }

                /*else
                 * {
                 *  inertiaProcessor.InitialAngularVelocity = 0.0f;
                 *  inertiaProcessor.DesiredAngularDeceleration = 0.0f;
                 * }*/


                // Set the boundaries in which manipulations can occur

                /*inertiaProcessor.LeftBoundary = parent.Left - parent.BoundaryThreshold;
                 * inertiaProcessor.RightBoundary = parent.Right + parent.BoundaryThreshold;
                 * inertiaProcessor.TopBoundary = parent.Top - parent.BoundaryThreshold;
                 * inertiaProcessor.BottomBoundary = parent.Bottom + parent.BoundaryThreshold;
                 */
                extrapolating = true;
            }
Пример #11
0
        /// <summary>
        /// Start the inertia processor in Surface screen space.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnAffine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            if (inertiaProcessor != null)
            {
                inertiaProcessor.Affine2DInertiaDelta -= OnAffine2DInertiaDelta;
                inertiaProcessor.Affine2DInertiaCompleted -= OnAffine2DInertiaCompleted;
                inertiaProcessor.Complete();
            }

            VectorF translation = new VectorF(e.TotalTranslationX, e.TotalTranslationY);

            // Don't start inertia if the tranlation is less than roughly 1/8" regardless of velocity.
            if (translation.Length < 96 / 8f)
            {
                return;
            }

            // Scroll in the opposite direction because a ScrollViewer moves with the contact.
            VectorF initialVelocity = new VectorF(-e.VelocityX, -e.VelocityY);

            // Check velocity.
            if (initialVelocity.Length < FlickUtilities.MinimumFlickVelocity)
            {
                // If velocity is below this threshold ignore it.
                return;
            }

            if (initialVelocity.Length >= FlickUtilities.MaximumFlickVelocity)
            {
                // If velocity is too large, reduce it to a reasonable value.
                initialVelocity.Normalize();
                initialVelocity = FlickUtilities.MaximumFlickVelocity * initialVelocity;
            }

            processInertia = true;
            inertiaProcessor = new Affine2DInertiaProcessor();

            inertiaProcessor.Affine2DInertiaDelta += OnAffine2DInertiaDelta;
            inertiaProcessor.Affine2DInertiaCompleted += OnAffine2DInertiaCompleted;
            inertiaProcessor.DesiredDisplacement = ConvertFromVerticalValueToScreenSpace(VerticalViewportSize);
            inertiaProcessor.InitialVelocityX = initialVelocity.X * HorizontalViewportSize;
            inertiaProcessor.InitialVelocityY = initialVelocity.Y * VerticalViewportSize;
            inertiaProcessor.InitialTimestamp = stopwatch.ElapsedTicks;

            inertiaProcessor.InitialOriginX = ConvertFromHorizontalValueToScreenSpace(horizontalScrollBarStateMachine.Value);
            inertiaProcessor.InitialOriginY = ConvertFromVerticalValueToScreenSpace(verticalScrollBarStateMachine.Value);
        }
Пример #12
0
 /// <summary>
 /// Inertia is complete so stop processing for it.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void OnAffine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
 {
     processInertia = false;
 }