Skip to content

Commit

Permalink
Fixed bugs in swiping for single items
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Muenzer committed Jan 26, 2016
1 parent 3aefad3 commit 78b9c86
Show file tree
Hide file tree
Showing 2 changed files with 124 additions and 60 deletions.
177 changes: 117 additions & 60 deletions library/src/main/java/com/hudomju/swipe/SwipeToDismissTouchListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ public class RowContainer {

SwipeDirection direction = SwipeDirection.NONE;

boolean animationInProgress = false;

public RowContainer(ViewGroup container) {
this.container = container;
dataContainer = container.findViewWithTag("dataContainer");
Expand Down Expand Up @@ -322,12 +324,15 @@ public boolean onTouch(View view, MotionEvent motionEvent) {
boolean dataContainerHasBeenDismissed = (mPendingDismiss != null)
&& mPendingDismiss.position == mRecyclerView.getChildPosition(child)
&& (mPendingDismiss.rowContainer.dismissState == DismissState.HAS_BEEN_DISMISSED);
mRowContainer = new RowContainer((ViewGroup) child);

if (dataContainerHasBeenDismissed) {
mRowContainer.dismissState = DismissState.HAS_BEEN_DISMISSED;
} else {
mRowContainer.dismissState = DismissState.NONE;
if (mRowContainer == null) {
mRowContainer = new RowContainer((ViewGroup) child);

if (dataContainerHasBeenDismissed) {
mRowContainer.dismissState = DismissState.HAS_BEEN_DISMISSED;
} else {
mRowContainer.dismissState = DismissState.NONE;
}
}

break;
Expand All @@ -341,6 +346,8 @@ public boolean onTouch(View view, MotionEvent motionEvent) {
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(motionEvent);
}

// return true;
return false;
}

Expand All @@ -353,20 +360,10 @@ public boolean onTouch(View view, MotionEvent motionEvent) {
// cancel
mRowContainer.dismissState = DismissState.NONE;

ViewPropertyAnimator viewPropertyAnimator = mRowContainer.getCurrentSwipingView().animate().translationX(0);
if (mAlphaAnimationEnabled) {
viewPropertyAnimator.alpha(1);
}
viewPropertyAnimator.setDuration(mAnimationTime).setListener(null);
setRowTransition(true, 0);
}

mVelocityTracker.recycle();
mVelocityTracker = null;
mDownX = 0;
mDownY = 0;
mRowContainer = null;
mDownPosition = ListView.INVALID_POSITION;
mSwiping = false;
tearDownRowContainerData();
break;
}

Expand All @@ -385,48 +382,42 @@ public boolean onTouch(View view, MotionEvent motionEvent) {
boolean dismissRight = false;

if (Math.abs(deltaX) > mViewWidth / 2 && mSwiping) {
dismiss = true;
dismissRight = deltaX > 0;

if ((dismissRight && (mRowContainer.leftCanDismissState == CanDismissState.TRUE))
|| (!dismissRight && (mRowContainer.rightCanDismissState == CanDismissState.TRUE))) {
dismiss = true;
}
} else if (mMinFlingVelocity <= absVelocityX && absVelocityX <= mMaxFlingVelocity && absVelocityY < absVelocityX && mSwiping) {
// dismiss only if flinging in the same direction as dragging
dismiss = (velocityX < 0) == (deltaX < 0);
dismissRight = mVelocityTracker.getXVelocity() > 0;

if ((dismissRight && (mRowContainer.leftCanDismissState == CanDismissState.TRUE))
|| (!dismissRight && (mRowContainer.rightCanDismissState == CanDismissState.TRUE))) {
dismiss = (velocityX < 0) == (deltaX < 0);
}
}

if (dismiss && mDownPosition != ListView.INVALID_POSITION) {
// dismiss
final RowContainer downView = mRowContainer; // mDownView gets null'd before animation ends
final int downPosition = mDownPosition;

ViewPropertyAnimator viewPropertyAnimator = mRowContainer
.getCurrentSwipingView()
.animate()
.translationX(dismissRight ? mViewWidth : -mViewWidth);
if (mAlphaAnimationEnabled) {
viewPropertyAnimator.alpha(0);
}
viewPropertyAnimator.setDuration(mAnimationTime).setListener(new AnimatorListenerAdapter() {
int translationX = dismissRight ? mViewWidth : -mViewWidth;
AnimatorListenerAdapter listener = new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
tearDownRowContainerData();
performDismiss(downView, downPosition);
}
});
};

setRowTransition(true, translationX, 1, listener);
} else {
// cancel
ViewPropertyAnimator viewPropertyAnimator = mRowContainer.getCurrentSwipingView().animate().translationX(0);
if (mAlphaAnimationEnabled) {
viewPropertyAnimator.alpha(1);
}
viewPropertyAnimator.setDuration(mAnimationTime).setListener(null);
setRowTransition(true, 0);
}

mVelocityTracker.recycle();
mVelocityTracker = null;
mDownX = 0;
mDownY = 0;
mRowContainer = null;
mDownPosition = ListView.INVALID_POSITION;
mSwiping = false;
break;
}

Expand All @@ -452,55 +443,121 @@ public void onAnimationEnd(Animator animation) {
}

