From 05399d908f24a6d5dfddb5fb1fed369c631811c2 Mon Sep 17 00:00:00 2001 From: Ludovic Date: Sun, 7 Jan 2018 15:03:28 +0100 Subject: [PATCH 1/2] Allow scroll by the amount of days setted in NumberOfVisibleDays --- .../java/com/alamkanak/weekview/WeekView.java | 103 +++++++++++++----- .../weekview/sample/BaseActivity.java | 3 + 2 files changed, 77 insertions(+), 29 deletions(-) diff --git a/library/src/main/java/com/alamkanak/weekview/WeekView.java b/library/src/main/java/com/alamkanak/weekview/WeekView.java index 757b71f3f..20a910829 100755 --- a/library/src/main/java/com/alamkanak/weekview/WeekView.java +++ b/library/src/main/java/com/alamkanak/weekview/WeekView.java @@ -179,6 +179,11 @@ private enum Direction { private ScrollListener mScrollListener; private AddEventClickListener mAddEventClickListener; + //Scroll by amount of days desired functionnality + private boolean mIsCustomScrollableAmountsOfDaysEnabled = false; + private float startOriginForScroll = 0; + private float sizeOfScrollableView; + private final GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() { @Override @@ -279,7 +284,9 @@ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float ve switch (mCurrentFlingDirection) { case LEFT: case RIGHT: - mScroller.fling((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (velocityX * mXScrollingSpeed), 0, (int) getXMinLimit(), (int) getXMaxLimit(), (int) getYMinLimit(), (int) getYMaxLimit()); + if(!mIsCustomScrollableAmountsOfDaysEnabled) { + mScroller.fling((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (velocityX * mXScrollingSpeed), 0, (int) getXMinLimit(), (int) getXMaxLimit(), (int) getYMinLimit(), (int) getYMaxLimit()); + } break; case VERTICAL: mScroller.fling((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, 0, (int) velocityY, (int) getXMinLimit(), (int) getXMaxLimit(), (int) getYMinLimit(), (int) getYMaxLimit()); @@ -1643,6 +1650,7 @@ public void setNumberOfVisibleDays(int numberOfVisibleDays) { this.mNumberOfVisibleDays = numberOfVisibleDays; resetHomeDate(); mCurrentOrigin.x = 0; + startOriginForScroll = mCurrentOrigin.x; mCurrentOrigin.y = 0; invalidate(); } @@ -2418,40 +2426,72 @@ public boolean onTouchEvent(MotionEvent event) { } private void goToNearestOrigin(){ - double leftDays = mCurrentOrigin.x / (mWidthPerDay + mColumnGap); - - if (mCurrentFlingDirection != Direction.NONE) { - // snap to nearest day - leftDays = Math.round(leftDays); - } else if (mCurrentScrollDirection == Direction.LEFT) { - // snap to last day - leftDays = Math.floor(leftDays); - } else if (mCurrentScrollDirection == Direction.RIGHT) { - // snap to next day - leftDays = Math.ceil(leftDays); - } else { - // snap to nearest day - leftDays = Math.round(leftDays); - } + if(!mIsCustomScrollableAmountsOfDaysEnabled) { + double leftDays = mCurrentOrigin.x / (mWidthPerDay + mColumnGap); - int nearestOrigin = (int) (mCurrentOrigin.x - leftDays * (mWidthPerDay + mColumnGap)); - boolean mayScrollHorizontal = mCurrentOrigin.x - nearestOrigin < getXMaxLimit() - && mCurrentOrigin.x - nearestOrigin > getXMinLimit(); + if (mCurrentFlingDirection != Direction.NONE) { + // snap to nearest day + leftDays = Math.round(leftDays); + } else if (mCurrentScrollDirection == Direction.LEFT) { + // snap to last day + leftDays = Math.floor(leftDays); + } else if (mCurrentScrollDirection == Direction.RIGHT) { + // snap to next day + leftDays = Math.ceil(leftDays); + } else { + // snap to nearest day + leftDays = Math.round(leftDays); + } - if (mayScrollHorizontal) { - mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, - nearestOrigin, 0); - ViewCompat.postInvalidateOnAnimation(WeekView.this); - } + int nearestOrigin = (int) (mCurrentOrigin.x - leftDays * (mWidthPerDay + mColumnGap)); + boolean mayScrollHorizontal = mCurrentOrigin.x - nearestOrigin < getXMaxLimit() + && mCurrentOrigin.x - nearestOrigin > getXMinLimit(); + + if (mayScrollHorizontal) { + mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, -nearestOrigin, 0); + ViewCompat.postInvalidateOnAnimation(WeekView.this); + } + + if (nearestOrigin != 0 && mayScrollHorizontal) { + // Stop current animation. + mScroller.forceFinished(true); + // Snap to date. + mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, -nearestOrigin, 0, (int) (Math.abs(nearestOrigin) / mWidthPerDay * mScrollDuration)); + ViewCompat.postInvalidateOnAnimation(WeekView.this); + } + // Reset scrolling and fling direction. + mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE; + }else { + sizeOfScrollableView = (mWidthPerDay + mColumnGap) * getNumberOfVisibleDays(); + float beforeScroll = startOriginForScroll; + boolean isPassed = false; + + if (mCurrentScrollDirection == Direction.LEFT) { + startOriginForScroll -= sizeOfScrollableView; + isPassed = true; + } else if (mCurrentScrollDirection == Direction.RIGHT) { + startOriginForScroll += sizeOfScrollableView; + isPassed = true; + } + + boolean mayScrollHorizontal = beforeScroll - startOriginForScroll < getXMaxLimit() + && mCurrentOrigin.x - startOriginForScroll > getXMinLimit(); - if (nearestOrigin != 0 && mayScrollHorizontal) { // Stop current animation. mScroller.forceFinished(true); - // Snap to date. - mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, -nearestOrigin, 0, (int) (Math.abs(nearestOrigin) / mWidthPerDay * mScrollDuration)); - ViewCompat.postInvalidateOnAnimation(WeekView.this); + + if (isPassed && mayScrollHorizontal) { + // Snap to date. + if (mCurrentScrollDirection == Direction.LEFT) { + mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) ((beforeScroll - mCurrentOrigin.x) - sizeOfScrollableView), 0, 200); + } else if (mCurrentScrollDirection == Direction.RIGHT) { + mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (sizeOfScrollableView - (mCurrentOrigin.x - beforeScroll)), 0, 200); + } + ViewCompat.postInvalidateOnAnimation(WeekView.this); + } + // Reset scrolling and fling direction. + mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE; } - // Reset scrolling and fling direction. - mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE; } @@ -2488,6 +2528,10 @@ private boolean forceFinishScroll() { } } + public void setCustomScrolableDaysEnabled(boolean isEnabled){ + mIsCustomScrollableAmountsOfDaysEnabled = isEnabled; + } + ///////////////////////////////////////////////////////////////// // @@ -2524,6 +2568,7 @@ public void goToDate(Calendar date) { mRefreshEvents = true; mCurrentOrigin.x = - daysBetween(mHomeDate, date) * (mWidthPerDay + mColumnGap); + startOriginForScroll = mCurrentOrigin.x; invalidate(); } diff --git a/sample/src/main/java/com/alamkanak/weekview/sample/BaseActivity.java b/sample/src/main/java/com/alamkanak/weekview/sample/BaseActivity.java index 6ffb5523a..4167edf46 100644 --- a/sample/src/main/java/com/alamkanak/weekview/sample/BaseActivity.java +++ b/sample/src/main/java/com/alamkanak/weekview/sample/BaseActivity.java @@ -61,6 +61,9 @@ protected void onCreate(Bundle savedInstanceState) { // Set AddEvent Click Listener mWeekView.setAddEventClickListener(this); + //Activate the scrolling by the NumberOfVisibleDays desired + mWeekView.setCustomScrolableDaysEnabled(true); + // Set minDate /*Calendar minDate = Calendar.getInstance(); minDate.set(Calendar.DAY_OF_MONTH, 1); From 984b9fdf1e34fe1d6da9bb23badb9625a695b7fe Mon Sep 17 00:00:00 2001 From: Ludovic Date: Sun, 7 Jan 2018 15:51:43 +0100 Subject: [PATCH 2/2] Rename variables, created functions instead of attribute, and moving part duplicated --- .../java/com/alamkanak/weekview/WeekView.java | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/library/src/main/java/com/alamkanak/weekview/WeekView.java b/library/src/main/java/com/alamkanak/weekview/WeekView.java index 20a910829..4349255a1 100755 --- a/library/src/main/java/com/alamkanak/weekview/WeekView.java +++ b/library/src/main/java/com/alamkanak/weekview/WeekView.java @@ -180,9 +180,8 @@ private enum Direction { private AddEventClickListener mAddEventClickListener; //Scroll by amount of days desired functionnality - private boolean mIsCustomScrollableAmountsOfDaysEnabled = false; + private boolean mScrollByAmountOfVisibleDaysEnabled = false; private float startOriginForScroll = 0; - private float sizeOfScrollableView; private final GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() { @@ -284,7 +283,7 @@ public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float ve switch (mCurrentFlingDirection) { case LEFT: case RIGHT: - if(!mIsCustomScrollableAmountsOfDaysEnabled) { + if(!mScrollByAmountOfVisibleDaysEnabled) { mScroller.fling((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (velocityX * mXScrollingSpeed), 0, (int) getXMinLimit(), (int) getXMaxLimit(), (int) getYMinLimit(), (int) getYMaxLimit()); } break; @@ -1453,7 +1452,6 @@ private boolean isEventsCollide(WeekViewEvent event1, WeekViewEvent event2) { return !((start1 >= end2) || (end1 <= start2)); } - /** * Checks if time1 occurs after (or at the same time) time2. * @param time1 The time to check. @@ -1723,6 +1721,10 @@ public void setHeaderColumnPadding(int headerColumnPadding) { invalidate(); } + public float getSizeOfScrollableView(){ + return (mWidthPerDay + mColumnGap) * getNumberOfVisibleDays(); + } + public int getHeaderColumnTextColor() { return mHeaderColumnTextColor; } @@ -2426,7 +2428,7 @@ public boolean onTouchEvent(MotionEvent event) { } private void goToNearestOrigin(){ - if(!mIsCustomScrollableAmountsOfDaysEnabled) { + if(!mScrollByAmountOfVisibleDaysEnabled ) { double leftDays = mCurrentOrigin.x / (mWidthPerDay + mColumnGap); if (mCurrentFlingDirection != Direction.NONE) { @@ -2459,18 +2461,16 @@ private void goToNearestOrigin(){ mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, -nearestOrigin, 0, (int) (Math.abs(nearestOrigin) / mWidthPerDay * mScrollDuration)); ViewCompat.postInvalidateOnAnimation(WeekView.this); } - // Reset scrolling and fling direction. - mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE; + }else { - sizeOfScrollableView = (mWidthPerDay + mColumnGap) * getNumberOfVisibleDays(); float beforeScroll = startOriginForScroll; boolean isPassed = false; if (mCurrentScrollDirection == Direction.LEFT) { - startOriginForScroll -= sizeOfScrollableView; + startOriginForScroll -= getSizeOfScrollableView(); isPassed = true; } else if (mCurrentScrollDirection == Direction.RIGHT) { - startOriginForScroll += sizeOfScrollableView; + startOriginForScroll += getSizeOfScrollableView(); isPassed = true; } @@ -2483,15 +2483,16 @@ private void goToNearestOrigin(){ if (isPassed && mayScrollHorizontal) { // Snap to date. if (mCurrentScrollDirection == Direction.LEFT) { - mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) ((beforeScroll - mCurrentOrigin.x) - sizeOfScrollableView), 0, 200); + mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) ((beforeScroll - mCurrentOrigin.x) - getSizeOfScrollableView()), 0, 200); } else if (mCurrentScrollDirection == Direction.RIGHT) { - mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (sizeOfScrollableView - (mCurrentOrigin.x - beforeScroll)), 0, 200); + mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (getSizeOfScrollableView() - (mCurrentOrigin.x - beforeScroll)), 0, 200); } ViewCompat.postInvalidateOnAnimation(WeekView.this); } - // Reset scrolling and fling direction. - mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE; } + + // Reset scrolling and fling direction. + mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE; } @@ -2528,8 +2529,8 @@ private boolean forceFinishScroll() { } } - public void setCustomScrolableDaysEnabled(boolean isEnabled){ - mIsCustomScrollableAmountsOfDaysEnabled = isEnabled; + public void setScrollByAmountOfVisibleDaysEnabled (boolean isEnabled){ + mScrollByAmountOfVisibleDaysEnabled = isEnabled; }