private async Task HandleTouchCompleted() { if (itemIndex >= ItemsSource.Count) { return; } var topCard = CardStack.Children[numberOfCards - 1]; var backCard = CardStack.Children[numberOfCards - 2]; // Check if card has been dragged far enough to trigger action if (Math.Abs(cardDistance) >= CardMoveDistance) { // Move card off the screen await topCard.TranslateTo(cardDistance > 0?this.Width : -this.Width, 0, animationLength / 2, Easing.SpringOut); topCard.IsVisible = false; // Fire events if (cardDistance > 0) { Swiped?.Invoke(this, new SwipedEventArgs(ItemsSource[itemIndex], SwipeDirection.Right)); if (SwipedRightCommand != null && SwipedRightCommand.CanExecute(ItemsSource[itemIndex])) { SwipedRightCommand.Execute(ItemsSource[itemIndex]); } } else { Swiped?.Invoke(this, new SwipedEventArgs(ItemsSource[itemIndex], SwipeDirection.Left)); if (SwipedLeftCommand != null && SwipedLeftCommand.CanExecute(ItemsSource[itemIndex])) { SwipedLeftCommand.Execute(ItemsSource[itemIndex]); } } // Next card itemIndex++; ShowNextCard(); } else { // Move card back to the center var traslateAnmimation = topCard.TranslateTo((-topCard.X), -topCard.Y, animationLength, Easing.SpringOut); var rotateAnimation = topCard.RotateTo(0, animationLength, Easing.SpringOut); // Scale the back card down var scaleAnimation = backCard.ScaleTo(defaultSubcardScale, animationLength, Easing.SpringOut); // Run all animations from above simultaneiously await Task.WhenAll(new List <Task> { traslateAnmimation, rotateAnimation, scaleAnimation }); } if (itemIndex < ItemsSource.Count) { FinishedDragging?.Invoke(this, new DraggingEventArgs(ItemsSource[itemIndex])); } }
private async Task HandleTouchCompleted() { if (_itemIndex >= ItemsSource.Count || !_isDragging) { return; } _lastX = 0; _isDragging = false; var topCard = CardStack.Children[NumberOfCards - 1]; var backCard = CardStack.Children[NumberOfCards - 2]; if (Math.Abs(_cardDistance) >= CardMoveDistance) { await topCard.TranslateTo(_cardDistance > 0?Width * 2 : -Width * 2, 0, DefaultAnimationLength, Easing.SinIn); topCard.IsVisible = false; if (_cardDistance > 0) { Swiped?.Invoke(this, new SwipedEventArgs(ItemsSource[_itemIndex], SwipeDirection.Right)); if (SwipedRightCommand != null && SwipedRightCommand.CanExecute(ItemsSource[_itemIndex])) { SwipedRightCommand.Execute(ItemsSource[_itemIndex]); } } else { Swiped?.Invoke(this, new SwipedEventArgs(ItemsSource[_itemIndex], SwipeDirection.Left)); if (SwipedLeftCommand != null && SwipedLeftCommand.CanExecute(ItemsSource[_itemIndex])) { SwipedLeftCommand.Execute(ItemsSource[_itemIndex]); } } _itemIndex++; ShowNextCard(); } else { await Task.WhenAll( topCard.TranslateTo((-topCard.X), -topCard.Y, DefaultAnimationLength, Easing.SpringOut), topCard.RotateTo(0, DefaultAnimationLength, Easing.SpringOut), backCard.ScaleTo(_defaultSubcardScale, DefaultAnimationLength, Easing.SpringOut), backCard.TranslateTo(_defaultSubcardTranslationX, 0, DefaultAnimationLength, Easing.SpringOut), backCard.FadeTo(_defaultSubcardOpacity, DefaultAnimationLength, Easing.SpringOut) ); } _cardDistance = 0; if (_itemIndex < ItemsSource.Count) { FinishedDragging?.Invoke(this, new DraggingEventArgs(ItemsSource[_itemIndex], _cardDistance)); } }
async Task HandleTouchCompleted() { if (itemIndex >= ItemsSource.Count) { await Application.Current.MainPage.DisplayAlert("SwipeCard Demo", "Sorry there is no card left to swipe.", "OK"); return; } var topCard = CardStack.Children[numberOfCards - 1]; var backCard = CardStack.Children[numberOfCards - 2]; // Check if card has been dragged far enough to trigger action if (Math.Abs(cardDistance) >= CardMoveDistance) { // Move card off the screen await topCard.TranslateTo(cardDistance > 0?this.Width * 2 : -this.Width * 2, 0, defaultAnimationLength, Easing.SinIn); topCard.IsVisible = false; // Fire events if (cardDistance > 0) { Swiped?.Invoke(this, new SwipedEventArgs(ItemsSource[itemIndex], SwipeDirection.Right)); if (SwipedRightCommand != null && SwipedRightCommand.CanExecute(ItemsSource[itemIndex])) { SwipedRightCommand.Execute(ItemsSource[itemIndex]); } } else { Swiped?.Invoke(this, new SwipedEventArgs(ItemsSource[itemIndex], SwipeDirection.Left)); if (SwipedLeftCommand != null && SwipedLeftCommand.CanExecute(ItemsSource[itemIndex])) { SwipedLeftCommand.Execute(ItemsSource[itemIndex]); } } // Next card itemIndex++; ShowNextCard(); } else { // Run animations simultaniously await Task.WhenAll( // Move card back to the center topCard.TranslateTo((-topCard.X), -topCard.Y, defaultAnimationLength, Easing.SpringOut), topCard.RotateTo(0, defaultAnimationLength, Easing.SpringOut), // Scale the back card down backCard.ScaleTo(defaultSubcardScale, defaultAnimationLength, Easing.SpringOut) ); } if (itemIndex < ItemsSource.Count) { FinishedDragging?.Invoke(this, new DraggingEventArgs(ItemsSource[itemIndex])); } }