1

オブジェクトチョイスフィールドとボタンフィールドなど、ブラックベリーコントロールのフラットな外観を実現しようとしています。

次のコードはうまくいかないようです。(幅の設定は機能しますが、境界線の設定は機能しません。)

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;
}

setBorder ステートメントの有無にかかわらず、同じ外観が得られます。基本的に、3D の外観、影、輝き、角の丸みは必要ありません。

ありがとう

4

1 に答える 1

1

これですべてがうまくいくとは限りませんが、私が OS 4.6 以前のデバイス用に作成したこのカスタム ObjectChoiceField をみることができます。光沢のある 3D の外観を追加したかったのですが、使用したカスタムコードを変更して、よりシンプルでフラットな外観にすることができます。 paint()

私の例では、丸みを帯びた角の半径を 1 に変更し、への呼び出しを削除すると、次のsuper.paint(g)ようになります。

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);
   }
}

そして、次のCustomChoiceFieldように使用します:

   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);

これは製品コードではないため、自分でテストする必要があります。たとえば、 での選択肢の変更は処理されませんsetChoices()。しかし、それは始まりであり、次のようなものが得られます:

ここに画像の説明を入力

最初の 2 つのオブジェクト選択フィールドと、フォーカスされている下のフィールドの色の違いに気付くでしょう。

私のコードには、選択肢を選択するための通常のポップアップと同じポップアップがありますObjectChoiceField。そのため、それでも角が丸くなることがあります。私の場合、ルック アンド フィールを変更する必要はありませんでした。

于 2013-10-01T08:27:32.177 に答える