0

丸い境界線を持つカスタム編集フィールドを作成しました。しかし、カーソルは の上部に表示されていますCustomEditField。カーソル位置をフィールドの中央に変更する方法。この問題について助けが必要です。次のコード スニペットは の実装ですCustomEditField

public CustomEditField() {
    this(0);
    setMaxSize(15);
    setCursorPosition(AXIS_VERTICAL);
}

public CustomEditField(long style) {
    this(new XYEdges(20, 10, 20, 10), Field.FIELD_HCENTER
            | Field.USE_ALL_WIDTH | Field.NON_SPELLCHECKABLE
            | TextField.NO_NEWLINE | CONSUME_INPUT | style);
}

public CustomEditField(String label, String initialValue) {
    this(0);
    setLabel(label);
    setText(initialValue);
}

public CustomEditField(XYEdges points, long style) {
    super(style);
    setPadding(points);
}

/**
 * Paints EditField Background with specified Format values
 */
protected void paintBackground(Graphics graphics) {
    graphics.setColor(Color.WHITE);
    graphics.fillRoundRect(10, getPaddingTop(), getWidth() - 10,
            getHeight() - getPaddingBottom(), 20, 20);
    graphics.setColor(0x686868);
    graphics.drawRoundRect(10, getPaddingTop(), getWidth() - 10,
            getHeight() - getPaddingBottom(), 20, 20);
    graphics.setColor(Color.BLACK);
}
4

1 に答える 1

1

まず、理解を深めるためのいくつかの概念があります。aFieldには、marginpadding、およびborderがあります。 これは、それらが何を表しているかの良い説明です...リンクされた質問はAndroidに関するものでしたが、私の知る限り、AndroidとBlackBerryはこれらの概念を同じように使用しています.

角丸四角形をborderにしたい場合は、それを描画するときに、 paddingの量だけ入って開始しないでください。パディングはボーダーの内側に入るものです。したがって、(x,y) == (0,0) で長方形を描画する必要があります。他のフィールド間のバッファーにするために、境界線の外側にスペースを提供したい場合は、そのためにマージンを使用します。 Fieldオブジェクトには のsetMargin()ような呼び出しがありますsetPadding()

第二に、この方法setCursorPosition()はカーソルのレイアウトをスペースの中央に配置するためのものではありません。 EditField のどの文字にカーソルを合わせるかを設定するためのものです。この問題にあなたが望むものではありません。

また、上記のコードは四角形を対称的にプロットしていません。両側にパディングがある場合は、残りの高さを得るため上下のパッドを引くか、残りの幅を得るために左右を 引く必要があることに注意してください。

とにかく、実際にどのようにCustomEditFieldパッドを入れたいかによって、これを少し変更する必要があるかもしれません. ただし、次の例では、少なくともカーソルが垂直方向の中央に配置される編集フィールドが表示されます。

public class CustomEditField extends BasicEditField {
   public CustomEditField () {
      this(0);
      setMaxSize(15);
      //setCursorPosition(AXIS_VERTICAL); 
   }

   public CustomEditField (long style) {
      this(new XYEdges(20, 10, 20, 10), Field.FIELD_HCENTER | Field.USE_ALL_WIDTH | Field.NON_SPELLCHECKABLE
            | TextField.NO_NEWLINE | CONSUME_INPUT | style);
   }

   public CustomEditField (String label, String initialValue) {
      this(0);
      setLabel(label);
      setText(initialValue);
   }

   public CustomEditField (XYEdges points, long style) {
      super(style);
      setPadding(points);
   }

   /**
    * Paints EditField Background with specified Format values
    */
   protected void paintBackground(Graphics graphics) {
      graphics.setColor(Color.WHITE);
      graphics.fillRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
      graphics.setColor(0x686868);
      graphics.drawRoundRect(0, 0, getWidth(), getHeight(), 20, 20);
      graphics.setColor(Color.BLACK);
   }
}

これにより、角丸四角形の前に、テキストの上に 20 ピクセルのスペースができることに注意してください (デフォルトのコンストラクターを使用する場合)。それはたくさんのように見えます。多分それはあなたが本当に望んでいるものではない. 4 辺すべてのパディングを 10 ピクセルに減らしてからsetMargin()、フィールドで を使用して境界線の外側にスペースを確保することを決定する場合があります。あなたはそれをいじる必要があります。

ちなみに、この問題に対処する別の方法は、私がよく使用するもので、EditField を のManagerように でラップすることVerticalFieldManagerです。それを行いadd()、 EditField を VerticalFieldManager に、スタイル flags =Field.FIELD_VCENTERで設定すると、目標も達成されるはずです。しかし、この場合、それは必要ないと思います。

于 2012-06-10T05:41:11.177 に答える