Created
December 31, 2021 09:07
-
-
Save bbenetskyy/8d7053bd2762670d0de8668e107af152 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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