GesturedContentPageRenderer.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. using System;
  2. using Android.Views;
  3. using XamarinForms_CustomRenders.CustomPages;
  4. using XamarinForms_CustomRenders.Droid.Pages;
  5. using Xamarin.Forms;
  6. using Xamarin.Forms.Platform.Android;
  7. [assembly: ExportRenderer(typeof(GesturedContentPage), typeof(GesturedContentPageRenderer))]
  8. namespace XamarinForms_CustomRenders.Droid.Pages
  9. {
  10. public class GesturedContentPageRenderer : PageRenderer
  11. {
  12. public GesturedContentPageRenderer()
  13. : base()
  14. {
  15. }
  16. GestureDetector _gestureDetector;
  17. GesturedContentPage _page;
  18. protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
  19. {
  20. base.OnElementChanged(e);
  21. _page = (e.NewElement) as GesturedContentPage;
  22. _gestureDetector = new GestureDetector(new InternalGestureCapture(_page));
  23. }
  24. public override bool OnTouchEvent(MotionEvent e)
  25. {
  26. base.OnTouchEvent(e);
  27. _gestureDetector.OnTouchEvent(e);
  28. return true;
  29. }
  30. public class InternalGestureCapture : Java.Lang.Object, GestureDetector.IOnGestureListener
  31. {
  32. const int MinSwipeDistance = 120;
  33. const int MaxSwipeOffPath = 250;
  34. const int SwipeThreadsholdVelocity = 200;
  35. GesturedContentPage _page;
  36. public InternalGestureCapture(GesturedContentPage page)
  37. {
  38. _page = page;
  39. }
  40. public bool OnDown(MotionEvent e)
  41. {
  42. return true;
  43. }
  44. public bool OnFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
  45. {
  46. // Right to left swipe
  47. if (e1.GetX() - e2.GetX() > MinSwipeDistance
  48. && Math.Abs(velocityX) > SwipeThreadsholdVelocity)
  49. {
  50. if (_page.CaptureSwipeRightToLeft)
  51. _page.OnSwipeRightToLeft();
  52. }
  53. // Left to right swipe
  54. else if (e2.GetX() - e1.GetX() > MinSwipeDistance
  55. && Math.Abs(velocityX) > SwipeThreadsholdVelocity)
  56. {
  57. if (_page.CaptureSwipeLeftToRight)
  58. _page.OnSwipeLeftToRight();
  59. }
  60. if (e1.GetY() - e2.GetY() > MinSwipeDistance
  61. && Math.Abs(velocityY) > SwipeThreadsholdVelocity)
  62. {
  63. if (_page.CaptureSwipeBottomToTop)
  64. _page.OnSwipeBottomToTop();
  65. }
  66. // Left to right swipe
  67. else if (e2.GetY() - e1.GetY() > MinSwipeDistance
  68. && Math.Abs(velocityY) > SwipeThreadsholdVelocity)
  69. {
  70. if (_page.CaptureSwipeTopToBottom)
  71. _page.OnSwipeTopToBottom();
  72. }
  73. return true;
  74. }
  75. public bool OnSingleTapUp(MotionEvent e)
  76. {
  77. if (_page.CaptureTap)
  78. _page.OnTap();
  79. return true;
  80. }
  81. public void OnLongPress(MotionEvent e)
  82. {
  83. if (_page.CaptureLongTap)
  84. _page.OnLongTap();
  85. }
  86. public bool OnScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
  87. {
  88. return false;
  89. }
  90. public void OnShowPress(MotionEvent e)
  91. {
  92. }
  93. }
  94. }
  95. }