Refactor key drawing code in KeyboardView

Change-Id: Ic7af05caee32eb6cba68d27ba4e2d9072472b34d
main
Tadashi G. Takaoka 2012-03-16 16:41:18 +09:00
parent 9945f36406
commit 72913f97ed
5 changed files with 31 additions and 37 deletions

View File

@ -99,7 +99,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
// Main keyboard // Main keyboard
private Keyboard mKeyboard; private Keyboard mKeyboard;
private final KeyDrawParams mKeyDrawParams; protected final KeyDrawParams mKeyDrawParams;
// Key preview // Key preview
private final int mKeyPreviewLayoutId; private final int mKeyPreviewLayoutId;
@ -171,7 +171,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
} }
} }
/* package */ static class KeyDrawParams { protected static class KeyDrawParams {
// XML attributes // XML attributes
public final int mKeyTextColor; public final int mKeyTextColor;
public final int mKeyTextInactivatedColor; public final int mKeyTextInactivatedColor;
@ -351,7 +351,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
mDelayAfterPreview = mKeyPreviewDrawParams.mLingerTimeout; mDelayAfterPreview = mKeyPreviewDrawParams.mLingerTimeout;
mPaint.setAntiAlias(true); mPaint.setAntiAlias(true);
mPaint.setTextAlign(Align.CENTER);
} }
// Read fraction value in TypedArray as float. // Read fraction value in TypedArray as float.
@ -729,10 +728,10 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
} }
} }
private static int getCharGeometryCacheKey(char reference, Paint paint) { private static int getCharGeometryCacheKey(char referenceChar, Paint paint) {
final int labelSize = (int)paint.getTextSize(); final int labelSize = (int)paint.getTextSize();
final Typeface face = paint.getTypeface(); final Typeface face = paint.getTypeface();
final int codePointOffset = reference << 15; final int codePointOffset = referenceChar << 15;
if (face == Typeface.DEFAULT) { if (face == Typeface.DEFAULT) {
return codePointOffset + labelSize; return codePointOffset + labelSize;
} else if (face == Typeface.DEFAULT_BOLD) { } else if (face == Typeface.DEFAULT_BOLD) {
@ -747,41 +746,35 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
// Working variable for the following methods. // Working variable for the following methods.
private final Rect mTextBounds = new Rect(); private final Rect mTextBounds = new Rect();
private float getCharHeight(char[] character, Paint paint) { private float getCharHeight(char[] referenceChar, Paint paint) {
final Integer key = getCharGeometryCacheKey(character[0], paint); final Integer key = getCharGeometryCacheKey(referenceChar[0], paint);
final Float cachedValue = sTextHeightCache.get(key); final Float cachedValue = sTextHeightCache.get(key);
if (cachedValue != null) if (cachedValue != null)
return cachedValue; return cachedValue;
paint.getTextBounds(character, 0, 1, mTextBounds); paint.getTextBounds(referenceChar, 0, 1, mTextBounds);
final float height = mTextBounds.height(); final float height = mTextBounds.height();
sTextHeightCache.put(key, height); sTextHeightCache.put(key, height);
return height; return height;
} }
private float getCharWidth(char[] character, Paint paint) { private float getCharWidth(char[] referenceChar, Paint paint) {
final Integer key = getCharGeometryCacheKey(character[0], paint); final Integer key = getCharGeometryCacheKey(referenceChar[0], paint);
final Float cachedValue = sTextWidthCache.get(key); final Float cachedValue = sTextWidthCache.get(key);
if (cachedValue != null) if (cachedValue != null)
return cachedValue; return cachedValue;
paint.getTextBounds(character, 0, 1, mTextBounds); paint.getTextBounds(referenceChar, 0, 1, mTextBounds);
final float width = mTextBounds.width(); final float width = mTextBounds.width();
sTextWidthCache.put(key, width); sTextWidthCache.put(key, width);
return width; return width;
} }
protected float getLabelWidth(CharSequence label, Paint paint) { public float getLabelWidth(String label, Paint paint) {
paint.getTextBounds(label.toString(), 0, label.length(), mTextBounds); paint.getTextBounds(label.toString(), 0, label.length(), mTextBounds);
return mTextBounds.width(); return mTextBounds.width();
} }
public float getDefaultLabelWidth(String label, Paint paint) {
paint.setTextSize(mKeyDrawParams.mKeyLabelSize);
paint.setTypeface(mKeyDrawParams.mKeyTextStyle);
return getLabelWidth(label, paint);
}
protected static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width, protected static void drawIcon(Canvas canvas, Drawable icon, int x, int y, int width,
int height) { int height) {
canvas.translate(x, y); canvas.translate(x, y);
@ -815,6 +808,14 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
canvas.translate(-x, -y); canvas.translate(-x, -y);
} }
public Paint newDefaultLabelPaint() {
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setTypeface(mKeyDrawParams.mKeyTextStyle);
paint.setTextSize(mKeyDrawParams.mKeyLabelSize);
return paint;
}
public void cancelAllMessages() { public void cancelAllMessages() {
mDrawingHandler.cancelAllMessages(); mDrawingHandler.cancelAllMessages();
} }

View File

@ -296,17 +296,16 @@ public class MoreKeysKeyboard extends Keyboard {
final int padding = (int)(view.getResources() final int padding = (int)(view.getResources()
.getDimension(R.dimen.more_keys_keyboard_key_horizontal_padding) .getDimension(R.dimen.more_keys_keyboard_key_horizontal_padding)
+ (parentKey.hasLabelsInMoreKeys() ? minKeyWidth * LABEL_PADDING_RATIO : 0)); + (parentKey.hasLabelsInMoreKeys() ? minKeyWidth * LABEL_PADDING_RATIO : 0));
Paint paint = null; final Paint paint = view.newDefaultLabelPaint();
paint.setTextSize(parentKey.hasLabelsInMoreKeys()
? view.mKeyDrawParams.mKeyLabelSize
: view.mKeyDrawParams.mKeyLetterSize);
int maxWidth = minKeyWidth; int maxWidth = minKeyWidth;
for (String moreKeySpec : parentKey.mMoreKeys) { for (String moreKeySpec : parentKey.mMoreKeys) {
final String label = KeySpecParser.getLabel(moreKeySpec); final String label = KeySpecParser.getLabel(moreKeySpec);
// If the label is single letter, minKeyWidth is enough to hold the label. // If the label is single letter, minKeyWidth is enough to hold the label.
if (label != null && StringUtils.codePointCount(label) > 1) { if (label != null && StringUtils.codePointCount(label) > 1) {
if (paint == null) { final int width = (int)view.getLabelWidth(label, paint) + padding;
paint = new Paint();
paint.setAntiAlias(true);
}
final int width = (int)view.getDefaultLabelWidth(label, paint) + padding;
if (maxWidth < width) { if (maxWidth < width) {
maxWidth = width; maxWidth = width;
} }

View File

@ -23,9 +23,7 @@ import android.graphics.drawable.Drawable;
import com.android.inputmethod.keyboard.Key; import com.android.inputmethod.keyboard.Key;
import com.android.inputmethod.keyboard.Keyboard; import com.android.inputmethod.keyboard.Keyboard;
import com.android.inputmethod.keyboard.KeyboardSwitcher; import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.keyboard.KeyboardView;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet; import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R; import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.SuggestedWords; import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.Utils; import com.android.inputmethod.latin.Utils;
@ -38,8 +36,6 @@ public class MoreSuggestions extends Keyboard {
} }
public static class Builder extends Keyboard.Builder<Builder.MoreSuggestionsParam> { public static class Builder extends Keyboard.Builder<Builder.MoreSuggestionsParam> {
private static final boolean DBG = LatinImeLogger.sDBG;
private final MoreSuggestionsView mPaneView; private final MoreSuggestionsView mPaneView;
private SuggestedWords mSuggestions; private SuggestedWords mSuggestions;
private int mFromPos; private int mFromPos;
@ -56,10 +52,8 @@ public class MoreSuggestions extends Keyboard {
public int mDividerWidth; public int mDividerWidth;
public int layout(SuggestedWords suggestions, int fromPos, int maxWidth, int minWidth, public int layout(SuggestedWords suggestions, int fromPos, int maxWidth, int minWidth,
int maxRow, KeyboardView view) { int maxRow, MoreSuggestionsView view) {
clearKeys(); clearKeys();
final Paint paint = new Paint();
paint.setAntiAlias(true);
final Resources res = view.getContext().getResources(); final Resources res = view.getContext().getResources();
mDivider = res.getDrawable(R.drawable.more_suggestions_divider); mDivider = res.getDrawable(R.drawable.more_suggestions_divider);
// TODO: Drawable itself should have an alpha value. // TODO: Drawable itself should have an alpha value.
@ -67,6 +61,7 @@ public class MoreSuggestions extends Keyboard {
mDividerWidth = mDivider.getIntrinsicWidth(); mDividerWidth = mDivider.getIntrinsicWidth();
final int padding = (int) res.getDimension( final int padding = (int) res.getDimension(
R.dimen.more_suggestions_key_horizontal_padding); R.dimen.more_suggestions_key_horizontal_padding);
final Paint paint = view.newDefaultLabelPaint();
int row = 0; int row = 0;
int pos = fromPos, rowStartPos = fromPos; int pos = fromPos, rowStartPos = fromPos;
@ -74,7 +69,7 @@ public class MoreSuggestions extends Keyboard {
while (pos < size) { while (pos < size) {
final String word = suggestions.getWord(pos).toString(); final String word = suggestions.getWord(pos).toString();
// TODO: Should take care of text x-scaling. // TODO: Should take care of text x-scaling.
mWidths[pos] = (int)view.getDefaultLabelWidth(word, paint) + padding; mWidths[pos] = (int)view.getLabelWidth(word, paint) + padding;
final int numColumn = pos - rowStartPos + 1; final int numColumn = pos - rowStartPos + 1;
final int columnWidth = final int columnWidth =
(maxWidth - mDividerWidth * (numColumn - 1)) / numColumn; (maxWidth - mDividerWidth * (numColumn - 1)) / numColumn;

View File

@ -43,17 +43,17 @@ import com.android.inputmethod.latin.R;
public class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel { public class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel {
private final int[] mCoordinates = new int[2]; private final int[] mCoordinates = new int[2];
private final KeyDetector mModalPanelKeyDetector; final KeyDetector mModalPanelKeyDetector;
private final KeyDetector mSlidingPanelKeyDetector; private final KeyDetector mSlidingPanelKeyDetector;
private Controller mController; private Controller mController;
private KeyboardActionListener mListener; KeyboardActionListener mListener;
private int mOriginX; private int mOriginX;
private int mOriginY; private int mOriginY;
private static final TimerProxy EMPTY_TIMER_PROXY = new TimerProxy.Adapter(); static final TimerProxy EMPTY_TIMER_PROXY = new TimerProxy.Adapter();
private final KeyboardActionListener mSuggestionsPaneListener = final KeyboardActionListener mSuggestionsPaneListener =
new KeyboardActionListener.Adapter() { new KeyboardActionListener.Adapter() {
@Override @Override
public void onPressKey(int primaryCode) { public void onPressKey(int primaryCode) {

View File

@ -62,7 +62,6 @@ import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.StaticInnerHandlerWrapper; import com.android.inputmethod.latin.StaticInnerHandlerWrapper;
import com.android.inputmethod.latin.Suggest; import com.android.inputmethod.latin.Suggest;
import com.android.inputmethod.latin.SuggestedWords; import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.Utils; import com.android.inputmethod.latin.Utils;
import java.util.ArrayList; import java.util.ArrayList;