2013-09-30 1 views
1

J'essaie d'obtenir un look plat pour les contrôles blackberry, à savoir objectchoicefield et buttonfield.Enlever l'effet surélevé dans blackberry objectchoicefield et boutonfield

Le code suivant ne semble pas faire l'affaire. (Le réglage de la largeur fonctionne, mais pas la mise à la frontière.)

public static ObjectChoiceField GetDropdownList(String label, String[] data) 
{ 
    ObjectChoiceField ocf = new ObjectChoiceField(null, data, 0, Field.FIELD_LEFT); 

    ocf.setBorder(BorderFactory.createSimpleBorder(new XYEdges(0,0,0,0))); 
    ocf.setMinimalWidth(Display.getWidth()-61); 

    return ocf; 
} 

je reçois la même apparence avec ou sans l'instruction setBorder. Fondamentalement, je ne veux pas de look 3D ou d'ombre ou de brillance ou de coins arrondis.

Merci

Répondre

1

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:

enter image description here

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.

+0

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. –

+0

@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

+0

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. –