private ISkiaInputComponent getSkiaInputComponent(SKPoint point) { List <ISkiaInputComponent> inputComponents = new List <ISkiaInputComponent>(); for (int i = 0; i < SkiaBehaviourEngine.SkiaObjectCount; i++) { SkiaObject skiaObject = SkiaBehaviourEngine.GetSkiaObject(i); if (skiaObject is ISkiaInputComponent) { ISkiaInputComponent inputComponent = skiaObject as ISkiaInputComponent; if (inputComponent.FirstTouchArea.IsOverlapPoint(point)) { inputComponents.Add(inputComponent); } } } if (inputComponents.Count == 0) { return(null); } ISkiaInputComponent topInputComponent = inputComponents[0]; for (int i = 0; i < inputComponents.Count; i++) { if (inputComponents[i].InputHeightLevel > topInputComponent.InputHeightLevel) { topInputComponent = inputComponents[i]; } } return(topInputComponent); }
private void handleTouchAction(ITouch touch, TouchMotionAction action) { CanvasInfoProvider canvasInfoProvider = SkiaBehaviourEngine.CanvasInfoProvider as CanvasInfoProvider; SkiaTouch skiaTouch = null; if (action == TouchMotionAction.Down) { int heightLevel = 0; ISkiaInputComponent skiaInputComponent = getSkiaInputComponent(canvasInfoProvider.DeviceToCanvasPoint(touch.Position.ToSKPoint())); if (skiaInputComponent != null) { heightLevel = skiaInputComponent.InputHeightLevel; } skiaTouch = new SkiaTouch(this, touch, heightLevel); _SkiaTouches.Add(skiaTouch); } else if (action == TouchMotionAction.Up) { for (int i = 0; i < _SkiaTouches.Count; i++) { if (_SkiaTouches[i].Touch == touch) { skiaTouch = _SkiaTouches[i]; _SkiaTouches.RemoveAt(i); break; } } } else { for (int i = 0; i < _SkiaTouches.Count; i++) { if (_SkiaTouches[i].Touch == touch) { skiaTouch = _SkiaTouches[i]; } } } if (skiaTouch == null) { return; } OnSkiaTouchAction?.Invoke(skiaTouch, action); }