Cela pourrait ne pas faire tout que vous voulez, mais vous pouvez essayer de regarder at this custom ObjectChoiceField que je construit pour OS 4.6 et dispositifs inférieurs. Je voulais ajouter un aspect 3D brillant, mais vous pouvez changer le code personnalisé paint()
que j'ai utilisé pour faire un look plus simple et plus plat.
Prenant mon exemple, en changeant le rayon de coin arrondi à 1, et le retrait de l'appel à super.paint(g)
donne quelque chose comme ceci:
public class CustomChoiceField extends ObjectChoiceField {
private int _bgWidth = 0;
private int _bgHeight = 0;
private int _numChoices = 0;
private boolean _hasFocus = false;
private static final int HIGHLIGHT_COLOR = 0xFF185AB5; // blue-ish
private static final int RADIUS = 1; // rounded corner radius in pixels
private static final int DFLT_PADDING = 20;
public CustomChoiceField(Object[] choices, int initialIndex) {
super("", choices, initialIndex);
_numChoices = choices.length;
}
public int getPreferredHeight() {
return _bgHeight;
}
public int getPreferredWidth() {
return _bgWidth;
}
protected void layout(int width, int height) {
if (_bgWidth == 0 || _bgHeight == 0) {
if (height <= Display.getHeight()) {
// probably using custom Manager to specify size
_bgWidth = width;
_bgHeight = height;
} else {
// use default sizing
_bgHeight = DFLT_PADDING + getHeightOfChoices();
for (int i = 0; i < _numChoices; i++) {
_bgWidth = Math.max(_bgWidth, DFLT_PADDING + getWidthOfChoice(i));
}
}
}
super.layout(_bgWidth, _bgHeight);
super.setExtent(_bgWidth, _bgHeight);
}
protected void applyTheme(Graphics arg0, boolean arg1) {
// do nothing
}
protected void drawFocus(Graphics g, boolean on) {
// do nothing .. handled manually in paint(g)
}
protected void onFocus(int direction) {
_hasFocus = true;
super.onFocus(direction);
invalidate();
}
protected void onUnfocus() {
_hasFocus = false;
super.onUnfocus();
invalidate(); // required to clear focus
}
protected void paint(Graphics g) {
int oldColor = g.getColor();
// field color depends on whether we have focus or not
int bgColor = (_hasFocus) ? HIGHLIGHT_COLOR : Color.BLACK;
// when the field has focus, we make it a little less transparent
int alpha = (_hasFocus) ? 0xDD : 0xBB;
g.setColor(bgColor);
g.setGlobalAlpha(alpha);
g.fillRoundRect(0, 0, _bgWidth, _bgHeight, RADIUS, RADIUS);
// draw a plain white line as a border
g.setColor(Color.WHITE);
g.setGlobalAlpha(0xFF);
g.drawRoundRect(0, 0, _bgWidth, _bgHeight, RADIUS, RADIUS);
// draw the currently selected choice's text (also in white)
String text = (String)getChoice(getSelectedIndex());
int y = (_bgHeight - getFont().getHeight())/2;
g.drawText(text, 0, y, DrawStyle.HCENTER | DrawStyle.TOP, _bgWidth);
g.setColor(oldColor);
}
}
et que vous utilisez le CustomChoiceField
comme ceci:
private ObjectChoiceField[] ocf = new ObjectChoiceField[3];
public ObjectChoiceScreen() {
super(MainScreen.VERTICAL_SCROLL | MainScreen.VERTICAL_SCROLLBAR);
Object[] choices1 = new Object[] { "one", "two", "three" };
ocf[0] = new CustomChoiceField(choices1, 0);
Object[] choices2 = new Object[] { "ichi", "ni", "san" };
ocf[1] = new CustomChoiceField(choices2, 0);
Object[] choices3 = new Object[] { "uno", "dos", "tres" };
ocf[2] = new CustomChoiceField(choices3, 0);
for (int i = 0; i < ocf.length; i++) {
ocf[i].setMargin(new XYEdges(10, 10, 10, 10));
}
getMainManager().addAll(ocf);
Ce n'est pas un code de production, vous devrez donc le tester vous-même. Par exemple, il ne gère pas la modification des choix avec setChoices()
. Mais, il est un début, et vous obtiendrez quelque chose comme ceci:
Vous remarquerez la différence de couleur entre les deux premiers champs de choix d'objet, et celui du bas, qui se concentre.
Mon code a le même popup pour sélectionner les choix que le ObjectChoiceField
normal. Donc, vous pouvez toujours obtenir des coins arrondis de cette façon. Dans mon cas, je n'avais pas besoin de changer cet aspect, donc je ne suis pas sûr de savoir comment vous pourriez changer ça aussi.
Merci Nate. Je viens de prendre la partie de peinture prioritaire et ça marche bien. La couleur de mise au point du focus semble avoir quelques problèmes peut-être parce que je n'ai pas pris le reste du code. –
@RazaAli, de rien. Oui, la peinture de focus nécessite le reste du code, en dehors de 'paint()'. Mais, si vous voulez que votre mise en évidence soit différente, vous n'avez certainement pas besoin de l'utiliser. Si vous avez trouvé la réponse utile, veuillez considérer l'upvoting, ainsi que l'acceptation de la réponse (ce que vous avez fait). Merci! – Nate
En fait, le problème auquel je suis confronté est que la première fois qu'il se concentre sur le contrôle de choix, il met en évidence la moitié gauche seulement. Lorsque je change de focus et que je reviens au contrôle, il se met correctement en surbrillance. Je n'ai pas encore eu l'occasion de creuser là-dedans. –