diff options
| author | Adam Powell <adamp@google.com> | 2010-10-04 23:16:00 -0700 |
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2010-10-04 23:16:00 -0700 |
| commit | 41170a1a05830e6c9ec631d73043ccf1878dc0f9 (patch) | |
| tree | a8f44af77cee78954c1424681e56afeaafce7248 /core/java/android/widget/TextView.java | |
| parent | a785a59c831256f274627f8f8eb77f9d54508916 (diff) | |
| parent | abcbb1a1989e8c6adec607b3964dc187f5526e66 (diff) | |
am abcbb1a1: Fix bug 3061544 and some clipping errors.
Merge commit 'abcbb1a1989e8c6adec607b3964dc187f5526e66' into gingerbread-plus-aosp
* commit 'abcbb1a1989e8c6adec607b3964dc187f5526e66':
Fix bug 3061544 and some clipping errors.
Diffstat (limited to 'core/java/android/widget/TextView.java')
| -rw-r--r-- | core/java/android/widget/TextView.java | 75 |
1 files changed, 59 insertions, 16 deletions
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 535047819ce5..8d8d0afc95ed 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -93,6 +93,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewDebug; import android.view.ViewGroup.LayoutParams; +import android.view.ViewParent; import android.view.ViewRoot; import android.view.ViewTreeObserver; import android.view.accessibility.AccessibilityEvent; @@ -192,7 +193,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private static int PRIORITY = 100; - private final int[] mTempCoords = new int[2]; + final int[] mTempCoords = new int[2]; + Rect mTempRect; private ColorStateList mTextColor; private int mCurTextColor; @@ -7651,6 +7653,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private float mOffsetY; private float mHotspotX; private float mHotspotY; + private int mLastParentX; + private int mLastParentY; public HandleView(CursorController controller, Drawable handle) { super(TextView.this.mContext); @@ -7660,8 +7664,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener com.android.internal.R.attr.textSelectHandleWindowStyle); mContainer.setSplitTouchEnabled(true); mContainer.setClippingEnabled(false); - mHotspotX = mDrawable.getIntrinsicWidth() * 0.5f; - mHotspotY = -mDrawable.getIntrinsicHeight() * 0.2f; + + final int handleWidth = mDrawable.getIntrinsicWidth(); + final int handleHeight = mDrawable.getIntrinsicHeight(); + mHotspotX = handleWidth * 0.5f; + mHotspotY = -handleHeight * 0.2f; } @Override @@ -7671,7 +7678,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } public void show() { - if (!isPositionInBounds()) { + if (!isPositionVisible()) { hide(); return; } @@ -7692,7 +7699,12 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return mContainer.isShowing(); } - private boolean isPositionInBounds() { + private boolean isPositionVisible() { + // Always show a dragging handle. + if (mIsDragging) { + return true; + } + final int extendedPaddingTop = getExtendedPaddingTop(); final int extendedPaddingBottom = getExtendedPaddingBottom(); final int compoundPaddingLeft = getCompoundPaddingLeft(); @@ -7704,28 +7716,55 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final int top = 0; final int bottom = hostView.getHeight(); - final int clipLeft = left + compoundPaddingLeft; - final int clipTop = top + extendedPaddingTop; - final int clipRight = right - compoundPaddingRight; - final int clipBottom = bottom - extendedPaddingBottom; + if (mTempRect == null) { + mTempRect = new Rect(); + } + final Rect clip = mTempRect; + clip.left = left + compoundPaddingLeft; + clip.top = top + extendedPaddingTop; + clip.right = right - compoundPaddingRight; + clip.bottom = bottom - extendedPaddingBottom; + + final ViewParent parent = hostView.getParent(); + if (parent == null || !parent.getChildVisibleRect(hostView, clip, null)) { + return false; + } - return mPositionX + mHotspotX >= clipLeft && mPositionX + mHotspotX <= clipRight && - mPositionY + mHotspotY >= clipTop && mPositionY + mHotspotY <= clipBottom; + final int[] coords = mTempCoords; + hostView.getLocationInWindow(coords); + final int posX = coords[0] + mPositionX + (int) mHotspotX; + final int posY = coords[1] + mPositionY; + + return posX >= clip.left && posX <= clip.right && + posY >= clip.top && posY + mHotspotY <= clip.bottom; } private void moveTo(int x, int y) { mPositionX = x - TextView.this.mScrollX; mPositionY = y - TextView.this.mScrollY; - if (isPositionInBounds()) { + if (isPositionVisible()) { + int[] coords = null; if (mContainer.isShowing()){ - final int[] coords = mTempCoords; + coords = mTempCoords; TextView.this.getLocationInWindow(coords); - coords[0] += mPositionX; - coords[1] += mPositionY; - mContainer.update(coords[0], coords[1], mRight - mLeft, mBottom - mTop); + mContainer.update(coords[0] + mPositionX, coords[1] + mPositionY, + mRight - mLeft, mBottom - mTop); } else { show(); } + + if (mIsDragging) { + if (coords == null) { + coords = mTempCoords; + TextView.this.getLocationInWindow(coords); + } + if (coords[0] != mLastParentX || coords[1] != mLastParentY) { + mOffsetX += coords[0] - mLastParentX; + mOffsetY += coords[1] - mLastParentY; + mLastParentX = coords[0]; + mLastParentY = coords[1]; + } + } } else { hide(); } @@ -7752,6 +7791,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final float rawY = ev.getRawY(); mOffsetX = rawX - mPositionX; mOffsetY = rawY - mPositionY; + final int[] coords = mTempCoords; + TextView.this.getLocationInWindow(coords); + mLastParentX = coords[0]; + mLastParentY = coords[1]; mIsDragging = true; break; } |
