diff --git a/library/src/main/java/com/alamkanak/weekview/WeekView.java b/library/src/main/java/com/alamkanak/weekview/WeekView.java
index f6685e020..ea535f126 100755
--- a/library/src/main/java/com/alamkanak/weekview/WeekView.java
+++ b/library/src/main/java/com/alamkanak/weekview/WeekView.java
@@ -110,6 +110,11 @@ private enum Direction {
private int mScaledTouchSlop = 0;
private EventRect mNewEventRect;
private TextColorPicker textColorPicker;
+ private float mSizeOfWeekView;
+ private float mDistanceDone = 0;
+ private float mDistanceMin;
+ protected int mOffsetValueToSecureScreen = 9;
+ private float mStartOriginForScroll = 0;
// Attributes and their default values.
private int mHourHeight = 50;
@@ -174,6 +179,7 @@ private enum Direction {
private boolean mAutoLimitTime = false;
private boolean mEnableDropListener = false;
private int mMinOverlappingMinutes = 0;
+ private boolean mIsScrollNumberOfVisibleDays = false;
// Listeners.
private EventClickListener mEventClickListener;
@@ -190,6 +196,7 @@ private enum Direction {
@Override
public boolean onDown(MotionEvent e) {
+ mStartOriginForScroll = mCurrentOrigin.x;
goToNearestOrigin();
return true;
}
@@ -238,6 +245,13 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d
case RIGHT:
float minX = getXMinLimit();
float maxX = getXMaxLimit();
+
+ if (e2.getX() < 0) {
+ mDistanceDone = e2.getX() - e1.getX();
+ } else {
+ mDistanceDone = e1.getX() - e2.getX();
+ }
+
if ((mCurrentOrigin.x - (distanceX * mXScrollingSpeed)) > maxX) {
mCurrentOrigin.x = maxX;
} else if ((mCurrentOrigin.x - (distanceX * mXScrollingSpeed)) < minX) {
@@ -282,7 +296,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(!mIsScrollNumberOfVisibleDays) {
+ 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());
@@ -494,6 +510,7 @@ public WeekView(Context context, AttributeSet attrs, int defStyleAttr) {
if (a.getBoolean(R.styleable.WeekView_dropListenerEnabled, false))
this.enableDropListener();
mMinOverlappingMinutes = a.getInt(R.styleable.WeekView_minOverlappingMinutes, 0);
+ mIsScrollNumberOfVisibleDays = a.getBoolean(R.styleable.WeekView_isScrollNumberOfVisibleDays, false);
} finally {
a.recycle();
}
@@ -2517,6 +2534,15 @@ public int getMinOverlappingMinutes() {
return this.mMinOverlappingMinutes;
}
+ public boolean isScrollNumberOfVisibleDays() {
+ return this.mIsScrollNumberOfVisibleDays;
+ }
+
+ public void setScrollNumberOfVisibleDays(boolean scrollNumberOfVisibleDays) {
+ this.mIsScrollNumberOfVisibleDays = scrollNumberOfVisibleDays;
+ invalidate();
+ }
+
/////////////////////////////////////////////////////////////////
//
// Functions related to scrolling.
@@ -2525,6 +2551,10 @@ public int getMinOverlappingMinutes() {
@Override
public boolean onTouchEvent(MotionEvent event) {
+
+ mSizeOfWeekView = (mWidthPerDay + mColumnGap) * getNumberOfVisibleDays();
+ mDistanceMin = mSizeOfWeekView / mOffsetValueToSecureScreen;
+
mScaleDetector.onTouchEvent(event);
boolean val = mGestureDetector.onTouchEvent(event);
@@ -2542,41 +2572,79 @@ 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);
- }
+ float beforeScroll = mStartOriginForScroll;
+ boolean isPassed = false;
+
+ if (mDistanceDone > mDistanceMin || mDistanceDone < -mDistanceMin || !mIsScrollNumberOfVisibleDays) {
+
+ if (!mIsScrollNumberOfVisibleDays && mCurrentFlingDirection != Direction.NONE) {
+ // snap to nearest day
+ leftDays = Math.round(leftDays);
+ } else if (mCurrentScrollDirection == Direction.LEFT) {
+ // snap to last day
+ leftDays = Math.floor(leftDays);
+ mStartOriginForScroll -= mSizeOfWeekView;
+ isPassed = true;
+ } else if (mCurrentScrollDirection == Direction.RIGHT) {
+ // snap to next day
+ leftDays = Math.floor(leftDays);
+ mStartOriginForScroll += mSizeOfWeekView;
+ isPassed = true;
+ } else {
+ // snap to nearest day
+ leftDays = Math.round(leftDays);
+ }
- 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 (mIsScrollNumberOfVisibleDays) {
+ boolean mayScrollHorizontal = beforeScroll - mStartOriginForScroll < getXMaxLimit() && mCurrentOrigin.x - mStartOriginForScroll > getXMinLimit();
+ if (isPassed && mayScrollHorizontal) {
+ // Stop current animation.
+ mScroller.forceFinished(true);
+ // Snap to date.
+ if (mCurrentScrollDirection == Direction.LEFT) {
+ mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) ((beforeScroll - mCurrentOrigin.x) - mSizeOfWeekView), 0, 200);
+ } else if (mCurrentScrollDirection == Direction.RIGHT) {
+ mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) (mSizeOfWeekView - (mCurrentOrigin.x - beforeScroll)), 0, 200);
+ }
+ ViewCompat.postInvalidateOnAnimation(WeekView.this);
+ }
+ }
+ else{
+ 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.
+ 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 {
mScroller.forceFinished(true);
- // Snap to date.
- mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, -nearestOrigin, 0, (int) (Math.abs(nearestOrigin) / mWidthPerDay * mScrollDuration));
+ if (mCurrentScrollDirection == Direction.LEFT) {
+ mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) beforeScroll - (int) mCurrentOrigin.x, 0, 200);
+ } else if (mCurrentScrollDirection == Direction.RIGHT) {
+ mScroller.startScroll((int) mCurrentOrigin.x, (int) mCurrentOrigin.y, (int) beforeScroll - (int) mCurrentOrigin.x, 0, 200);
+ }
ViewCompat.postInvalidateOnAnimation(WeekView.this);
+
+ // Reset scrolling and fling direction.
+ mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE;
}
- // Reset scrolling and fling direction.
- mCurrentScrollDirection = mCurrentFlingDirection = Direction.NONE;
}
-
@Override
public void computeScroll() {
super.computeScroll();
@@ -2851,4 +2919,4 @@ public boolean onDrag(View v, DragEvent e) {
return true;
}
}
-}
+}
\ No newline at end of file
diff --git a/library/src/main/res/values/attrs.xml b/library/src/main/res/values/attrs.xml
index 516f90227..0b704d61e 100644
--- a/library/src/main/res/values/attrs.xml
+++ b/library/src/main/res/values/attrs.xml
@@ -65,5 +65,6 @@
+