コード例 #1
0
        /// <inheritdoc />
        protected override void touchesBegan(IList <ITouch> touches)
        {
            base.touchesBegan(touches);

            if (State != GestureState.Possible)
            {
                return;
            }
            if (touches.Count == NumTouches)
            {
                projectionLayer = activeTouches[0].Layer;
                updateProjectionPlane();

#if DEBUG
                drawDebug(projectionLayer.ProjectFrom(cachedTransform.position), activeTouches[0].Position);
#endif
            }
        }
コード例 #2
0
        /// <inheritdoc />
        protected override void touchesMoved(IList <ITouch> touches)
        {
            base.touchesMoved(touches);

            var dR = deltaRotation = 0;
            var dS = deltaScale = 1f;

#if DEBUG
            var worldCenter  = cachedTransform.position;
            var screenCenter = projectionLayer.ProjectFrom(worldCenter);
            var newScreenPos = getPointScreenPosition();
            drawDebug(screenCenter, newScreenPos);
#endif

            if (touchesNumState != TouchesNumState.InRange)
            {
                return;
            }

            var rotationEnabled = (Type & TransformType.Rotation) == TransformType.Rotation;
            var scalingEnabled  = (Type & TransformType.Scaling) == TransformType.Scaling;
            if (!rotationEnabled && !scalingEnabled)
            {
                return;
            }
            if (!relevantTouches(touches))
            {
                return;
            }

#if !DEBUG
            var theTouch     = activeTouches[0];
            var worldCenter  = cachedTransform.position;
            var screenCenter = projectionLayer.ProjectFrom(worldCenter);
            var newScreenPos = theTouch.Position;
#endif

            // Here we can't reuse last frame screen positions because points 0 and 1 can change.
            // For example if the first of 3 fingers is lifted off.
            var oldScreenPos = getPointPreviousScreenPosition();

            if (rotationEnabled)
            {
                if (isTransforming)
                {
                    dR = doRotation(worldCenter, oldScreenPos, newScreenPos);
                }
                else
                {
                    // Find how much we moved perpendicular to the line (center, oldScreenPos)
                    screenPixelRotationBuffer += TwoD.PointToLineDistance(screenCenter, oldScreenPos, newScreenPos);
                    angleBuffer += doRotation(worldCenter, oldScreenPos, newScreenPos);

                    if (screenPixelRotationBuffer * screenPixelRotationBuffer >=
                        screenTransformPixelThresholdSquared)
                    {
                        isTransforming = true;
                        dR             = angleBuffer;
                    }
                }
            }

            if (scalingEnabled)
            {
                if (isTransforming)
                {
                    dS *= doScaling(worldCenter, oldScreenPos, newScreenPos);
                }
                else
                {
                    screenPixelScalingBuffer += (newScreenPos - screenCenter).magnitude -
                                                (oldScreenPos - screenCenter).magnitude;
                    scaleBuffer *= doScaling(worldCenter, oldScreenPos, newScreenPos);

                    if (screenPixelScalingBuffer * screenPixelScalingBuffer >=
                        screenTransformPixelThresholdSquared)
                    {
                        isTransforming = true;
                        dS             = scaleBuffer;
                    }
                }
            }

            if (dR != 0 || dS != 1)
            {
                if (State == GestureState.Possible)
                {
                    setState(GestureState.Began);
                }
                switch (State)
                {
                case GestureState.Began:
                case GestureState.Changed:
                    deltaRotation = dR;
                    deltaScale    = dS;
                    setState(GestureState.Changed);
                    break;
                }
            }
        }