Merge "Adjust touch position for handles using window coordinate." into nyc-dev

am: f2f8e65f98

* commit 'f2f8e65f986a8ba56b5555ab10a8aef121acf3f9':
  Adjust touch position for handles using window coordinate.

Change-Id: I57350227e425f6fb34643224c8e6b9943677e4ef
This commit is contained in:
Keisuke Kuroyanagi
2016-05-03 02:32:48 +00:00
committed by android-build-merger

View File

@@ -2888,6 +2888,7 @@ public class Editor {
private boolean mPositionHasChanged = true;
// Absolute position of the TextView with respect to its parent window
private int mPositionX, mPositionY;
private int mPositionXOnScreen, mPositionYOnScreen;
private int mNumberOfListeners;
private boolean mScrollHasChanged;
final int[] mTempCoords = new int[2];
@@ -2937,6 +2938,14 @@ public class Editor {
return mPositionY;
}
public int getPositionXOnScreen() {
return mPositionXOnScreen;
}
public int getPositionYOnScreen() {
return mPositionYOnScreen;
}
@Override
public boolean onPreDraw() {
updatePosition();
@@ -2962,6 +2971,11 @@ public class Editor {
mPositionX = mTempCoords[0];
mPositionY = mTempCoords[1];
mTextView.getLocationOnScreen(mTempCoords);
mPositionXOnScreen = mTempCoords[0];
mPositionYOnScreen = mTempCoords[1];
}
public void onScrollChanged() {
@@ -3998,6 +4012,8 @@ public class Editor {
private float mIdealVerticalOffset;
// Parent's (TextView) previous position in window
private int mLastParentX, mLastParentY;
// Parent's (TextView) previous position on screen
private int mLastParentXOnScreen, mLastParentYOnScreen;
// Previous text character offset
protected int mPreviousOffset = -1;
// Previous text character offset
@@ -4236,6 +4252,7 @@ public class Editor {
return (int) (getHorizontal(layout, offset) - 0.5f);
}
@Override
public void updatePosition(int parentPositionX, int parentPositionY,
boolean parentPositionChanged, boolean parentScrolled) {
positionAtCursorOffset(getCurrentCursorOffset(), parentScrolled);
@@ -4312,24 +4329,30 @@ public class Editor {
switch (ev.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
startTouchUpFilter(getCurrentCursorOffset());
mTouchToWindowOffsetX = ev.getRawX() - mPositionX;
mTouchToWindowOffsetY = ev.getRawY() - mPositionY;
final PositionListener positionListener = getPositionListener();
mLastParentX = positionListener.getPositionX();
mLastParentY = positionListener.getPositionY();
mLastParentXOnScreen = positionListener.getPositionXOnScreen();
mLastParentYOnScreen = positionListener.getPositionYOnScreen();
final float xInWindow = ev.getRawX() - mLastParentXOnScreen + mLastParentX;
final float yInWindow = ev.getRawY() - mLastParentYOnScreen + mLastParentY;
mTouchToWindowOffsetX = xInWindow - mPositionX;
mTouchToWindowOffsetY = yInWindow - mPositionY;
mIsDragging = true;
mPreviousLineTouched = UNSET_LINE;
break;
}
case MotionEvent.ACTION_MOVE: {
final float rawX = ev.getRawX();
final float rawY = ev.getRawY();
final float xInWindow = ev.getRawX() - mLastParentXOnScreen + mLastParentX;
final float yInWindow = ev.getRawY() - mLastParentYOnScreen + mLastParentY;
// Vertical hysteresis: vertical down movement tends to snap to ideal offset
final float previousVerticalOffset = mTouchToWindowOffsetY - mLastParentY;
final float currentVerticalOffset = rawY - mPositionY - mLastParentY;
final float currentVerticalOffset = yInWindow - mPositionY - mLastParentY;
float newVerticalOffset;
if (previousVerticalOffset < mIdealVerticalOffset) {
newVerticalOffset = Math.min(currentVerticalOffset, mIdealVerticalOffset);
@@ -4341,8 +4364,8 @@ public class Editor {
mTouchToWindowOffsetY = newVerticalOffset + mLastParentY;
final float newPosX =
rawX - mTouchToWindowOffsetX + mHotspotX + getHorizontalOffset();
final float newPosY = rawY - mTouchToWindowOffsetY + mTouchOffsetY;
xInWindow - mTouchToWindowOffsetX + mHotspotX + getHorizontalOffset();
final float newPosY = yInWindow - mTouchToWindowOffsetY + mTouchOffsetY;
updatePosition(newPosX, newPosY);
break;