public GestureDetector(FrameLayout v, Context c) { var iv = new ImageView(c); iv.SetImageResource(Resource.Drawable.touch_100_white); int size = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 50, Resources.System.DisplayMetrics); int halfSize = size / 2; layoutParams = new FrameLayout.LayoutParams(size, size); iv.LayoutParameters = layoutParams; iv.Visibility = ViewStates.Gone; v.AddView(iv); v.Touch += delegate(object sender, View.TouchEventArgs args) { float curX = args.Event.GetX(); float curY = args.Event.GetY(); layoutParams.MarginStart = (int)curX - halfSize; layoutParams.TopMargin = (int)curY - halfSize; iv.LayoutParameters = layoutParams; switch (args.Event.ActionMasked) { case MotionEventActions.Down: moved = false; startX = curX; startY = curY; timeStart = CurrentTimeMillis(); FadeVisibility(true, iv); //iv.Visibility = ViewStates.Visible; break; case MotionEventActions.Move: moved = true; break; case MotionEventActions.Up: timeEnd = CurrentTimeMillis(); /*Toast.MakeText(Application.Context, * $"TIME: {timeEnd - timeStart}\nPIXEL: {(curX - startX) + (curY - startY)}", * ToastLength.Short) * .Show();*/ if (!moved) { OnGestureEvent?.Invoke(5); } else { OnMove(startX, startY, curX, curY, timeStart, timeEnd); } FadeVisibility(false, iv); //iv.Visibility = ViewStates.Invisible; break; } }; }