if (mSwiping) {
mRowContainer.dismissState = DismissState.UP_TO_DISMISS;

// Which direction is the user swiping
if (deltaX > 0) {
mRowContainer.direction = SwipeDirection.FROM_LEFT;
mRowContainer.leftUpToDismissContainer.setVisibility(View.VISIBLE);
mRowContainer.rightUpToDismissContainer.setVisibility(View.GONE);
} else {
mRowContainer.direction = SwipeDirection.FROM_RIGHT;
mRowContainer.rightUpToDismissContainer.setVisibility(View.VISIBLE);
mRowContainer.leftUpToDismissContainer.setVisibility(View.GONE);
}

// Valid click happened before
if ((mDownPosition != ListView.INVALID_POSITION) || (mRowContainer.direction != SwipeDirection.NONE)) {

// Set canDismiss states just in time
if ((mRowContainer.leftCanDismissState == CanDismissState.NONE)
&& (mRowContainer.direction == SwipeDirection.FROM_LEFT)) {
mRowContainer.leftCanDismissState = mCallbacks.canDismiss(mDownPosition, mRowContainer.direction) ? CanDismissState.TRUE
: CanDismissState.FALSE;

if (mRowContainer.leftCanDismissState == CanDismissState.FALSE) {
mRowContainer = null;
break;
}
} else if ((mRowContainer.rightCanDismissState == CanDismissState.NONE)
&& (mRowContainer.direction == SwipeDirection.FROM_RIGHT)) {
mRowContainer.rightCanDismissState = mCallbacks.canDismiss(mDownPosition, mRowContainer.direction) ? CanDismissState.TRUE
: CanDismissState.FALSE;

if (mRowContainer.rightCanDismissState == CanDismissState.FALSE) {
mRowContainer = null;
break;
}
}
}

mRowContainer.getCurrentSwipingView().setTranslationX(deltaX - mSwipingSlop);
// Comment line below to disable alpha fade on initial swipe
if (((mRowContainer.leftCanDismissState == CanDismissState.TRUE) && (deltaX > 0))
|| ((mRowContainer.rightCanDismissState == CanDismissState.TRUE) && (deltaX < 0))) {
if (deltaX > 0) {
mRowContainer.leftUpToDismissContainer.setVisibility(View.VISIBLE);
mRowContainer.rightUpToDismissContainer.setVisibility(View.GONE);
} else {
mRowContainer.rightUpToDismissContainer.setVisibility(View.VISIBLE);
mRowContainer.leftUpToDismissContainer.setVisibility(View.GONE);
}

if (mAlphaAnimationEnabled) {
mRowContainer.getCurrentSwipingView().setAlpha(Math.max(0f, Math.min(1f, 1f - 2f * Math.abs(deltaX) / mViewWidth)));
float translationX = deltaX - mSwipingSlop;
float alpha = Math.max(0f, Math.min(1f, 1f - 2f * Math.abs(deltaX) / mViewWidth));
setRowTransition(false, translationX, alpha);
}

return true;
}

break;
}
}
return false;
}

private void setRowTransition(boolean animate, float translationX) {
setRowTransition(animate, translationX, 1);
}

private void setRowTransition(boolean animate, float translationX, float alpha) {
AnimatorListenerAdapter listener = new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
super.onAnimationStart(animation);

if (mRowContainer != null) {
mRowContainer.animationInProgress = true;
}
}

@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);

if (mRowContainer != null) {
mRowContainer.animationInProgress = false;
}

tearDownRowContainerData();
}
};

setRowTransition(animate, translationX, alpha, listener);
}

private void setRowTransition(boolean animate, float translationX, float alpha, @NonNull AnimatorListenerAdapter listener) {
if (mRowContainer == null || mRowContainer.getCurrentSwipingView() == null) {
return;
}

if (!mRowContainer.animationInProgress) {
View currentSwipingView = mRowContainer.getCurrentSwipingView();
if (animate) {
ViewPropertyAnimator viewPropertyAnimator = currentSwipingView.animate();
viewPropertyAnimator.setDuration(mAnimationTime);
viewPropertyAnimator.translationX(translationX);

if (mAlphaAnimationEnabled) {
viewPropertyAnimator.alpha(alpha);
}
viewPropertyAnimator.setListener(listener);
} else {
currentSwipingView.setTranslationX(translationX);

if (mAlphaAnimationEnabled) {
currentSwipingView.setAlpha(alpha);
}
}
}
}

private void tearDownRowContainerData() {
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
}

mVelocityTracker = null;
mDownX = 0;
mDownY = 0;
mRowContainer = null;
mDownPosition = ListView.INVALID_POSITION;
mSwiping = false;
}

class PendingDismissData implements Comparable<PendingDismissData> {
public int position;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ private void init(ListView listView) {
@Override
public boolean canDismiss(int position, SwipeToDismissTouchListener.SwipeDirection direction) {
return true;
/*
if (direction == SwipeToDismissTouchListener.SwipeDirection.FROM_LEFT) {
return true;
} else {
return false;
}
*/
}

@Override
Expand Down

0 comments on commit 78b9c86

Please sign in to comment.