diff options
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers/AHorizontalScrollView.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/Renderers/AHorizontalScrollView.cs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/AHorizontalScrollView.cs b/Xamarin.Forms.Platform.Android/Renderers/AHorizontalScrollView.cs new file mode 100644 index 00000000..6a64a35b --- /dev/null +++ b/Xamarin.Forms.Platform.Android/Renderers/AHorizontalScrollView.cs @@ -0,0 +1,62 @@ +using Android.Content; +using Android.Views; +using Android.Widget; + +namespace Xamarin.Forms.Platform.Android +{ + public class AHorizontalScrollView : HorizontalScrollView + { + readonly ScrollViewRenderer _renderer; + + public AHorizontalScrollView(Context context, ScrollViewRenderer renderer) : base(context) + { + _renderer = renderer; + } + + internal bool IsBidirectional { get; set; } + + public override bool OnInterceptTouchEvent(MotionEvent ev) + { + // set the start point for the bidirectional scroll; + // Down is swallowed by other controls, so we'll just sneak this in here without actually preventing + // other controls from getting the event. + if (IsBidirectional && ev.Action == MotionEventActions.Down) + { + _renderer.LastY = ev.RawY; + _renderer.LastX = ev.RawX; + } + + return base.OnInterceptTouchEvent(ev); + } + + public override bool OnTouchEvent(MotionEvent ev) + { + // The nested ScrollViews will allow us to scroll EITHER vertically OR horizontally in a single gesture. + // This will allow us to also scroll diagonally. + // We'll fall through to the base event so we still get the fling from the ScrollViews. + // We have to do this in both ScrollViews, since a single gesture will be owned by one or the other, depending + // on the initial direction of movement (i.e., horizontal/vertical). + if (IsBidirectional) + { + float dX = _renderer.LastX - ev.RawX; + float dY = _renderer.LastY - ev.RawY; + _renderer.LastY = ev.RawY; + _renderer.LastX = ev.RawX; + if (ev.Action == MotionEventActions.Move) + { + var parent = (global::Android.Widget.ScrollView)Parent; + parent.ScrollBy(0, (int)dY); + ScrollBy((int)dX, 0); + } + } + return base.OnTouchEvent(ev); + } + + protected override void OnScrollChanged(int l, int t, int oldl, int oldt) + { + base.OnScrollChanged(l, t, oldl, oldt); + + _renderer.UpdateScrollPosition(Forms.Context.FromPixels(l), Forms.Context.FromPixels(t)); + } + } +}
\ No newline at end of file |