diff options
| author | 2012-02-17 17:54:15 -0800 | |
|---|---|---|
| committer | 2012-02-21 10:04:54 -0800 | |
| commit | 37c4a9f99a32748682b56d501cbc03c4b3c5b3cf (patch) | |
| tree | 27891517fbf9385aff4d43a960e42ad940507dfd | |
| parent | c71ac98405465b75e06e48dc63984d72f3c398b8 (diff) | |
Improved keyboard navigation cursor rings
Change-Id: I77b974bb9eae0f9dc8e57320632e5915e8295839
| -rw-r--r-- | core/java/android/webkit/WebView.java | 139 | ||||
| -rw-r--r-- | core/java/android/webkit/WebViewCore.java | 1 |
2 files changed, 119 insertions, 21 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index e0f4f59c8a89..95629fe4664d 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -16,6 +16,7 @@ package android.webkit; +import android.animation.ObjectAnimator; import android.annotation.Widget; import android.app.ActivityManager; import android.app.AlertDialog; @@ -36,6 +37,7 @@ import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.ColorFilter; import android.graphics.DrawFilter; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; @@ -4598,15 +4600,7 @@ public class WebView extends AbsoluteLayout if (mTitleBar != null) { canvas.translate(0, getTitleHeight()); } - boolean drawJavaRings = !mTouchHighlightRegion.isEmpty() - && (mTouchMode == TOUCH_INIT_MODE - || mTouchMode == TOUCH_SHORTPRESS_START_MODE - || mTouchMode == TOUCH_SHORTPRESS_MODE - || mTouchMode == TOUCH_DONE_MODE); - boolean drawNativeRings = !drawJavaRings; - if (sDisableNavcache) { - drawNativeRings = !drawJavaRings && !isInTouchMode(); - } + boolean drawNativeRings = !sDisableNavcache; drawContent(canvas, drawNativeRings); canvas.restoreToCount(saveCount); @@ -4619,18 +4613,13 @@ public class WebView extends AbsoluteLayout invalidate(); } - // paint the highlight in the end - if (drawJavaRings) { - long delay = System.currentTimeMillis() - mTouchHighlightRequested; - if (delay < ViewConfiguration.getTapTimeout()) { - Rect r = mTouchHighlightRegion.getBounds(); - postInvalidateDelayed(delay, r.left, r.top, r.right, r.bottom); - } else { - RegionIterator iter = new RegionIterator(mTouchHighlightRegion); - Rect r = new Rect(); - while (iter.next(r)) { - canvas.drawRect(r, mTouchHightlightPaint); - } + if (mFocusTransition != null) { + mFocusTransition.draw(canvas); + } else if (shouldDrawHighlightRect()) { + RegionIterator iter = new RegionIterator(mTouchHighlightRegion); + Rect r = new Rect(); + while (iter.next(r)) { + canvas.drawRect(r, mTouchHightlightPaint); } } if (DEBUG_TOUCH_HIGHLIGHT) { @@ -9099,10 +9088,112 @@ public class WebView extends AbsoluteLayout } } + private boolean shouldDrawHighlightRect() { + if (mFocusedNode == null || mInitialHitTestResult == null) { + return false; + } + if (mTouchHighlightRegion.isEmpty()) { + return false; + } + if (mFocusedNode.mHasFocus) { + return !mFocusedNode.mEditable; + } + if (mInitialHitTestResult.mType == HitTestResult.UNKNOWN_TYPE) { + return false; + } + long delay = System.currentTimeMillis() - mTouchHighlightRequested; + if (delay < ViewConfiguration.getTapTimeout()) { + Rect r = mTouchHighlightRegion.getBounds(); + postInvalidateDelayed(delay, r.left, r.top, r.right, r.bottom); + return false; + } + return true; + } + + + private FocusTransitionDrawable mFocusTransition = null; + static class FocusTransitionDrawable extends Drawable { + Region mPreviousRegion; + Region mNewRegion; + float mProgress = 0; + WebView mWebView; + Paint mPaint; + int mMaxAlpha; + Point mTranslate; + + public FocusTransitionDrawable(WebView view) { + mWebView = view; + mPaint = new Paint(mWebView.mTouchHightlightPaint); + mMaxAlpha = mPaint.getAlpha(); + } + + @Override + public void setColorFilter(ColorFilter cf) { + } + + @Override + public void setAlpha(int alpha) { + } + + @Override + public int getOpacity() { + return 0; + } + + public void setProgress(float p) { + mProgress = p; + if (mWebView.mFocusTransition == this) { + if (mProgress == 1f) + mWebView.mFocusTransition = null; + mWebView.invalidate(); + } + } + + public float getProgress() { + return mProgress; + } + + @Override + public void draw(Canvas canvas) { + if (mTranslate == null) { + Rect bounds = mPreviousRegion.getBounds(); + Point from = new Point(bounds.centerX(), bounds.centerY()); + mNewRegion.getBounds(bounds); + Point to = new Point(bounds.centerX(), bounds.centerY()); + mTranslate = new Point(from.x - to.x, from.y - to.y); + } + int alpha = (int) (mProgress * mMaxAlpha); + RegionIterator iter = new RegionIterator(mPreviousRegion); + Rect r = new Rect(); + mPaint.setAlpha(mMaxAlpha - alpha); + float tx = mTranslate.x * mProgress; + float ty = mTranslate.y * mProgress; + int save = canvas.save(Canvas.MATRIX_SAVE_FLAG); + canvas.translate(-tx, -ty); + while (iter.next(r)) { + canvas.drawRect(r, mPaint); + } + canvas.restoreToCount(save); + iter = new RegionIterator(mNewRegion); + r = new Rect(); + mPaint.setAlpha(alpha); + save = canvas.save(Canvas.MATRIX_SAVE_FLAG); + tx = mTranslate.x - tx; + ty = mTranslate.y - ty; + canvas.translate(tx, ty); + while (iter.next(r)) { + canvas.drawRect(r, mPaint); + } + canvas.restoreToCount(save); + } + }; + private void setTouchHighlightRects(WebKitHitTest hit) { + FocusTransitionDrawable transition = new FocusTransitionDrawable(this); Rect[] rects = hit != null ? hit.mTouchRects : null; if (!mTouchHighlightRegion.isEmpty()) { invalidate(mTouchHighlightRegion.getBounds()); + transition.mPreviousRegion = new Region(mTouchHighlightRegion); mTouchHighlightRegion.setEmpty(); } if (rects != null) { @@ -9121,7 +9212,13 @@ public class WebView extends AbsoluteLayout + viewRect); } } + transition.mNewRegion = new Region(mTouchHighlightRegion); invalidate(mTouchHighlightRegion.getBounds()); + if (hit.mHasFocus && transition.mPreviousRegion != null) { + mFocusTransition = transition; + ObjectAnimator animator = ObjectAnimator.ofFloat(mFocusTransition, "progress", 1f); + animator.start(); + } } } diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index b6c5612c7e6d..2cc0c7ba4219 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -887,6 +887,7 @@ public final class WebViewCore { boolean mEditable; int mTapHighlightColor = WebView.HIGHLIGHT_COLOR; Rect[] mEnclosingParentRects; + boolean mHasFocus; // These are the input values that produced this hit test int mHitTestX; |