仅仅在 上正确绘制圆角矩形背景就需要做很多工作,这有点愚蠢EditField
,但看起来其他人也遇到了这个问题
解决方案一
如果您调整 Peter Strange 对该问题的回答,您的代码可能MobEditField
如下所示。我将您的匿名EditField
类拆分为一个单独的类,因为添加了很多代码。如果您真的想要,您可以将代码保留为匿名类(我认为这对可读性非常不利)。
private class MobEditField extends EditField {
private boolean _drawFocus = false;
public MobEditField() {
super("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE);
}
protected void paint(Graphics graphics) {
if (!_drawFocus) {
int oldColor = graphics.getColor();
graphics.setColor(Color.WHITE);
graphics.fillRoundRect(0, 0, getWidth() - (getWidth() / 10), getHeight(), 5, 5);
graphics.setColor(Color.BLACK);
graphics.drawText(getText(), 0, 0);
graphics.setColor(oldColor);
}
super.paint(graphics);
}
protected void drawFocus(Graphics graphics, boolean on) {
_drawFocus = on;
super.drawFocus(graphics, on);
_drawFocus = false;
}
protected void onFocus( int direction ) {
super.onFocus( direction );
invalidate();
}
protected void onUnfocus() {
super.onUnfocus();
invalidate();
}
}
然后你就这样做:
ef_mob = new MobEditField();
注意几点:
- 不要
ef_mob.getText()
从匿名类的paint()
方法中调用。只要打电话getText()
。我不知道你的原始代码是如何编译的。
- 最好在覆盖该
paint()
方法时保存初始Graphics
对象颜色(或 alpha,或您更改的任何内容),然后在最后重置它。
- 和方法被
onFocus()
覆盖onUnfocus()
以强制重绘
- 该
paint()
方法只允许super.paint()
在关注该领域时完成所有工作。根据您希望字段的外观,您可能需要稍微调整一下。
解决方案二
对我有用的另一种选择是利用未记录 paintBackground()
的方法EditField
。当然,使用未记录的方法总是有缺点。所以,我只提供它作为一个选项:
ef_mob = new EditField("", "", 11, EditField.NO_NEWLINE|EditField.FILTER_NUMERIC|EditField.FOCUSABLE) {
protected void paint(Graphics graphics) {
int oldColor = graphics.getColor();
graphics.setColor(Color.BLACK);
graphics.drawText(getText(), 0, 0);
graphics.setColor(oldColor);
super.paint(graphics);
}
protected void paintBackground(Graphics g) {
int oldColor = g.getColor();
g.setColor(Color.WHITE);
g.fillRoundRect(0, 0, getWidth()-(getWidth()/10), getHeight(), 5, 5);
g.setColor(oldColor);
}
};
在这里,我将fillRoundRect()
呼叫移出paint()
和移入paintBackground()
.