diff options
| author | 2018-03-29 22:16:58 +0000 | |
|---|---|---|
| committer | 2018-03-29 22:16:58 +0000 | |
| commit | 3708933872cabb63f0a3042fe611cbb36d435b21 (patch) | |
| tree | 2f04e42f4315c9764bf3e846f2024f67d358b96a | |
| parent | 2254fe2e04fe2d06fd8ea43b2f8ca3b8ed56cec9 (diff) | |
| parent | b1b423a46f187c978ba7d7b7572890ea8e75ba56 (diff) | |
Merge "[Magnifier-37] Hide handle when overlaps magnifier" into pi-dev
| -rw-r--r-- | core/java/android/widget/Editor.java | 40 |
1 files changed, 30 insertions, 10 deletions
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 92f496a87c3f..99467265b5c5 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -4585,8 +4585,8 @@ public class Editor { return mContainer.isShowing(); } - private boolean isVisible() { - // Always show a dragging handle. + private boolean shouldShow() { + // A dragging handle should always be shown. if (mIsDragging) { return true; } @@ -4599,6 +4599,10 @@ public class Editor { mPositionX + mHotspotX + getHorizontalOffset(), mPositionY); } + private void setVisible(final boolean visible) { + mContainer.getContentView().setVisibility(visible ? VISIBLE : INVISIBLE); + } + public abstract int getCurrentCursorOffset(); protected abstract void updateSelection(int offset); @@ -4692,7 +4696,7 @@ public class Editor { onHandleMoved(); } - if (isVisible()) { + if (shouldShow()) { // Transform to the window coordinates to follow the view tranformation. final int[] pts = { mPositionX + mHotspotX + getHorizontalOffset(), mPositionY}; mTextView.transformFromViewToWindowSpace(pts); @@ -4745,6 +4749,15 @@ public class Editor { return 0; } + private boolean tooLargeTextForMagnifier() { + final float magnifierContentHeight = Math.round( + mMagnifierAnimator.mMagnifier.getHeight() + / mMagnifierAnimator.mMagnifier.getZoom()); + final Paint.FontMetrics fontMetrics = mTextView.getPaint().getFontMetrics(); + final float glyphHeight = fontMetrics.descent - fontMetrics.ascent; + return glyphHeight > magnifierContentHeight; + } + /** * Computes the position where the magnifier should be shown, relative to * {@code mTextView}, and writes them to {@code showPosInView}. Also decides @@ -4824,13 +4837,12 @@ public class Editor { return true; } - private boolean tooLargeTextForMagnifier() { - final float magnifierContentHeight = Math.round( - mMagnifierAnimator.mMagnifier.getHeight() - / mMagnifierAnimator.mMagnifier.getZoom()); - final Paint.FontMetrics fontMetrics = mTextView.getPaint().getFontMetrics(); - final float glyphHeight = fontMetrics.descent - fontMetrics.ascent; - return glyphHeight > magnifierContentHeight; + private boolean handleOverlapsMagnifier() { + final int handleY = mContainer.getDecorViewLayoutParams().y; + final int magnifierBottomWhenAtWindowTop = + mTextView.getRootWindowInsets().getSystemWindowInsetTop() + + mMagnifierAnimator.mMagnifier.getHeight(); + return handleY <= magnifierBottomWhenAtWindowTop; } protected final void updateMagnifier(@NonNull final MotionEvent event) { @@ -4846,6 +4858,13 @@ public class Editor { mRenderCursorRegardlessTiming = true; mTextView.invalidateCursorPath(); suspendBlink(); + // Hide handle if it overlaps the magnifier. + if (handleOverlapsMagnifier()) { + setVisible(false); + } else { + setVisible(true); + } + mMagnifierAnimator.show(showPosInView.x, showPosInView.y); } else { dismissMagnifier(); @@ -4857,6 +4876,7 @@ public class Editor { mMagnifierAnimator.dismiss(); mRenderCursorRegardlessTiming = false; resumeBlink(); + setVisible(true); } } |