diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/Duration.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/Duration.java new file mode 100644 index 00000000..ab7c3524 --- /dev/null +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/Duration.java @@ -0,0 +1,22 @@ +package com.yuyakaido.android.cardstackview; + +public enum Duration { + Fast(100), + Normal(200), + Slow(500); + + public final int duration; + + Duration(int duration) { + this.duration = duration; + } + + public static Duration fromVelocity(int velocity) { + if (velocity < 1000) { + return Slow; + } else if (velocity < 5000) { + return Normal; + } + return Fast; + } +} diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/RewindAnimationSetting.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/RewindAnimationSetting.java index 7c13049a..9b7d5f02 100644 --- a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/RewindAnimationSetting.java +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/RewindAnimationSetting.java @@ -38,7 +38,7 @@ public Interpolator getInterpolator() { public static class Builder { private Direction direction = Direction.Bottom; - private int duration = 200; + private int duration = Duration.Normal.duration; private Interpolator interpolator = new DecelerateInterpolator(); public RewindAnimationSetting.Builder setDirection(Direction direction) { diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/SwipeAnimationSetting.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/SwipeAnimationSetting.java index 0b5ac57c..241b3a84 100644 --- a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/SwipeAnimationSetting.java +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/SwipeAnimationSetting.java @@ -38,7 +38,7 @@ public Interpolator getInterpolator() { public static class Builder { private Direction direction = Direction.Right; - private int duration = 200; + private int duration = Duration.Normal.duration; private Interpolator interpolator = new AccelerateInterpolator(); public Builder setDirection(Direction direction) { diff --git a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSnapHelper.java b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSnapHelper.java index cc622154..601288a0 100644 --- a/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSnapHelper.java +++ b/cardstackview/src/main/java/com/yuyakaido/android/cardstackview/internal/CardStackSnapHelper.java @@ -7,9 +7,14 @@ import android.view.View; import com.yuyakaido.android.cardstackview.CardStackLayoutManager; +import com.yuyakaido.android.cardstackview.Duration; +import com.yuyakaido.android.cardstackview.SwipeAnimationSetting; public class CardStackSnapHelper extends SnapHelper { + private int velocityX = 0; + private int velocityY = 0; + @Nullable @Override public int[] calculateDistanceToFinalSnap( @@ -25,10 +30,22 @@ public int[] calculateDistanceToFinalSnap( CardStackSetting setting = manager.getCardStackSetting(); float horizontal = Math.abs(x) / (float) targetView.getWidth(); float vertical = Math.abs(y) / (float) targetView.getHeight(); - if (setting.swipeThreshold < horizontal || setting.swipeThreshold < vertical) { + Duration duration = Duration.fromVelocity(velocityY < velocityX ? velocityX : velocityY); + if (duration == Duration.Fast || setting.swipeThreshold < horizontal || setting.swipeThreshold < vertical) { CardStackState state = manager.getCardStackState(); if (setting.directions.contains(state.getDirection())) { state.targetPosition = state.topPosition + 1; + + SwipeAnimationSetting swipeAnimationSetting = new SwipeAnimationSetting.Builder() + .setDirection(setting.swipeAnimationSetting.getDirection()) + .setDuration(duration.duration) + .setInterpolator(setting.swipeAnimationSetting.getInterpolator()) + .build(); + manager.setSwipeAnimationSetting(swipeAnimationSetting); + + this.velocityX = 0; + this.velocityY = 0; + CardStackSmoothScroller scroller = new CardStackSmoothScroller(CardStackSmoothScroller.ScrollType.ManualSwipe, manager); scroller.setTargetPosition(manager.getTopPosition()); manager.startSmoothScroll(scroller); @@ -43,7 +60,6 @@ public int[] calculateDistanceToFinalSnap( manager.startSmoothScroll(scroller); } } - } } return new int[2]; @@ -73,6 +89,8 @@ public int findTargetSnapPosition( int velocityX, int velocityY ) { + this.velocityX = Math.abs(velocityX); + this.velocityY = Math.abs(velocityY); if (layoutManager instanceof CardStackLayoutManager) { CardStackLayoutManager manager = (CardStackLayoutManager) layoutManager; return manager.getTopPosition();