diff options
| author | Tadashi G. Takaoka <takaoka@google.com> | 2011-01-01 14:07:04 +0900 |
|---|---|---|
| committer | Tadashi G. Takaoka <takaoka@google.com> | 2011-01-06 22:40:20 +0900 |
| commit | cc55d947adce18f315fee80d4008965bac1b50b8 (patch) | |
| tree | 8721451a143709e951107bc1b31a71ff9436fb18 /java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java | |
| parent | ca6533214575904c66e72494cd0bddcb7c7afdaa (diff) | |
Calculate mini keyboard key width from labels
Change-Id: I4259753bd10fdf488fcffacb6b131e30511e780f
Diffstat (limited to 'java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java')
| -rw-r--r-- | java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java index 33d19602d..458a9eed4 100644 --- a/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java +++ b/java/src/com/android/inputmethod/keyboard/MiniKeyboardBuilder.java @@ -16,8 +16,12 @@ package com.android.inputmethod.keyboard; +import com.android.inputmethod.latin.R; + import android.content.Context; import android.content.res.Resources; +import android.graphics.Paint; +import android.graphics.Rect; import java.util.List; @@ -25,6 +29,8 @@ public class MiniKeyboardBuilder { private final Resources mRes; private final Keyboard mKeyboard; private final CharSequence[] mPopupCharacters; + private final int mMiniKeyboardKeyHorizontalPadding; + private final int mKeyWidth; private final int mMaxColumns; private final int mNumRows; private int mColPos; @@ -32,35 +38,61 @@ public class MiniKeyboardBuilder { private int mX; private int mY; - public MiniKeyboardBuilder(Context context, int layoutTemplateResId, Key popupKey) { + public MiniKeyboardBuilder(KeyboardView view, int layoutTemplateResId, Key popupKey) { + final Context context = view.getContext(); mRes = context.getResources(); final Keyboard keyboard = new Keyboard(context, layoutTemplateResId, null); mKeyboard = keyboard; mPopupCharacters = popupKey.mPopupCharacters; - final int numKeys = mPopupCharacters.length; + mMiniKeyboardKeyHorizontalPadding = (int)mRes.getDimension( + R.dimen.mini_keyboard_key_horizontal_padding); + mKeyWidth = getMaxKeyWidth(view, mPopupCharacters, mKeyboard.getKeyWidth()); final int maxColumns = popupKey.mMaxPopupColumn; + mMaxColumns = maxColumns; + final int numKeys = mPopupCharacters.length; int numRows = numKeys / maxColumns; if (numKeys % maxColumns != 0) numRows++; - mMaxColumns = maxColumns; mNumRows = numRows; keyboard.setHeight((keyboard.getRowHeight() + keyboard.getVerticalGap()) * numRows - keyboard.getVerticalGap()); - // TODO: To determine key width we should pay attention to key label length. if (numRows > 1) { mColPos = numKeys % maxColumns; if (mColPos > 0) mColPos = maxColumns - mColPos; // Centering top-row keys. - mX = mColPos * (keyboard.getKeyWidth() + keyboard.getHorizontalGap()) / 2; + mX = mColPos * (mKeyWidth + keyboard.getHorizontalGap()) / 2; } mKeyboard.setMinWidth(0); } + private int getMaxKeyWidth(KeyboardView view, CharSequence[] popupCharacters, int minKeyWidth) { + Paint paint = null; + Rect bounds = null; + int maxWidth = 0; + for (CharSequence popupSpec : popupCharacters) { + final CharSequence label = PopupCharactersParser.getLabel(popupSpec.toString()); + // If the label is single letter, minKeyWidth is enough to hold the label. + if (label.length() > 1) { + if (paint == null) { + paint = new Paint(); + paint.setAntiAlias(true); + } + final int labelSize = view.getLabelSizeAndSetPaint(label, 0, paint); + paint.setTextSize(labelSize); + if (bounds == null) bounds = new Rect(); + paint.getTextBounds(label.toString(), 0, label.length(), bounds); + if (maxWidth < bounds.width()) + maxWidth = bounds.width(); + } + } + return Math.max(minKeyWidth, maxWidth + mMiniKeyboardKeyHorizontalPadding); + } + public Keyboard build() { final Keyboard keyboard = mKeyboard; final List<Key> keys = keyboard.getKeys(); for (CharSequence label : mPopupCharacters) { refresh(); - final Key key = new Key(mRes, keyboard, label, mX, mY, getRowFlags()); + final Key key = new Key(mRes, keyboard, label, mX, mY, mKeyWidth, getRowFlags()); keys.add(key); advance(); } @@ -89,7 +121,7 @@ public class MiniKeyboardBuilder { private void advance() { final Keyboard keyboard = mKeyboard; // TODO: Allocate key position depending the precedence of popup characters. - mX += keyboard.getKeyWidth() + keyboard.getHorizontalGap(); + mX += mKeyWidth + keyboard.getHorizontalGap(); if (mX > keyboard.getMinWidth()) keyboard.setMinWidth(mX); mColPos++; |
