am 8496ddc5: Merge "b/3307761 Tuning two fingers pan." into honeycomb-mr1
* commit '8496ddc536eb917c813b7928f174c828d2275ada': b/3307761 Tuning two fingers pan.
This commit is contained in:
@@ -16,6 +16,9 @@
|
||||
|
||||
package android.webkit;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.Queue;
|
||||
|
||||
import android.content.Context;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.graphics.Canvas;
|
||||
@@ -23,6 +26,7 @@ import android.graphics.Point;
|
||||
import android.graphics.Rect;
|
||||
import android.os.Bundle;
|
||||
import android.os.SystemClock;
|
||||
import android.util.FloatMath;
|
||||
import android.util.Log;
|
||||
import android.view.ScaleGestureDetector;
|
||||
import android.view.View;
|
||||
@@ -111,6 +115,24 @@ class ZoomManager {
|
||||
private float mZoomCenterX;
|
||||
private float mZoomCenterY;
|
||||
|
||||
/*
|
||||
* Similar to mZoomCenterX(Y), these track the focus point of the scale
|
||||
* gesture. The difference is these get updated every time when onScale is
|
||||
* invoked no matter if a zooming really happens.
|
||||
*/
|
||||
private float mFocusX;
|
||||
private float mFocusY;
|
||||
|
||||
/*
|
||||
* mFocusMovement keeps track of the total movement that the focus point
|
||||
* has been through. Comparing to the difference of mCurrlen and mPrevLen,
|
||||
* it determines if the gesture is for panning or zooming or both.
|
||||
*/
|
||||
private static final int FOCUS_QUEUE_SIZE = 5;
|
||||
private float mFocusMovementSum;
|
||||
private Queue<Float> mFocusMovementQueue;
|
||||
|
||||
|
||||
/*
|
||||
* These values represent the point around which the screen should be
|
||||
* centered after zooming. In other words it is used to determine the center
|
||||
@@ -196,6 +218,8 @@ class ZoomManager {
|
||||
* viewport size is.
|
||||
*/
|
||||
setZoomOverviewWidth(WebView.DEFAULT_VIEWPORT_WIDTH);
|
||||
|
||||
mFocusMovementQueue = new LinkedList<Float>();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -715,10 +739,11 @@ class ZoomManager {
|
||||
}
|
||||
|
||||
private class ScaleDetectorListener implements ScaleGestureDetector.OnScaleGestureListener {
|
||||
|
||||
public boolean onScaleBegin(ScaleGestureDetector detector) {
|
||||
mInitialZoomOverview = false;
|
||||
dismissZoomPicker();
|
||||
mFocusMovementSum = 0;
|
||||
mFocusMovementQueue.clear();
|
||||
mWebView.mViewManager.startZoom();
|
||||
mWebView.onPinchToZoomAnimationStart();
|
||||
return true;
|
||||
@@ -729,6 +754,29 @@ class ZoomManager {
|
||||
float scale = Math.max(
|
||||
computeScaleWithLimits(detector.getScaleFactor() * mActualScale),
|
||||
getZoomOverviewScale());
|
||||
|
||||
float prevFocusX = mFocusX;
|
||||
float prevFocusY = mFocusY;
|
||||
mFocusX = detector.getFocusX();
|
||||
mFocusY = detector.getFocusY();
|
||||
float focusDelta = (prevFocusX == 0 && prevFocusY == 0) ? 0 :
|
||||
FloatMath.sqrt((mFocusX - prevFocusX) * (mFocusX - prevFocusX)
|
||||
+ (mFocusY - prevFocusY) * (mFocusY - prevFocusY));
|
||||
mFocusMovementSum += focusDelta;
|
||||
mFocusMovementQueue.add(focusDelta);
|
||||
if (mFocusMovementQueue.size() > FOCUS_QUEUE_SIZE) {
|
||||
mFocusMovementSum -= mFocusMovementQueue.remove();
|
||||
}
|
||||
float deltaSpan = Math.abs(detector.getCurrentSpan() - detector.getPreviousSpan());
|
||||
|
||||
// If the user moves the fingers but keeps the same distance between them,
|
||||
// we should do panning only.
|
||||
if (mFocusMovementSum > deltaSpan) {
|
||||
mFocusMovementSum = 0;
|
||||
mFocusMovementQueue.clear();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mPinchToZoomAnimating || willScaleTriggerZoom(scale)) {
|
||||
mPinchToZoomAnimating = true;
|
||||
// limit the scale change per step
|
||||
|
||||
Reference in New Issue
Block a user