Skip to content

Instantly share code, notes, and snippets.

@bbenetskyy
Created December 31, 2021 09:07
Show Gist options
  • Save bbenetskyy/8d7053bd2762670d0de8668e107af152 to your computer and use it in GitHub Desktop.
Save bbenetskyy/8d7053bd2762670d0de8668e107af152 to your computer and use it in GitHub Desktop.
#region Public Methods
public override bool OnTouchEvent(MotionEvent e)
{
var draggView = Element as DraggableView;
float x = e.RawX;
float y = e.RawY;
switch (e.Action)
{
case MotionEventActions.Down:
_deltaX = x - GetX();
_deltaY = y - GetY();
break;
case MotionEventActions.Move:
if (_touchedDown)
{
var newX = x - _deltaX;
var newY = y - _deltaY;
var limitArea = draggView.LimitArea;
var density = Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Density;
if (limitArea == null)
{
SetX(newX);
SetY(newY);
}
else
{
var width = Element.Width * density;
var height = Element.Height * density;
var limitWidth = limitArea.Width * density;
var limitHeight = limitArea.Height * density;
var limitX = limitArea.X * density;
var limitY = limitArea.Y * density;
var resX = newX;
var resY = newY;
if (Math.Max(limitX, resX) > limitX
&& Math.Min(limitX + limitWidth, resX + width) < limitX + limitWidth)
SetX(resX);
if (Math.Max(limitY, resY) > limitY
&& Math.Min(limitY + limitHeight, resY + height) < limitY + limitHeight)
SetY(newY);
}
draggView.NewX = newX / density;
draggView.NewY = newY / density;
}
break;
case MotionEventActions.Up:
_touchedDown = false;
break;
case MotionEventActions.Cancel:
_touchedDown = false;
break;
}
return base.OnTouchEvent(e);
}
#endregion Public Methods
#region Private Methods
private void CancellationToken(Action action)
{
if (action != null)
{
Interlocked.Exchange(ref _throttleCts, new CancellationTokenSource()).Cancel();
Task.Delay(TimeSpan.FromMilliseconds(100), _throttleCts.Token) // throttle time
.ContinueWith(
delegate
{
action();
},
System.Threading.CancellationToken.None,
TaskContinuationOptions.OnlyOnRanToCompletion,
TaskScheduler.FromCurrentSynchronizationContext());
}
}
#endregion Private Methods
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment