From dde858cbb6dd96e621616b20bb5a6866565b4874 Mon Sep 17 00:00:00 2001 From: "Shimeng (Simon) Wang" Date: Wed, 11 Aug 2010 15:42:00 -0700 Subject: Change scale for large screen reading when double tapped. This happens when default and overview scales have not much difference. This solves the double tap issue for large screen devices, where overview and default scale are the same. The code works well with phone device as well. Change-Id: Iac7f66369d58a152de8de7025b326d1672da30d4 --- core/java/android/webkit/WebView.java | 6 +++--- core/java/android/webkit/ZoomManager.java | 26 +++++++++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) (limited to 'core') diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 32009be..9f60f44 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -3557,11 +3557,11 @@ public class WebView extends AbsoluteLayout InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - // bring it back to the default scale so that user can enter text - boolean zoom = mZoomManager.getScale() < mZoomManager.getDefaultScale(); + // bring it back to the reading level scale so that user can enter text + boolean zoom = mZoomManager.getScale() < mZoomManager.getReadingLevelScale(); if (zoom) { mZoomManager.setZoomCenter(mLastTouchX, mLastTouchY); - mZoomManager.setZoomScale(mZoomManager.getDefaultScale(), false); + mZoomManager.setZoomScale(mZoomManager.getReadingLevelScale(), false); } if (isTextView) { rebuildWebTextView(); diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java index 7f7f46e..8033c9c 100644 --- a/core/java/android/webkit/ZoomManager.java +++ b/core/java/android/webkit/ZoomManager.java @@ -56,6 +56,13 @@ class ZoomManager { private ZoomControlExternal mExternalZoomControl; /* + * For large screen devices, the defaultScale usually set to 1.0 and + * equal to the overview scale, to differentiate the zoom level for double tapping, + * a minimum reading level scale is used. + */ + private static final float MIN_READING_LEVEL_SCALE = 1.5f; + + /* * The scale factors that determine the upper and lower bounds for the * default zoom scale. */ @@ -245,6 +252,10 @@ class ZoomManager { return mDefaultScale; } + public final float getReadingLevelScale() { + return Math.max(mDefaultScale, MIN_READING_LEVEL_SCALE); + } + public final float getInvDefaultScale() { return mInvDefaultScale; } @@ -337,9 +348,9 @@ class ZoomManager { mInitialScrollX = mWebView.getScrollX(); mInitialScrollY = mWebView.getScrollY(); - // snap to DEFAULT_SCALE if it is close - if (!exceedsMinScaleIncrement(scale, mDefaultScale)) { - scale = mDefaultScale; + // snap to reading level scale if it is close + if (!exceedsMinScaleIncrement(scale, getReadingLevelScale())) { + scale = getReadingLevelScale(); } setZoomScale(scale, reflowText); @@ -535,7 +546,7 @@ class ZoomManager { } else if (!mInZoomOverview) { zoomToOverview(); } else { - zoomToDefaultLevel(); + zoomToReadingLevel(); } } @@ -563,7 +574,8 @@ class ZoomManager { startZoomAnimation(getZoomOverviewScale(), true); } - private void zoomToDefaultLevel() { + private void zoomToReadingLevel() { + final float readingScale = getReadingLevelScale(); int left = mWebView.nativeGetBlockLeftEdge(mAnchorX, mAnchorY, mActualScale); if (left != WebView.NO_LEFTEDGE) { // add a 5pt padding to the left edge. @@ -572,13 +584,13 @@ class ZoomManager { // Re-calculate the zoom center so that the new scroll x will be // on the left edge. if (viewLeft > 0) { - mZoomCenterX = viewLeft * mDefaultScale / (mDefaultScale - mActualScale); + mZoomCenterX = viewLeft * readingScale / (readingScale - mActualScale); } else { mWebView.scrollBy(viewLeft, 0); mZoomCenterX = 0; } } - startZoomAnimation(mDefaultScale, true); + startZoomAnimation(readingScale, true); } public void updateMultiTouchSupport(Context context) { -- cgit v1.1