summaryrefslogtreecommitdiff
path: root/android/experimental/LOAndroid3/src/java/org/mozilla/gecko/ui/PanZoomController.java
diff options
context:
space:
mode:
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.java38
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;
}