예제 #1
0
        /// <summary>
        /// Computes the scaling and translation to correctly zoom around your fingers.
        /// </summary>
        private void OnPinchDelta(object sender, PinchGestureEventArgs e)
        {
            var scaleFactor = e.DistanceRatio / _oldScaleFactor;

            if (!IsScaleValid(scaleFactor))
            {
                return;
            }

            var currentFinger1 = e.GetPosition(CameraImage, 0);
            var currentFinger2 = e.GetPosition(CameraImage, 1);

            var translationDelta = GetTranslationDelta(
                currentFinger1,
                currentFinger2,
                _oldFinger1,
                _oldFinger2,
                ImagePosition,
                scaleFactor);

            _oldFinger1     = currentFinger1;
            _oldFinger2     = currentFinger2;
            _oldScaleFactor = e.DistanceRatio;

            UpdateImageScale(scaleFactor);
            UpdateImagePosition(translationDelta);
        }
예제 #2
0
        /// <summary>
        /// Computes the scaling and translation to correctly zoom around your fingers.
        /// </summary>
        private void OnPinchDelta(object sender, PinchGestureEventArgs e)
        {
            var scaleFactor = e.DistanceRatio / _oldScaleFactor;

            if (totalImageScale * scaleFactor < 1)
            {
                isRestore = true;
            }
            else
            {
                isRestore = false;
                if (totalImageScale * scaleFactor > MAX_IMAGE_ZOOM)
                {
                    return;
                }
            }
            var currentFinger1   = e.GetPosition(FileImage, 0);
            var currentFinger2   = e.GetPosition(FileImage, 1);
            var translationDelta = GetTranslationDelta(currentFinger1, currentFinger2, _oldFinger1, _oldFinger2, imagePosition, scaleFactor);

            _oldFinger1     = currentFinger1;
            _oldFinger2     = currentFinger2;
            _oldScaleFactor = e.DistanceRatio;
            UpdateImageScale(scaleFactor);
            if (isRestore) //image's total reduction is < 1
            {
                imagePosition.X = (FileImage.ActualWidth * (1 - scaleFactor * totalImageScale)) / 2;
                imagePosition.Y = (FileImage.ActualHeight * (1 - scaleFactor * totalImageScale)) / 2;
                ApplyPosition();
            }
            else
            {
                UpdateImagePosition(translationDelta);
            }
        }
예제 #3
0
        private void OnPinchDelta(object sender, PinchGestureEventArgs e)
        {
            if (isAnimating)
            {
                return;
            }

            var scaleFactor = e.DistanceRatio / oldScaleFactor;

            if (!IsScaleValid(scaleFactor))
            {
                return;
            }

            var currentFinger1 = e.GetPosition(_content, 0);
            var currentFinger2 = e.GetPosition(_content, 1);

            var translationDelta = GetTranslationDelta(currentFinger1, currentFinger2, scaleFactor);

            oldFinger1     = currentFinger1;
            oldFinger2     = currentFinger2;
            oldScaleFactor = e.DistanceRatio;

            UpdateScale(scaleFactor);
            UpdatePosition(translationDelta);

            e.Handled = true;
        }
예제 #4
0
        private void gesture_PinchCompleted(object sender, PinchGestureEventArgs e)
        {
            var point  = e.GetPosition(ContentPanel, 0);
            var point2 = e.GetPosition(ContentPanel, 1);

            message.Text = string.Format("pinch completed at ({0},{1}) and ({1},{2}) with angle delta {3} and distance ratio {4}",
                                         point.X, point.Y, point2.X, point2.Y, e.TotalAngleDelta, e.DistanceRatio);
        }
예제 #5
0
        private void OnPinchDelta(object sender, PinchGestureEventArgs e)
        {
            // if its less that the original  size or more than 4x then does not apply
            if (initialScale * e.DistanceRatio > 4 ||
                (Math.Abs(initialScale - 1) > 0.01 && Math.Abs(e.DistanceRatio - 1) < 0.01) ||
                initialScale * e.DistanceRatio < 1)
            {
                return;
            }

            // if its original size then center it back
            if (e.DistanceRatio <= 1.08)
            {
                ImageTransformation.CenterY    = 0;
                ImageTransformation.CenterY    = 0;
                ImageTransformation.TranslateX = 0;
                ImageTransformation.TranslateY = 0;
            }

            var scaleFactor = e.DistanceRatio / _oldScaleFactor;

            var currentFinger1 = e.GetPosition(DetailImage, 0);
            var currentFinger2 = e.GetPosition(DetailImage, 1);

            var translationDelta = GetTranslationDelta(
                currentFinger1,
                currentFinger2,
                _oldFinger1,
                _oldFinger2,
                ImagePosition,
                scaleFactor);

            _oldFinger1     = currentFinger1;
            _oldFinger2     = currentFinger2;
            _oldScaleFactor = e.DistanceRatio;

            UpdateImage(scaleFactor, translationDelta);

            ImageTransformation.CenterX = center.X;
            ImageTransformation.CenterY = center.Y;

            //// update the rotation and scaling
            //if (Orientation == PageOrientation.Landscape)
            //{
            //    // when in landscape we need to zoom faster, if not it looks choppy
            //    ImageTransformation.ScaleX = initialScale * (1 + (e.DistanceRatio - 1) * 2);
            //}
            //else
            //{
            //    ImageTransformation.ScaleX = initialScale * e.DistanceRatio;
            //}
            //ImageTransformation.ScaleY = ImageTransformation.ScaleX;
        }
