private static XCoreWetStrokeUpdateEventArgs CreateUpdateArgs(CoreWetStrokeUpdateEventArgs args) { var updateArgs = new XCoreWetStrokeUpdateEventArgs { PointerId = args.PointerId, NewInkPoints = (from item in args.NewInkPoints select new XInkPoint(new Xamarin.Forms.Point(item.Position.X, item.Position.Y), item.Pressure, item.TiltX, item.TiltY, item.Timestamp)).ToList() }; switch (args.Disposition) { case CoreWetStrokeDisposition.Canceled: updateArgs.Disposition = XCoreWetStrokeDisposition.Canceled; break; case CoreWetStrokeDisposition.Completed: updateArgs.Disposition = XCoreWetStrokeDisposition.Completed; break; case CoreWetStrokeDisposition.Inking: updateArgs.Disposition = XCoreWetStrokeDisposition.Inking; break; } return(updateArgs); }
private static void UpdateEventArgs(CoreWetStrokeUpdateEventArgs args, XCoreWetStrokeUpdateEventArgs updateArgs) { switch (updateArgs.Disposition) { case XCoreWetStrokeDisposition.Canceled: args.Disposition = CoreWetStrokeDisposition.Canceled; break; case XCoreWetStrokeDisposition.Completed: args.Disposition = CoreWetStrokeDisposition.Completed; break; case XCoreWetStrokeDisposition.Inking: args.Disposition = CoreWetStrokeDisposition.Inking; break; } args.NewInkPoints.Clear(); foreach (var item in updateArgs.NewInkPoints) { args.NewInkPoints.Add(new InkPoint( new Windows.Foundation.Point(item.Position.X, item.Position.Y), item.Pressure, item.TiltX, item.TiltY, item.Timestamp)); } }
private bool FollowCircleTest(CoreWetStrokeUpdateEventArgs args) { var position = args.NewInkPoints[0].Position; var distanceFromCenter = DistanceFromCenter(position); return(InCircleEdgeZone(distanceFromCenter)); }
private void OnWetStrokeCanceled(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { XCoreWetStrokeUpdateEventArgs updateArgs = CreateUpdateArgs(args); InvokeWetStrokeCanceled(updateArgs); UpdateEventArgs(args, updateArgs); }
private void OnWetStrokeStopping(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { var updateArgs = CreateUpdateArgs(args); InvokeWetStrokeStopping(updateArgs); UpdateEventArgs(args, updateArgs); }
private void CoreWetStrokeUpdateSource_WetStrokeContinuing(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { if (followCircle) { HandleFollowCircleInput(args); } else { HandleRegularInput(args); } }
private void CoreWetStrokeUpdateSource_WetStrokeStarting(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { followCircle = disableFollowCircle ? false : FollowCircleTest(args); if (followCircle) { HandleFollowCircleInput(args); } else { disableFollowCircle = true; HandleRegularInput(args); } }
void OnStrokeStarting(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { // as the stroke is starting, reset our member variables which store // which X or Y point we want to snap to. this.snapX = this.snapY = null; // I am assuming that we do get a first ink point. InkPoint firstPoint = args.NewInkPoints.First(); // now decide whether we need to set up a snap point for the X value or // one for the Y value. if (this.currentMode == Mode.SnapX) { this.snapX = this.NearestGridSizeMultiple(firstPoint.Position.X); } else if (this.currentMode == Mode.SnapY) { this.snapY = this.NearestGridSizeMultiple(firstPoint.Position.Y); } this.SnapPoints(args.NewInkPoints); }
private void HandleFollowCircleInput(CoreWetStrokeUpdateEventArgs args) { if (!discontinueStroke) { for (int i = 0; i < args.NewInkPoints.Count; i++) { var position = args.NewInkPoints[i].Position; var distanceFromCenter = DistanceFromCenter(position); if (InCircleEdgeZone(distanceFromCenter)) { // Calculate position of new InkPoint so that it lies on the edge of the circle var radians = Math.Atan2(position.Y - circleCenter.Y, position.X - circleCenter.X); var totalRadius = (radius + circleStrokeThickness / 2.0f + penSize / 2.0f); Point newPoint = new Point((Math.Cos(radians) * totalRadius) + circleCenter.X, (Math.Sin(radians) * totalRadius) + circleCenter.Y); args.NewInkPoints[i] = new InkPoint(newPoint, 0.5f); } else { // InkPoint is not in the follow circle zone, add no more InkPoints to Stroke discontinueStroke = true; for (int j = args.NewInkPoints.Count - 1; j >= i; j--) { args.NewInkPoints.RemoveAt(j); } break; } } } else { // Stroke has been discontinued, remove all InkPoints for (int j = args.NewInkPoints.Count - 1; j >= 0; j--) { args.NewInkPoints.RemoveAt(j); } } }
private void HandleRegularInput(CoreWetStrokeUpdateEventArgs args) { for (int i = 0; i < args.NewInkPoints.Count; i++) { var position = args.NewInkPoints[i].Position; var distanceFromCenter = DistanceFromCenter(position); if (distanceFromCenter < radius + circleStrokeThickness / 2 + penSize / 2) { // Ink input entered the circle. Handle this by removing remaining InkPoints // and completing the stroke. for (int j = args.NewInkPoints.Count - 1; j >= i; j--) { args.NewInkPoints.RemoveAt(j); } args.Disposition = CoreWetStrokeDisposition.Completed; break; } } }
private void CoreWetStrokeUpdateSource_WetStrokeCanceled(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { followCircle = false; discontinueStroke = false; disableFollowCircle = false; }
private void CoreWetStrokeUpdateSource_WetStrokeStopping(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { if (followCircle) { HandleFollowCircleInput(args); } else { HandleRegularInput(args); } disableFollowCircle = false; }
void OnStrokeContinuing(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { this.SnapPoints(args.NewInkPoints); }
private void coreWetStrokeUpdateSource_StrokeStopping(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { if (args.NewInkPoints.Count > 0) { InkPoint firstPoint = args.NewInkPoints.First(); Point p = new Point() { X = firstPoint.Position.X, Y = firstPoint.Position.Y }; if (GeometryHelper.PointIsInPolygon(P1, P2, P3, p) == true) { IsInkSpace = false; Snap = false; args.Disposition = CoreWetStrokeDisposition.Completed; } } if (Snap == true) { this.SnapPoints(args.NewInkPoints); } else if (IsInkSpace == false) { args.NewInkPoints.Clear(); } SaveNecessity = true; }
private bool FollowCircleTest(CoreWetStrokeUpdateEventArgs args) { var position = args.NewInkPoints[0].Position; var distanceFromCenter = DistanceFromCenter(position); return InCircleEdgeZone(distanceFromCenter); }
private void coreWetStrokeUpdateSource_StrokeStarting(CoreWetStrokeUpdateSource sender, CoreWetStrokeUpdateEventArgs args) { InkPoint firstPoint = args.NewInkPoints.First(); Point p = new Point() { X = firstPoint.Position.X, Y = firstPoint.Position.Y }; if (GeometryHelper.MinimalDistanceToGeodreieck(P1, P2, P3, p) <= 72) { Snap = true; IsInkSpace = true; this.SnapPoints(args.NewInkPoints); } else if (GeometryHelper.PointIsInPolygon(P1, P2, P3, p) == true) { IsInkSpace = false; Snap = false; args.NewInkPoints.Clear(); } else { IsInkSpace = true; Snap = false; } SaveNecessity = true; }