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
private Keyboard mKeyboard;
private final KeyDrawParams mKeyDrawParams;
protected final KeyDrawParams mKeyDrawParams;
// Key preview
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
public final int mKeyTextColor;
public final int mKeyTextInactivatedColor;
@ -351,7 +351,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
mDelayAfterPreview = mKeyPreviewDrawParams.mLingerTimeout;
mPaint.setAntiAlias(true);
mPaint.setTextAlign(Align.CENTER);
}
// 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 Typeface face = paint.getTypeface();
final int codePointOffset = reference << 15;
final int codePointOffset = referenceChar << 15;
if (face == Typeface.DEFAULT) {
return codePointOffset + labelSize;
} else if (face == Typeface.DEFAULT_BOLD) {
@ -747,41 +746,35 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
// Working variable for the following methods.
private final Rect mTextBounds = new Rect();
private float getCharHeight(char[] character, Paint paint) {
final Integer key = getCharGeometryCacheKey(character[0], paint);
private float getCharHeight(char[] referenceChar, Paint paint) {
final Integer key = getCharGeometryCacheKey(referenceChar[0], paint);
final Float cachedValue = sTextHeightCache.get(key);
if (cachedValue != null)
return cachedValue;
paint.getTextBounds(character, 0, 1, mTextBounds);
paint.getTextBounds(referenceChar, 0, 1, mTextBounds);
final float height = mTextBounds.height();
sTextHeightCache.put(key, height);
return height;
}
private float getCharWidth(char[] character, Paint paint) {
final Integer key = getCharGeometryCacheKey(character[0], paint);
private float getCharWidth(char[] referenceChar, Paint paint) {
final Integer key = getCharGeometryCacheKey(referenceChar[0], paint);
final Float cachedValue = sTextWidthCache.get(key);
if (cachedValue != null)
return cachedValue;
paint.getTextBounds(character, 0, 1, mTextBounds);
paint.getTextBounds(referenceChar, 0, 1, mTextBounds);
final float width = mTextBounds.width();
sTextWidthCache.put(key, 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);
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,
int height) {
canvas.translate(x, y);
@ -815,6 +808,14 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
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() {
mDrawingHandler.cancelAllMessages();
}

View File

@ -296,17 +296,16 @@ public class MoreKeysKeyboard extends Keyboard {
final int padding = (int)(view.getResources()
.getDimension(R.dimen.more_keys_keyboard_key_horizontal_padding)
+ (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;
for (String moreKeySpec : parentKey.mMoreKeys) {
final String label = KeySpecParser.getLabel(moreKeySpec);
// If the label is single letter, minKeyWidth is enough to hold the label.
if (label != null && StringUtils.codePointCount(label) > 1) {
if (paint == null) {
paint = new Paint();
paint.setAntiAlias(true);
}
final int width = (int)view.getDefaultLabelWidth(label, paint) + padding;
final int width = (int)view.getLabelWidth(label, paint) + padding;
if (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.Keyboard;
import com.android.inputmethod.keyboard.KeyboardSwitcher;
import com.android.inputmethod.keyboard.KeyboardView;
import com.android.inputmethod.keyboard.internal.KeyboardIconsSet;
import com.android.inputmethod.latin.LatinImeLogger;
import com.android.inputmethod.latin.R;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.Utils;
@ -38,8 +36,6 @@ public class MoreSuggestions extends Keyboard {
}
public static class Builder extends Keyboard.Builder<Builder.MoreSuggestionsParam> {
private static final boolean DBG = LatinImeLogger.sDBG;
private final MoreSuggestionsView mPaneView;
private SuggestedWords mSuggestions;
private int mFromPos;
@ -56,10 +52,8 @@ public class MoreSuggestions extends Keyboard {
public int mDividerWidth;
public int layout(SuggestedWords suggestions, int fromPos, int maxWidth, int minWidth,
int maxRow, KeyboardView view) {
int maxRow, MoreSuggestionsView view) {
clearKeys();
final Paint paint = new Paint();
paint.setAntiAlias(true);
final Resources res = view.getContext().getResources();
mDivider = res.getDrawable(R.drawable.more_suggestions_divider);
// TODO: Drawable itself should have an alpha value.
@ -67,6 +61,7 @@ public class MoreSuggestions extends Keyboard {
mDividerWidth = mDivider.getIntrinsicWidth();
final int padding = (int) res.getDimension(
R.dimen.more_suggestions_key_horizontal_padding);
final Paint paint = view.newDefaultLabelPaint();
int row = 0;
int pos = fromPos, rowStartPos = fromPos;
@ -74,7 +69,7 @@ public class MoreSuggestions extends Keyboard {
while (pos < size) {
final String word = suggestions.getWord(pos).toString();
// 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 columnWidth =
(maxWidth - mDividerWidth * (numColumn - 1)) / numColumn;

View File

@ -43,17 +43,17 @@ import com.android.inputmethod.latin.R;
public class MoreSuggestionsView extends KeyboardView implements MoreKeysPanel {
private final int[] mCoordinates = new int[2];
private final KeyDetector mModalPanelKeyDetector;
final KeyDetector mModalPanelKeyDetector;
private final KeyDetector mSlidingPanelKeyDetector;
private Controller mController;
private KeyboardActionListener mListener;
KeyboardActionListener mListener;
private int mOriginX;
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() {
@Override
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.Suggest;
import com.android.inputmethod.latin.SuggestedWords;
import com.android.inputmethod.latin.SuggestedWords.SuggestedWordInfo;
import com.android.inputmethod.latin.Utils;
import java.util.ArrayList;