private void DetectTapGestures() { TouchManipulationInfo[] infos = new TouchManipulationInfo[_touchDictionary.Count]; _touchDictionary.Values.CopyTo(infos, 0); if (infos.Length != 1) { return; } SKPoint point = infos[0].PreviousPoint; if (infos[0].MoveCounter > MaxTapMoveCounter) { return; } var tapEventArgs = new TapEventArgs(point); var now = DateTime.Now; var lastTapTime = LastTapTime; LastTapTime = now; OnTap?.Invoke(this, tapEventArgs); if (now - lastTapTime < DoubleTapDelay) { OnDoubleTap?.Invoke(this, tapEventArgs); LastDoubleTapTime = now; LastTapTime = DateTime.MinValue; //Reset double tap timer } else { _timer = new Timer(_ => { if (DateTime.Now - LastDoubleTapTime < DoubleTapDelay) { return; } OnSingleTap?.Invoke(this, tapEventArgs); }, null, DoubleTapDelay.Milliseconds, Timeout.Infinite); } }
protected virtual void TouchGestureRecognizerOnDoubleTap(object sender, TapEventArgs args) { SKPoint scenePoint = _skScene.GetCanvasPointFromViewPoint(args.ViewPoint); _skScene.ZoomByScaleFactor(scenePoint, DoubleTapScaleFactor); }