diff options
| -rw-r--r-- | core/java/android/webkit/WebView.java | 33 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 1 |
2 files changed, 25 insertions, 9 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 01c73a8f6f11..96623b0b5a81 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -1672,6 +1672,7 @@ public class WebView extends AbsoluteLayout mDrawHistory = true; mHistoryPicture = p; + mScrollX = sx; mScrollY = sy; mZoomManager.restoreZoomState(b); @@ -5473,7 +5474,6 @@ public class WebView extends AbsoluteLayout private boolean handleTouchEventCommon(MotionEvent ev, int action, int x, int y) { 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 @@ -5577,6 +5577,8 @@ public class WebView extends AbsoluteLayout ted.mIds[0] = ev.getPointerId(0); ted.mPoints = new Point[1]; ted.mPoints[0] = new Point(contentX, contentY); + ted.mPointsInView = new Point[1]; + ted.mPointsInView[0] = new Point(x, y); ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; ted.mNativeLayer = nativeScrollableLayer( @@ -5624,6 +5626,8 @@ public class WebView extends AbsoluteLayout ted.mIds[0] = ev.getPointerId(0); ted.mPoints = new Point[1]; ted.mPoints[0] = new Point(contentX, contentY); + ted.mPointsInView = new Point[1]; + ted.mPointsInView[0] = new Point(x, y); ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; ted.mNativeLayer = mScrollingLayer; @@ -5806,6 +5810,8 @@ public class WebView extends AbsoluteLayout ted.mAction = action; ted.mPoints = new Point[1]; ted.mPoints[0] = new Point(contentX, contentY); + ted.mPointsInView = new Point[1]; + ted.mPointsInView[0] = new Point(x, y); ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; ted.mNativeLayer = mScrollingLayer; @@ -5828,6 +5834,8 @@ public class WebView extends AbsoluteLayout ted.mAction = WebViewCore.ACTION_DOUBLETAP; ted.mPoints = new Point[1]; ted.mPoints[0] = new Point(contentX, contentY); + ted.mPointsInView = new Point[1]; + ted.mPointsInView[0] = new Point(x, y); ted.mMetaState = ev.getMetaState(); ted.mReprocess = mDeferTouchProcess; ted.mNativeLayer = nativeScrollableLayer( @@ -5964,11 +5972,13 @@ public class WebView extends AbsoluteLayout final int count = ev.getPointerCount(); ted.mIds = new int[count]; ted.mPoints = new Point[count]; + ted.mPointsInView = new Point[count]; for (int c = 0; c < count; c++) { ted.mIds[c] = ev.getPointerId(c); int x = viewToContentX((int) ev.getX(c) + mScrollX); int y = viewToContentY((int) ev.getY(c) + mScrollY); ted.mPoints[c] = new Point(x, y); + ted.mPointsInView[c] = new Point((int) ev.getX(c), (int) ev.getY(c)); } if (ted.mAction == MotionEvent.ACTION_POINTER_DOWN || ted.mAction == MotionEvent.ACTION_POINTER_UP) { @@ -6053,6 +6063,10 @@ public class WebView extends AbsoluteLayout ted.mIds[0] = 0; ted.mPoints = new Point[1]; ted.mPoints[0] = new Point(x, y); + ted.mPointsInView = new Point[1]; + int viewX = contentToViewX(x) - mScrollX; + int viewY = contentToViewY(y) - mScrollY; + ted.mPointsInView[0] = new Point(viewX, viewY); ted.mAction = MotionEvent.ACTION_CANCEL; ted.mNativeLayer = nativeScrollableLayer( x, y, ted.mNativeLayerRect, null); @@ -7441,16 +7455,15 @@ public class WebView extends AbsoluteLayout // Following is for single touch. switch (ted.mAction) { case MotionEvent.ACTION_DOWN: - mLastDeferTouchX = contentToViewX(ted.mPoints[0].x) - - mScrollX; - mLastDeferTouchY = contentToViewY(ted.mPoints[0].y) - - mScrollY; + mLastDeferTouchX = ted.mPointsInView[0].x; + mLastDeferTouchY = ted.mPointsInView[0].y; mDeferTouchMode = TOUCH_INIT_MODE; break; case MotionEvent.ACTION_MOVE: { // no snapping in defer process - int x = contentToViewX(ted.mPoints[0].x) - mScrollX; - int y = contentToViewY(ted.mPoints[0].y) - mScrollY; + int x = ted.mPointsInView[0].x; + int y = ted.mPointsInView[0].y; + if (mDeferTouchMode != TOUCH_DRAG_MODE) { mDeferTouchMode = TOUCH_DRAG_MODE; mLastDeferTouchX = x; @@ -7484,8 +7497,8 @@ public class WebView extends AbsoluteLayout break; case WebViewCore.ACTION_DOUBLETAP: // doDoubleTap() needs mLastTouchX/Y as anchor - mLastTouchX = contentToViewX(ted.mPoints[0].x) - mScrollX; - mLastTouchY = contentToViewY(ted.mPoints[0].y) - mScrollY; + mLastDeferTouchX = ted.mPointsInView[0].x; + mLastDeferTouchY = ted.mPointsInView[0].y; mZoomManager.handleDoubleTap(mLastTouchX, mLastTouchY); mDeferTouchMode = TOUCH_DONE_MODE; break; @@ -7609,6 +7622,8 @@ public class WebView extends AbsoluteLayout ted.mPoints = new Point[1]; ted.mPoints[0] = new Point(viewToContentX(mLastTouchX + mScrollX), viewToContentY(mLastTouchY + mScrollY)); + ted.mPointsInView = new Point[1]; + ted.mPointsInView[0] = new Point(mLastTouchX, mLastTouchY); // metaState for long press is tricky. Should it be the // state when the press started or when the press was // released? Or some intermediary key state? For diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 3b989dc99dee..027169597921 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -831,6 +831,7 @@ final class WebViewCore { int mAction; int[] mIds; // Ids of the touch points Point[] mPoints; + Point[] mPointsInView; // the point coordinates in view axis. int mActionIndex; // Associated pointer index for ACTION_POINTER_DOWN/UP int mMetaState; boolean mReprocess; |