private void ProcessTouchEvent(long id, MotionEventActions type, SKPoint location)
        {
            switch (type)
            {
            case MotionEventActions.Down:
            case MotionEventActions.Pointer2Down:
            case MotionEventActions.Pointer1Down:
                touchDictionary.Add(id, new TouchManipulationInfo
                {
                    PreviousPoint = location,
                    NewPoint      = location
                });
                break;

            case MotionEventActions.Move:
                TouchManipulationInfo info = touchDictionary[id];
                info.NewPoint = location;
                Manipulate();
                info.PreviousPoint = info.NewPoint;
                break;

            case MotionEventActions.Up:
            case MotionEventActions.Pointer2Up:
            case MotionEventActions.Pointer1Up:
                touchDictionary[id].NewPoint = location;
                //Manipulate();
                touchDictionary.Remove(id);
                break;

            case MotionEventActions.Cancel:
                touchDictionary.Remove(id);
                break;
            }
        }
        private void Manipulate()
        {
            TouchManipulationInfo[] infos = new TouchManipulationInfo[touchDictionary.Count];
            touchDictionary.Values.CopyTo(infos, 0);
            SKMatrix touchMatrix = SKMatrix.MakeIdentity();

            if (infos.Length == 1)
            {
                SKPoint prevPoint  = infos[0].PreviousPoint;
                SKPoint newPoint   = infos[0].NewPoint;
                SKPoint pivotPoint = Matrix.MapPoint(_info.Width / 2, _info.Height / 2);

                OneFingerManipulate(prevPoint, newPoint, pivotPoint);
            }
            else if (infos.Length >= 2)
            {
                int     pivotIndex = infos[0].NewPoint == infos[0].PreviousPoint ? 0 : 1;
                SKPoint pivotPoint = Matrix.MapPoint(_info.Width / 2, _info.Height / 2);
                SKPoint newPoint   = infos[1 - pivotIndex].NewPoint;
                SKPoint prevPoint  = infos[1 - pivotIndex].PreviousPoint;

                TwoFingerManipulate(prevPoint, newPoint, pivotPoint);
            }
        }