diff options
Diffstat (limited to 'java/src')
4 files changed, 65 insertions, 53 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/Key.java b/java/src/com/android/inputmethod/keyboard/Key.java index 15ec80b6e..735caaebb 100644 --- a/java/src/com/android/inputmethod/keyboard/Key.java +++ b/java/src/com/android/inputmethod/keyboard/Key.java @@ -115,9 +115,10 @@ public class Key { /** Whether this key needs to show the "..." popup hint for special purposes */ private boolean mNeedsSpecialPopupHint; - // keyWidth constants - private static final int KEYWIDTH_FILL_RIGHT = 0; - private static final int KEYWIDTH_FILL_BOTH = -1; + // keyWidth enum constants + private static final int KEYWIDTH_NOT_ENUM = 0; + private static final int KEYWIDTH_FILL_RIGHT = -1; + private static final int KEYWIDTH_FILL_BOTH = -2; private final static int[] KEY_STATE_NORMAL_ON = { android.R.attr.state_checkable, @@ -249,15 +250,17 @@ public class Key { */ public Key(Resources res, KeyboardParams params, KeyboardBuilder.Row row, XmlResourceParser parser, KeyStyles keyStyles) { - final TypedArray keyboardAttr = res.obtainAttributes(Xml.asAttributeSet(parser), R.styleable.Keyboard); mHeight = (int)KeyboardBuilder.getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_rowHeight, params.mHeight, row.mRowHeight) - params.mVerticalGap; - final float horizontalGap = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, - R.styleable.Keyboard_horizontalGap, params.mWidth, params.mHorizontalGap); + final float horizontalGap = isSpacer() ? 0 + : KeyboardBuilder.getDimensionOrFraction(keyboardAttr, + R.styleable.Keyboard_horizontalGap, params.mWidth, params.mHorizontalGap); mVerticalGap = params.mVerticalGap; + final int widthType = KeyboardBuilder.getEnumValue(keyboardAttr, + R.styleable.Keyboard_keyWidth, KEYWIDTH_NOT_ENUM); float keyWidth = KeyboardBuilder.getDimensionOrFraction(keyboardAttr, R.styleable.Keyboard_keyWidth, params.mWidth, row.mDefaultKeyWidth); keyboardAttr.recycle(); @@ -288,11 +291,11 @@ public class Key { keyXPos = x; } } - if (keyWidth == KEYWIDTH_FILL_RIGHT) { + if (widthType == KEYWIDTH_FILL_RIGHT) { // If keyWidth is zero, the actual key width will be determined to fill out the // area up to the right edge of the keyboard. keyWidth = keyboardWidth - keyXPos; - } else if (keyWidth <= KEYWIDTH_FILL_BOTH) { + } else if (widthType == KEYWIDTH_FILL_BOTH) { // If keyWidth is negative, the actual key width will be determined to fill out the // area between the nearest key on the left hand side and the right edge of the // keyboard. @@ -367,6 +370,10 @@ public class Key { mEdgeFlags |= flags; } + public boolean isSpacer() { + return false; + } + public Typeface selectTypeface(Typeface defaultTypeface) { // TODO: Handle "bold" here too? if ((mLabelOption & LABEL_OPTION_FONT_NORMAL) != 0) { @@ -559,4 +566,16 @@ public class Key { } return states; } + + public static class Spacer extends Key { + public Spacer(Resources res, KeyboardParams params, KeyboardBuilder.Row row, + XmlResourceParser parser, KeyStyles keyStyles) { + super(res, params, row, parser, keyStyles); + } + + @Override + public boolean isSpacer() { + return true; + } + } } diff --git a/java/src/com/android/inputmethod/keyboard/KeyboardView.java b/java/src/com/android/inputmethod/keyboard/KeyboardView.java index f45fd3046..acb76cc78 100644 --- a/java/src/com/android/inputmethod/keyboard/KeyboardView.java +++ b/java/src/com/android/inputmethod/keyboard/KeyboardView.java @@ -510,24 +510,26 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { Paint paint, KeyDrawParams params, boolean isManualTemporaryUpperCase) { final boolean debugShowAlign = LatinImeLogger.sVISUALDEBUG; // Draw key background. - final int bgWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight - + params.mPadding.left + params.mPadding.right; - final int bgHeight = key.mHeight + params.mPadding.top + params.mPadding.bottom; - final int bgX = -params.mPadding.left; - final int bgY = -params.mPadding.top; - final int[] drawableState = key.getCurrentDrawableState(); - final Drawable background = params.mKeyBackground; - background.setState(drawableState); - final Rect bounds = background.getBounds(); - if (bgWidth != bounds.right || bgHeight != bounds.bottom) { - background.setBounds(0, 0, bgWidth, bgHeight); - } - canvas.translate(bgX, bgY); - background.draw(canvas); - if (debugShowAlign) { - drawRectangle(canvas, 0, 0, bgWidth, bgHeight, 0x80c00000, new Paint()); + if (!key.isSpacer()) { + final int bgWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight + + params.mPadding.left + params.mPadding.right; + final int bgHeight = key.mHeight + params.mPadding.top + params.mPadding.bottom; + final int bgX = -params.mPadding.left; + final int bgY = -params.mPadding.top; + final int[] drawableState = key.getCurrentDrawableState(); + final Drawable background = params.mKeyBackground; + background.setState(drawableState); + final Rect bounds = background.getBounds(); + if (bgWidth != bounds.right || bgHeight != bounds.bottom) { + background.setBounds(0, 0, bgWidth, bgHeight); + } + canvas.translate(bgX, bgY); + background.draw(canvas); + if (debugShowAlign) { + drawRectangle(canvas, 0, 0, bgWidth, bgHeight, 0x80c00000, new Paint()); + } + canvas.translate(-bgX, -bgY); } - canvas.translate(-bgX, -bgY); // Draw key top visuals. final int keyWidth = key.mWidth - key.mVisualInsetsLeft - key.mVisualInsetsRight; diff --git a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java index 7190b051d..a82bcbed0 100644 --- a/java/src/com/android/inputmethod/keyboard/ProximityInfo.java +++ b/java/src/com/android/inputmethod/keyboard/ProximityInfo.java @@ -122,6 +122,7 @@ public class ProximityInfo { int count = 0; for (int i = 0; i < keys.size(); i++) { final Key key = keys.get(i); + if (key.isSpacer()) continue; if (key.squaredDistanceToEdge(centerX, centerY) < threshold) indices[count++] = i; } diff --git a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java index fb1c06175..e39548e9c 100644 --- a/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/internal/KeyboardBuilder.java @@ -394,12 +394,11 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (skip) { checkEndTag(TAG_KEY, parser); } else { - Key key = new Key(mResources, mParams, row, parser, mKeyStyles); + final Key key = new Key(mResources, mParams, row, parser, mKeyStyles); if (DEBUG) Log.d(TAG, String.format("<%s%s keyLabel=%s code=%d moreKeys=%s />", TAG_KEY, (key.isEnabled() ? "" : " disabled"), key.mLabel, key.mCode, Arrays.toString(key.mMoreKeys))); checkEndTag(TAG_KEY, parser); - mParams.onAddKey(key); endKey(key); } } @@ -409,27 +408,10 @@ public class KeyboardBuilder<KP extends KeyboardParams> { if (skip) { checkEndTag(TAG_SPACER, parser); } else { + final Key.Spacer spacer = new Key.Spacer(mResources, mParams, row, parser, mKeyStyles); if (DEBUG) Log.d(TAG, String.format("<%s />", TAG_SPACER)); - final TypedArray keyboardAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.Keyboard); - if (keyboardAttr.hasValue(R.styleable.Keyboard_horizontalGap)) - throw new IllegalAttribute(parser, "horizontalGap"); - final int keyboardWidth = mParams.mWidth; - final float keyWidth = getDimensionOrFraction(keyboardAttr, - R.styleable.Keyboard_keyWidth, keyboardWidth, row.mDefaultKeyWidth); - keyboardAttr.recycle(); - - final TypedArray keyAttr = mResources.obtainAttributes(Xml.asAttributeSet(parser), - R.styleable.Keyboard_Key); - float keyXPos = getDimensionOrFraction(keyAttr, - R.styleable.Keyboard_Key_keyXPos, keyboardWidth, row.mCurrentX); - if (keyXPos < 0) { - // If keyXPos is negative, the actual x-coordinate will be display_width + keyXPos. - keyXPos += keyboardWidth; - } - checkEndTag(TAG_SPACER, parser); - setSpacer(keyXPos, keyWidth, row); + endKey(spacer); } } @@ -686,7 +668,7 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void startRow(Row row) { row.mCurrentX = 0; - setSpacer(row.mCurrentX, mParams.mHorizontalEdgesPadding, row); + addEdgeSpace(mParams.mHorizontalEdgesPadding, row); mCurrentRow = row; mLeftEdge = true; mRightEdgeKey = null; @@ -699,13 +681,14 @@ public class KeyboardBuilder<KP extends KeyboardParams> { mRightEdgeKey.addEdgeFlags(Keyboard.EDGE_RIGHT); mRightEdgeKey = null; } - setSpacer(row.mCurrentX, mParams.mHorizontalEdgesPadding, row); + addEdgeSpace(mParams.mHorizontalEdgesPadding, row); mCurrentY += mCurrentRow.mRowHeight; mCurrentRow = null; mTopEdge = false; } private void endKey(Key key) { + mParams.onAddKey(key); if (mLeftEdge) { key.addEdgeFlags(Keyboard.EDGE_LEFT); mLeftEdge = false; @@ -719,8 +702,8 @@ public class KeyboardBuilder<KP extends KeyboardParams> { private void endKeyboard() { } - private void setSpacer(float keyXPos, float width, Row row) { - row.mCurrentX = keyXPos + width; + private void addEdgeSpace(float width, Row row) { + row.mCurrentX += width; mLeftEdge = false; mRightEdgeKey = null; } @@ -733,9 +716,16 @@ public class KeyboardBuilder<KP extends KeyboardParams> { return a.getFraction(index, base, base, defValue); } else if (isDimensionValue(value)) { return a.getDimension(index, defValue); - } else if (isIntegerValue(value)) { - // For enum value. - return a.getInt(index, 0); + } + return defValue; + } + + public static int getEnumValue(TypedArray a, int index, int defValue) { + final TypedValue value = a.peekValue(index); + if (value == null) + return defValue; + if (isIntegerValue(value)) { + return a.getInt(index, defValue); } return defValue; } |