summaryrefslogtreecommitdiff
path: root/platform/android/src/com/artifex
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2014-09-08 11:22:23 +0100
committerRobin Watts <robin.watts@artifex.com>2014-09-08 12:20:30 +0100
commitf8eb384499f5b89e90cbbea961ba073536c49bc5 (patch)
tree091717ba21f2872981943cba43ba3000da8e50cd /platform/android/src/com/artifex
parent67360bffed2570dc7daf9ce1cf9febc3495e8f2a (diff)
downloadmupdf-f8eb384499f5b89e90cbbea961ba073536c49bc5.tar.xz
Add option for vertical scrolling support in Android App.
A potential customer (currently a free user) contacted us asking that MuPDF be extended to support vertical scrolling rather than horizontal scrolling. He supplied a partially working patch. We reviewed his patch, and found the bit he'd missed, which he added and it now works for his purposes. We also spotted some places where his patch is incorrect in general though (and will go wrong for cases where PDF files have varying page sizes). This is a commit of a correct version. ReaderView gains a HORIZONTAL_SCROLLING boolean that is set to true currently to maintain the normal behaviour. Change it to false and we will scroll vertically instead. Possibly we could add a button to allow this to be a runtime option, but that's a future enhancement.
Diffstat (limited to 'platform/android/src/com/artifex')
-rw-r--r--platform/android/src/com/artifex/mupdfdemo/ReaderView.java87
1 files changed, 72 insertions, 15 deletions
diff --git a/platform/android/src/com/artifex/mupdfdemo/ReaderView.java b/platform/android/src/com/artifex/mupdfdemo/ReaderView.java
index 7cfcf4d1..e27f0bbf 100644
--- a/platform/android/src/com/artifex/mupdfdemo/ReaderView.java
+++ b/platform/android/src/com/artifex/mupdfdemo/ReaderView.java
@@ -32,6 +32,8 @@ public class ReaderView
private static final float MAX_SCALE = 5.0f;
private static final float REFLOW_SCALE_FACTOR = 0.5f;
+ private static final boolean HORIZONTAL_SCROLLING = true;
+
private Adapter mAdapter;
private int mCurrent; // Adapter's index for the current view
private boolean mResetLayout;
@@ -373,7 +375,7 @@ public class ReaderView
Rect bounds = getScrollBounds(v);
switch(directionOfTravel(velocityX, velocityY)) {
case MOVING_LEFT:
- if (bounds.left >= 0) {
+ if (HORIZONTAL_SCROLLING && bounds.left >= 0) {
// Fling off to the left bring next view onto screen
View vl = mChildViews.get(mCurrent+1);
@@ -383,8 +385,19 @@ public class ReaderView
}
}
break;
+ case MOVING_UP:
+ if (!HORIZONTAL_SCROLLING && bounds.top >= 0) {
+ // Fling off to the top bring next view onto screen
+ View vl = mChildViews.get(mCurrent+1);
+
+ if (vl != null) {
+ slideViewOntoScreen(vl);
+ return true;
+ }
+ }
+ break;
case MOVING_RIGHT:
- if (bounds.right <= 0) {
+ if (HORIZONTAL_SCROLLING && bounds.right <= 0) {
// Fling off to the right bring previous view onto screen
View vr = mChildViews.get(mCurrent-1);
@@ -394,6 +407,17 @@ public class ReaderView
}
}
break;
+ case MOVING_DOWN:
+ if (HORIZONTAL_SCROLLING && bounds.bottom <= 0) {
+ // Fling off to the bottom bring previous view onto screen
+ View vr = mChildViews.get(mCurrent-1);
+
+ if (vr != null) {
+ slideViewOntoScreen(vr);
+ return true;
+ }
+ }
+ break;
}
mScrollerLastX = mScrollerLastY = 0;
// If the page has been dragged out of bounds then we want to spring back
@@ -544,10 +568,15 @@ public class ReaderView
if (!mResetLayout) {
// Move to next or previous if current is sufficiently off center
if (cv != null) {
+ boolean move;
cvOffset = subScreenSizeOffset(cv);
// cv.getRight() may be out of date with the current scale
// so add left to the measured width for the correct position
- if (cv.getLeft() + cv.getMeasuredWidth() + cvOffset.x + GAP/2 + mXScroll < getWidth()/2 && mCurrent + 1 < mAdapter.getCount()) {
+ if (HORIZONTAL_SCROLLING)
+ move = cv.getLeft() + cv.getMeasuredWidth() + cvOffset.x + GAP/2 + mXScroll < getWidth()/2;
+ else
+ move = cv.getTop() + cv.getMeasuredHeight() + cvOffset.y + GAP/2 + mYScroll < getHeight()/2;
+ if (move && mCurrent + 1 < mAdapter.getCount()) {
postUnsettle(cv);
// post to invoke test for end of animation
// where we must set hq area for the new current view
@@ -558,7 +587,11 @@ public class ReaderView
onMoveToChild(mCurrent);
}
- if (cv.getLeft() - cvOffset.x - GAP/2 + mXScroll >= getWidth()/2 && mCurrent > 0) {
+ if (HORIZONTAL_SCROLLING)
+ move = cv.getLeft() - cvOffset.x - GAP/2 + mXScroll >= getWidth()/2;
+ else
+ move = cv.getTop() - cvOffset.y - GAP/2 + mYScroll >= getHeight()/2;
+ if (move && mCurrent > 0) {
postUnsettle(cv);
// post to invoke test for end of animation
// where we must set hq area for the new current view
@@ -638,12 +671,18 @@ public class ReaderView
cvLeft += corr.x;
cvTop += corr.y;
cvBottom += corr.y;
- } else if (cv.getMeasuredHeight() <= getHeight()) {
+ } else if (HORIZONTAL_SCROLLING && cv.getMeasuredHeight() <= getHeight()) {
// When the current view is as small as the screen in height, clamp
// it vertically
Point corr = getCorrection(getScrollBounds(cvLeft, cvTop, cvRight, cvBottom));
cvTop += corr.y;
cvBottom += corr.y;
+ } else if (!HORIZONTAL_SCROLLING && cv.getMeasuredWidth() <= getWidth()) {
+ // When the current view is as small as the screen in width, clamp
+ // it horizontally
+ Point corr = getCorrection(getScrollBounds(cvLeft, cvTop, cvRight, cvBottom));
+ cvRight += corr.x;
+ cvLeft += corr.x;
}
cv.layout(cvLeft, cvTop, cvRight, cvBottom);
@@ -651,21 +690,39 @@ public class ReaderView
if (mCurrent > 0) {
View lv = getOrCreateChild(mCurrent - 1);
Point leftOffset = subScreenSizeOffset(lv);
- int gap = leftOffset.x + GAP + cvOffset.x;
- lv.layout(cvLeft - lv.getMeasuredWidth() - gap,
- (cvBottom + cvTop - lv.getMeasuredHeight())/2,
- cvLeft - gap,
- (cvBottom + cvTop + lv.getMeasuredHeight())/2);
+ if (HORIZONTAL_SCROLLING)
+ {
+ int gap = leftOffset.x + GAP + cvOffset.x;
+ lv.layout(cvLeft - lv.getMeasuredWidth() - gap,
+ (cvBottom + cvTop - lv.getMeasuredHeight())/2,
+ cvLeft - gap,
+ (cvBottom + cvTop + lv.getMeasuredHeight())/2);
+ } else {
+ int gap = leftOffset.y + GAP + cvOffset.y;
+ lv.layout((cvLeft + cvRight - lv.getMeasuredWidth())/2,
+ cvTop - lv.getMeasuredHeight() - gap,
+ (cvLeft + cvRight + lv.getMeasuredWidth())/2,
+ cvTop - gap);
+ }
}
if (mCurrent + 1 < mAdapter.getCount()) {
View rv = getOrCreateChild(mCurrent + 1);
Point rightOffset = subScreenSizeOffset(rv);
- int gap = cvOffset.x + GAP + rightOffset.x;
- rv.layout(cvRight + gap,
- (cvBottom + cvTop - rv.getMeasuredHeight())/2,
- cvRight + rv.getMeasuredWidth() + gap,
- (cvBottom + cvTop + rv.getMeasuredHeight())/2);
+ if (HORIZONTAL_SCROLLING)
+ {
+ int gap = cvOffset.x + GAP + rightOffset.x;
+ rv.layout(cvRight + gap,
+ (cvBottom + cvTop - rv.getMeasuredHeight())/2,
+ cvRight + rv.getMeasuredWidth() + gap,
+ (cvBottom + cvTop + rv.getMeasuredHeight())/2);
+ } else {
+ int gap = cvOffset.y + GAP + rightOffset.y;
+ rv.layout((cvLeft + cvRight - rv.getMeasuredWidth())/2,
+ cvBottom + gap,
+ (cvLeft + cvRight + rv.getMeasuredWidth())/2,
+ cvBottom + gap + rv.getMeasuredHeight());
+ }
}
invalidate();