Skip to content
Snippets Groups Projects
Commit ade16493 authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Include horizontal and vertical gap in the count of Key.isOnKey" into honeycomb-mr2

parents 2d880d56 14de691f
No related branches found
No related tags found
No related merge requests found
...@@ -196,8 +196,8 @@ public class Key { ...@@ -196,8 +196,8 @@ public class Key {
} }
// Horizontal gap is divided equally to both sides of the key. // Horizontal gap is divided equally to both sides of the key.
this.mX = x + mGap / 2; mX = x + mGap / 2;
this.mY = y; mY = y;
final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser), final TypedArray keyAttr = res.obtainAttributes(Xml.asAttributeSet(parser),
R.styleable.Keyboard_Key); R.styleable.Keyboard_Key);
...@@ -350,12 +350,13 @@ public class Key { ...@@ -350,12 +350,13 @@ public class Key {
final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0; final boolean rightEdge = (flags & Keyboard.EDGE_RIGHT) != 0;
final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0; final boolean topEdge = (flags & Keyboard.EDGE_TOP) != 0;
final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0; final boolean bottomEdge = (flags & Keyboard.EDGE_BOTTOM) != 0;
final int left = this.mX; final int left = mX - mGap / 2;
final int right = left + this.mWidth; final int right = left + mWidth + mGap;
final int top = this.mY; final int top = mY;
final int bottom = top + this.mHeight; final int bottom = top + mHeight + mKeyboard.getVerticalGap();
return (x >= left || leftEdge) && (x < right || rightEdge) // In order to mitigate rounding errors, we use (left <= x <= right) here.
&& (y >= top || topEdge) && (y < bottom || bottomEdge); return (x >= left || leftEdge) && (x <= right || rightEdge)
&& (y >= top || topEdge) && (y <= bottom || bottomEdge);
} }
/** /**
...@@ -365,10 +366,10 @@ public class Key { ...@@ -365,10 +366,10 @@ public class Key {
* @return the square of the distance of the point from the nearest edge of the key * @return the square of the distance of the point from the nearest edge of the key
*/ */
public int squaredDistanceToEdge(int x, int y) { public int squaredDistanceToEdge(int x, int y) {
final int left = this.mX; final int left = mX;
final int right = left + this.mWidth; final int right = left + mWidth;
final int top = this.mY; final int top = mY;
final int bottom = top + this.mHeight; final int bottom = top + mHeight;
final int edgeX = x < left ? left : (x > right ? right : x); final int edgeX = x < left ? left : (x > right ? right : x);
final int edgeY = y < top ? top : (y > bottom ? bottom : y); final int edgeY = y < top ? top : (y > bottom ? bottom : y);
final int dx = x - edgeX; final int dx = x - edgeX;
......
...@@ -81,11 +81,11 @@ public abstract class KeyDetector { ...@@ -81,11 +81,11 @@ public abstract class KeyDetector {
* *
* @return Allocates and returns an array that can hold all key indices returned by * @return Allocates and returns an array that can hold all key indices returned by
* {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are * {@link #getKeyIndexAndNearbyCodes} method. All elements in the returned array are
* initialized by {@link #NOT_A_KEY} value. * initialized by {@link #NOT_A_CODE} value.
*/ */
public int[] newCodeArray() { public int[] newCodeArray() {
int[] codes = new int[getMaxNearbyKeys()]; int[] codes = new int[getMaxNearbyKeys()];
Arrays.fill(codes, NOT_A_KEY); Arrays.fill(codes, NOT_A_CODE);
return codes; return codes;
} }
......
...@@ -45,13 +45,15 @@ public class ProximityKeyDetector extends KeyDetector { ...@@ -45,13 +45,15 @@ public class ProximityKeyDetector extends KeyDetector {
* *
* @param keyIndex index of the key. * @param keyIndex index of the key.
* @param distance distance between the key's edge and user touched point. * @param distance distance between the key's edge and user touched point.
* @param isOnKey true if the point is on the key.
* @return order of the key in the nearby buffer, 0 if it is the nearest key. * @return order of the key in the nearby buffer, 0 if it is the nearest key.
*/ */
private int sortNearbyKeys(int keyIndex, int distance) { private int sortNearbyKeys(int keyIndex, int distance, boolean isOnKey) {
final int[] distances = mDistances; final int[] distances = mDistances;
final int[] indices = mIndices; final int[] indices = mIndices;
for (int insertPos = 0; insertPos < distances.length; insertPos++) { for (int insertPos = 0; insertPos < distances.length; insertPos++) {
if (distance < distances[insertPos]) { final int comparingDistance = distances[insertPos];
if (distance < comparingDistance || (distance == comparingDistance && isOnKey)) {
final int nextPos = insertPos + 1; final int nextPos = insertPos + 1;
if (nextPos < distances.length) { if (nextPos < distances.length) {
System.arraycopy(distances, insertPos, distances, nextPos, System.arraycopy(distances, insertPos, distances, nextPos,
...@@ -103,7 +105,7 @@ public class ProximityKeyDetector extends KeyDetector { ...@@ -103,7 +105,7 @@ public class ProximityKeyDetector extends KeyDetector {
final boolean isInside = key.isInside(touchX, touchY); final boolean isInside = key.isInside(touchX, touchY);
final int distance = key.squaredDistanceToEdge(touchX, touchY); final int distance = key.squaredDistanceToEdge(touchX, touchY);
if (isInside || (mProximityCorrectOn && distance < mProximityThresholdSquare)) { if (isInside || (mProximityCorrectOn && distance < mProximityThresholdSquare)) {
final int insertedPosition = sortNearbyKeys(index, distance); final int insertedPosition = sortNearbyKeys(index, distance, isInside);
if (insertedPosition == 0 && isInside) if (insertedPosition == 0 && isInside)
primaryIndex = index; primaryIndex = index;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment