diff options
Diffstat (limited to 'android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java')
-rw-r--r-- | android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java index 555c7ebe60fa..65daf76a484f 100644 --- a/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java +++ b/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java @@ -50,6 +50,9 @@ public class PanZoomController // The maximum amount we allow you to zoom into a page private static final float MAX_ZOOM = 4.0f; + // The maximum amount we would like to scroll with the mouse + private static final float MAX_SCROLL = 0.075f * LOKitShell.getDpi(); + private enum PanZoomState { NOTHING, /* no touch-start events received */ FLING, /* all touches removed, but we're still scrolling page */ @@ -110,7 +113,9 @@ public class PanZoomController } private void setState(PanZoomState state) { - mState = state; + if (state != mState) { + mState = state; + } } private ImmutableViewportMetrics getMetrics() { @@ -131,6 +136,7 @@ public class PanZoomController case MotionEvent.ACTION_MOVE: return onTouchMove(event); case MotionEvent.ACTION_UP: return onTouchEnd(event); case MotionEvent.ACTION_CANCEL: return onTouchCancel(event); + case MotionEvent.ACTION_SCROLL: return onScroll(event); default: return false; } } @@ -158,6 +164,7 @@ public class PanZoomController // transitions. synchronized (mTarget.getLock()) { mTarget.setViewportMetrics(getValidViewportMetrics()); + mTarget.forceRedraw(); } break; } @@ -214,7 +221,7 @@ public class PanZoomController // We just interrupted a double-tap animation, so force a redraw in // case this touchstart is just a tap that doesn't end up triggering // a redraw - mTarget.setForceRedraw(); + mTarget.forceRedraw(); // fall through case FLING: case BOUNCE: @@ -337,6 +344,18 @@ public class PanZoomController return false; } + private boolean onScroll(MotionEvent event) { + if (mState == PanZoomState.NOTHING || mState == PanZoomState.FLING) { + float scrollX = event.getAxisValue(MotionEvent.AXIS_HSCROLL); + float scrollY = event.getAxisValue(MotionEvent.AXIS_VSCROLL); + + scrollBy(scrollX * MAX_SCROLL, scrollY * MAX_SCROLL); + bounce(); + return true; + } + return false; + } + private void startTouch(float x, float y, long time) { mX.startTouch(x); mY.startTouch(y); @@ -434,7 +453,7 @@ public class PanZoomController } /* Performs a bounce-back animation to the given viewport metrics. */ - private void bounce(ImmutableViewportMetrics metrics) { + private void bounce(ImmutableViewportMetrics metrics, PanZoomState state) { stopAnimationTimer(); ImmutableViewportMetrics bounceStartMetrics = getMetrics(); @@ -443,6 +462,8 @@ public class PanZoomController return; } + setState(state); + // At this point we have already set mState to BOUNCE or ANIMATED_ZOOM, so // getRedrawHint() is returning false. This means we can safely call // setAnimationTarget to set the new final display port and not have it get @@ -453,8 +474,7 @@ public class PanZoomController /* Performs a bounce-back animation to the nearest valid viewport metrics. */ private void bounce() { - setState(PanZoomState.BOUNCE); - bounce(getValidViewportMetrics()); + bounce(getValidViewportMetrics(), PanZoomState.BOUNCE); } /* Starts the fling or bounce animation. */ @@ -654,7 +674,7 @@ public class PanZoomController stopAnimationTimer(); // Force a viewport synchronisation - mTarget.setForceRedraw(); + mTarget.forceRedraw(); } /* Returns the nearest viewport metrics with no overscroll visible. */ @@ -837,7 +857,8 @@ public class PanZoomController startTouch(detector.getFocusX(), detector.getFocusY(), detector.getEventTime()); // Force a viewport synchronisation - mTarget.setForceRedraw(); + mTarget.forceRedraw(); + } /** @@ -896,7 +917,6 @@ public class PanZoomController * pixels. */ private boolean animatedZoomTo(RectF zoomToRect) { - setState(PanZoomState.ANIMATED_ZOOM); final float startZoom = getMetrics().zoomFactor; RectF viewport = getMetrics().getViewport(); @@ -932,7 +952,7 @@ public class PanZoomController // clamped down to prevent overscroll, over-zoom, and other bad conditions. finalMetrics = getValidViewportMetrics(finalMetrics); - bounce(finalMetrics); + bounce(finalMetrics, PanZoomState.ANIMATED_ZOOM); return true; } |