Browse Source

ScrollGestureRecognizer ends its current fling gesture (touch or pen) if ScrollGestureEventArgs is no longer handled by the Presenter.

pull/9968/head
Martijn Sneijders 4 years ago
parent
commit
95ccb0c9c6
  1. 9
      src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs
  2. 4
      src/Avalonia.Base/Input/ScrollGestureEventArgs.cs
  3. 2
      src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

9
src/Avalonia.Base/Input/GestureRecognizers/ScrollGestureRecognizer.cs

@ -189,7 +189,14 @@ namespace Avalonia.Input.GestureRecognizers
var speed = _inertia * Math.Pow(0.15, st.Elapsed.TotalSeconds);
var distance = speed * elapsedSinceLastTick.TotalSeconds;
_target!.RaiseEvent(new ScrollGestureEventArgs(_gestureId, distance));
var scrollGestureEventArgs = new ScrollGestureEventArgs(_gestureId, distance);
_target!.RaiseEvent(scrollGestureEventArgs);
if (!scrollGestureEventArgs.Handled || scrollGestureEventArgs.ShouldEndScrollGesture)
{
EndGesture();
return false;
}
// EndGesture using InertialScrollSpeedEnd only in the direction of scrolling
if (CanVerticallyScroll && CanHorizontallyScroll && Math.Abs(speed.X) < InertialScrollSpeedEnd && Math.Abs(speed.Y) <= InertialScrollSpeedEnd)

4
src/Avalonia.Base/Input/ScrollGestureEventArgs.cs

@ -6,6 +6,10 @@ namespace Avalonia.Input
{
public int Id { get; }
public Vector Delta { get; }
/// <summary>
/// When set the ScrollGestureRecognizer should stop its current active scroll gesture.
/// </summary>
public bool ShouldEndScrollGesture { get; set; }
private static int _nextId = 1;
public static int GetNextFreeId() => _nextId++;

2
src/Avalonia.Controls/Presenters/ScrollContentPresenter.cs

@ -428,6 +428,8 @@ namespace Avalonia.Controls.Presenters
Offset = newOffset;
e.Handled = !IsScrollChainingEnabled || offsetChanged;
e.ShouldEndScrollGesture = !IsScrollChainingEnabled && !offsetChanged;
}
}

Loading…
Cancel
Save