예제 #6
0
        private void OnPinchDelta(object s, PinchGestureEventArgs e)
        {
            var newScale         = e.DistanceRatio / _previousScale;
            var currentFingerOne = e.GetPosition(MyImage, 0);
            var currentFingerTwo = e.GetPosition(MyImage, 1);
            var translationDelta = GetTranslationOffset(currentFingerOne,
                                                        currentFingerTwo, _fingerOne, _fingerTwo, _imageTranslation, newScale);

            _fingerOne     = currentFingerOne;
            _fingerTwo     = currentFingerTwo;
            _previousScale = e.DistanceRatio;
            UpdatePicture(newScale, translationDelta);
        }
예제 #7
0
        private void OnPinchDelta(object s, PinchGestureEventArgs e)
        {
            var scaleFactor = e.DistanceRatio / _oldScaleFactor;

            var currentFinger1 = e.GetPosition(MainImage, 0);
            var currentFinger2 = e.GetPosition(MainImage, 1);

            var translationDelta = GetTranslationDelta(
                currentFinger1,
                currentFinger2,
                _oldFinger1,
                _oldFinger2,
                ImagePosition,
                scaleFactor);

            _oldFinger1     = currentFinger1;
            _oldFinger2     = currentFinger2;
            _oldScaleFactor = e.DistanceRatio;

            UpdateImage(scaleFactor, translationDelta);
        }
예제 #8
0
        private void OnPinchDelta(object sender, PinchGestureEventArgs e)
        {
            if (!CanZoom)
            {
                return;
            }

            var frameworkElement = sender as FrameworkElement;
            var transform        = frameworkElement.RenderTransform as CompositeTransform;
            var a = transform.Transform(e.GetPosition(frameworkElement, 0)); // we need the points to be relative to the current transform
            var b = transform.Transform(e.GetPosition(frameworkElement, 1));

            var scale = new CompositeTransform
            {
                CenterX = (a.X + b.X) / 2,
                CenterY = (a.Y + b.Y) / 2,
                ScaleX  = Clamp(e.DistanceRatio * _initialScale / _old.ScaleX,
                                MinZoom / _old.ScaleX,
                                MaxZoom / _old.ScaleX),
                ScaleY = Clamp(e.DistanceRatio * _initialScale / _old.ScaleY,
                               MinZoom / _old.ScaleY,
                               MaxZoom / _old.ScaleY)
            };

            ConstrainToParentBounds(frameworkElement, scale);

            transform = ComposeScaleTranslate(transform, scale);
            frameworkElement.RenderTransform = transform;

            _old.CenterX    = transform.CenterX;
            _old.CenterY    = transform.CenterY;
            _old.TranslateX = transform.TranslateX;
            _old.TranslateY = transform.TranslateY;
            _old.ScaleX     = transform.ScaleX;
            _old.ScaleY     = transform.ScaleY;

            CurrentScaleX = _old.ScaleX;
            CurrentScaleY = _old.ScaleY;
        }
예제 #9
0
        private void OnGestureListenerPinchDelta(object sender, PinchGestureEventArgs args)
        {
            if (_isPinching)
            {
                // Set scaling
                scaleTransform.ScaleX = args.DistanceRatio;
                scaleTransform.ScaleY = args.DistanceRatio;
                rotateTransform.Angle = args.TotalAngleDelta;

                // Set translation
                Point ptPinchPosition = args.GetPosition(this);
                translateTransform.X = ptPinchPosition.X - _ptPinchPositionStart.X;
                translateTransform.Y = ptPinchPosition.Y - _ptPinchPositionStart.Y;
            }
        }
예제 #10
0
        void OnGestureListenerPinchDelta(object sender, PinchGestureEventArgs args)
        {
            if (!isPinching)
            {
                return;
            }
            //if (args.DistanceRatio < 0.7) return;
            // Set scaling
            scaleTransform.ScaleX = args.DistanceRatio;
            scaleTransform.ScaleY = args.DistanceRatio;

            // Optionally set rotation
            //if (allowRotateCheckBox.IsChecked.Value)
            //    rotateTransform.Angle = args.TotalAngleDelta;

            // Set translation
            Point ptPinchPosition = args.GetPosition(this);

            translateTransform.X = ptPinchPosition.X - ptPinchPositionStart.X;
            translateTransform.Y = ptPinchPosition.Y - ptPinchPositionStart.Y;
        }