OSDN Git Service

DO NOT MERGE
authorGrace Kloba <klobag@google.com>
Thu, 21 Jan 2010 01:38:18 +0000 (17:38 -0800)
committerGrace Kloba <klobag@google.com>
Thu, 21 Jan 2010 03:15:44 +0000 (19:15 -0800)
Adopt the sloppy detection in the ScaleGestureDetector.
Try to fix the fat thumb problem.

Fix http://b/issue?id=2385061

core/java/android/webkit/WebView.java

index 1c335aa..ab1841e 100644 (file)
@@ -3965,19 +3965,41 @@ public class WebView extends AbsoluteLayout
                     + mTouchMode);
         }
 
+        int action;
+        float x, y;
+        long eventTime = ev.getEventTime();
+
         // FIXME: we may consider to give WebKit an option to handle multi-touch
         // events later.
         if (mSupportMultiTouch && mMinZoomScale < mMaxZoomScale
                 && ev.getPointerCount() > 1) {
-            mLastTouchTime = ev.getEventTime();
-            return mScaleDetector.onTouchEvent(ev);
+            mScaleDetector.onTouchEvent(ev);
+            if (mScaleDetector.isInProgress()) {
+                mLastTouchTime = eventTime;
+                return true;
+            }
+            x = mScaleDetector.getFocusX();
+            y = mScaleDetector.getFocusY();
+            action = ev.getAction() & MotionEvent.ACTION_MASK;
+            if (action == MotionEvent.ACTION_POINTER_DOWN) {
+                cancelTouch();
+                action = MotionEvent.ACTION_DOWN;
+            } else if (action == MotionEvent.ACTION_POINTER_UP) {
+                // set mLastTouchX/Y to the remaining point
+                mLastTouchX = x;
+                mLastTouchY = y;
+            } else if (action == MotionEvent.ACTION_MOVE) {
+                // negative x or y indicate it is on the edge, skip it.
+                if (x < 0 || y < 0) {
+                    return true;
+                }
+            }
+        } else {
+            action = ev.getAction();
+            x = ev.getX();
+            y = ev.getY();
         }
 
-        int action = ev.getAction();
-        float x = ev.getX();
-        float y = ev.getY();
-        long eventTime = ev.getEventTime();
-
         // Due to the touch screen edge effect, a touch closer to the edge
         // always snapped to the edge. As getViewWidth() can be different from
         // getWidth() due to the scrollbar, adjusting the point to match