diff options
Diffstat (limited to 'Xamarin.Forms.Platform.Android/PlatformRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.Android/PlatformRenderer.cs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.Android/PlatformRenderer.cs b/Xamarin.Forms.Platform.Android/PlatformRenderer.cs new file mode 100644 index 00000000..4fbc0293 --- /dev/null +++ b/Xamarin.Forms.Platform.Android/PlatformRenderer.cs @@ -0,0 +1,81 @@ +using System; +using Android.App; +using Android.Content; +using Android.Views; +using Android.Widget; + +namespace Xamarin.Forms.Platform.Android +{ + internal class PlatformRenderer : ViewGroup + { + readonly IPlatformLayout _canvas; + Point _downPosition; + + DateTime _downTime; + + public PlatformRenderer(Context context, IPlatformLayout canvas) : base(context) + { + _canvas = canvas; + Focusable = true; + FocusableInTouchMode = true; + } + + public override bool DispatchTouchEvent(MotionEvent e) + { + if (e.Action == MotionEventActions.Down) + { + _downTime = DateTime.UtcNow; + _downPosition = new Point(e.RawX, e.RawY); + } + + if (e.Action != MotionEventActions.Up) + return base.DispatchTouchEvent(e); + + global::Android.Views.View currentView = ((Activity)Context).CurrentFocus; + bool result = base.DispatchTouchEvent(e); + + do + { + if (!(currentView is EditText)) + break; + + global::Android.Views.View newCurrentView = ((Activity)Context).CurrentFocus; + + if (currentView != newCurrentView) + break; + + double distance = _downPosition.Distance(new Point(e.RawX, e.RawY)); + + if (distance > Context.ToPixels(20) || DateTime.UtcNow - _downTime > TimeSpan.FromMilliseconds(200)) + break; + + var location = new int[2]; + currentView.GetLocationOnScreen(location); + + float x = e.RawX + currentView.Left - location[0]; + float y = e.RawY + currentView.Top - location[1]; + + var rect = new Rectangle(currentView.Left, currentView.Top, currentView.Width, currentView.Height); + + if (rect.Contains(x, y)) + break; + + Context.HideKeyboard(currentView); + RequestFocus(); + } while (false); + + return result; + } + + protected override void OnLayout(bool changed, int l, int t, int r, int b) + { + SetMeasuredDimension(r - l, b - t); + _canvas?.OnLayout(changed, l, t, r, b); + } + + protected override void OnMeasure(int widthMeasureSpec, int heightMeasureSpec) + { + SetMeasuredDimension(MeasureSpec.GetSize(widthMeasureSpec), MeasureSpec.GetSize(heightMeasureSpec)); + } + } +}
\ No newline at end of file |