private void FrameOnTap(object sender, EventArgs e) { y = BottomSheetFrame.TranslationY; if (Math.Abs(y) < Height / 10) { var finalTranslation = Math.Max(Math.Min(0, -1000), -Math.Abs(GetClosestLockState(_detailsHeight + 15))); BottomSheetFrame.TranslateTo(BottomSheetFrame.X, finalTranslation, 350, Easing.SpringIn); } else { BottomSheetFrame.TranslateTo(BottomSheetFrame.X, 0, 350, Easing.SpringOut); } y = BottomSheetFrame.TranslationY; }
private void FrameOnPanUpdated(object sender, PanUpdatedEventArgs e) { // Source: https://github.com/rlingineni/Forms-BottomSheet/blob/master/XamJuly/MainPage.xaml.cs // Handle the pan switch (e.StatusType) { case GestureStatus.Running: // Translate and ensure we don't y + e.TotalY pan beyond the wrapped user interface element bounds. var translateY = Math.Max(Math.Min(0, y + e.TotalY), -Math.Abs((Height * .25) - Height)); BottomSheetFrame.TranslateTo(BottomSheetFrame.X, translateY, 20); break; case GestureStatus.Completed: // Store the translation applied during the pan y = BottomSheetFrame.TranslationY; //at the end of the event - snap to the closest location var finalTranslation = Math.Max(Math.Min(0, -1000), -Math.Abs(GetClosestLockState(e.TotalY + y))); //depending on Swipe Up or Down - change the snapping animation if (isSwipeUp(e)) { BottomSheetFrame.TranslateTo(BottomSheetFrame.X, finalTranslation, 250, Easing.SpringIn); } else { BottomSheetFrame.TranslateTo(BottomSheetFrame.X, finalTranslation, 250, Easing.SpringOut); } y = BottomSheetFrame.TranslationY; break; } }