0

CheckboxFieldのデフォルトは、下の図のように青い目盛りです。目盛りの色を緑に変更できますか?

メソッドでいくつかの作業を行う必要があるpaint()と思います。しかし、正確にはわかりません。私のコードスニペットとデフォルトのチェックボックスの外観は次のとおりです。

ここに画像の説明を入力

CheckboxField checkBoxComments = new CheckboxField("CheckBox",true) {
    protected void paint(Graphics g) {
        // what to do here?
        super.paint(g);
    }
    protected void applyTheme(Graphics arg0, boolean arg1) {
        // do something here? 
    }
};
4

1 に答える 1

2

もっと簡単な方法を知っていればよかったのですが、確実に機能する方法の 1 つCheckBoxFieldは、実際にはボタンフィールドであるカスタム フィールドを作成することです。このカスタム フィールドは、チェックされている状態とチェックされていない状態で異なる画像になります。

このカスタム フィールドの基礎として、BlackBerry Advanced UI オープン ソース プロジェクトのBitmapButtonFieldをテンプレートとして使い始めました。これは、カスタム動作でフィールドを作成する良い例です。プロジェクトのでは、ボタンの通常状態用とフォーカスBitmapButtonField状態用の 2 つのイメージを維持します。私たちの場合、チェックされた状態とチェックされていない状態の画像を維持できます。チェック済み-フォーカスなし、チェック済み-フォーカス済み、チェック済み-フォーカスなし、チェック済み-フォーカス済みにすることで、さらに状態を追加することもできます。しかし、私はあなたに任せます。この例は、その方法を示しています。

まず、BaseButtonField クラスをプロジェクトに追加します。次に、このクラスでそれを拡張します。

public class ImageCheckboxField extends BaseButtonField {

   private boolean _checked = false;
   private Bitmap[] _bitmaps;
   private static final int UNCHECKED = 0;
   private static final int CHECKED = 1;
   //private static final int FOCUS_UNCHECKED = 2;
   //private static final int FOCUS_CHECKED = 3;

   public ImageCheckboxField( boolean checked )
   {
      this( checked, 0 );
   }

   public ImageCheckboxField( boolean checked, long style ) 
   {
      // TODO: if you're going to use multiple instances, you 
      //  may want to optimize to avoid loading these PNGs each time
      this( checked, Bitmap.getBitmapResource("box-unchecked.png"), Bitmap.getBitmapResource("box-checked.png"), style);
   }

   protected ImageCheckboxField( boolean checked,  Bitmap uncheckedState, Bitmap checkedState )
   {        
      this( checked, uncheckedState, checkedState, 0 );
   }

   protected ImageCheckboxField( boolean checked, Bitmap uncheckedState, Bitmap checkedState, long style ) {
      super( Field.FOCUSABLE | style );

      if( (uncheckedState.getWidth() != checkedState.getWidth())
            || (uncheckedState.getHeight() != checkedState.getHeight()) ){

         throw new IllegalArgumentException( "Image sizes don't match" );
      }

      _bitmaps = new Bitmap[] { uncheckedState, checkedState };
   }

   public void clickButton() {
      // override this to toggle state on click
      setChecked(!getChecked());
      super.clickButton();
   }

   public void setChecked(boolean checked) {
      _checked = checked;
      invalidate();
   }

   public boolean getChecked() {
      return _checked;
   }        

   private void setImage( Bitmap uncheckedState ){
      _bitmaps[UNCHECKED] = uncheckedState;
      invalidate();
   }

   private void setCheckedImage( Bitmap checkedState ){
      _bitmaps[CHECKED] = checkedState;
      invalidate();
   }

   public int getPreferredWidth() {
      return _bitmaps[UNCHECKED].getWidth();
   }

   public int getPreferredHeight() {
      return _bitmaps[UNCHECKED].getHeight();
   }

   protected void layout( int width, int height ) {
      setExtent( _bitmaps[UNCHECKED].getWidth(), _bitmaps[UNCHECKED].getHeight() );
   }

   protected void paint( Graphics g ) {
      // TODO: uncomment this if you draw different images based on focus
      //boolean focused = g.isDrawingStyleSet( Graphics.DRAWSTYLE_FOCUS );
      int index = UNCHECKED;
      //if (focused) {
      //   index = getChecked() ? FOCUS_CHECKED : FOCUS_UNCHECKED;
      //} else {
      index = getChecked() ? CHECKED : UNCHECKED;
      //}      
      g.drawBitmap( 0, 0, _bitmaps[index].getWidth(), _bitmaps[index].getHeight(), _bitmaps[index], 0, 0 );
   }

   /**
    * With this commented out the default focus will show through
    * If an app doesn't want focus colours then it should override this and do nothing
    **/
   /*
       protected void paintBackground( Graphics g ) {
           // Nothing to do here
       }
    */

   protected void drawFocus( Graphics g, boolean on ) {
      // Paint() handles it all
      g.setDrawingStyle( Graphics.DRAWSTYLE_FOCUS, true );
      paintBackground( g );
      paint( g );
   }
}

CheckboxFieldネイティブAPIのいくつかを模倣しようとしたので、この新しいImageCheckboxFieldクラスは、通常は標準を使用する場所にドロップできますCheckboxField。私はラベル機能を真似しませんでした。なぜなら、組み込みのラベルを使用できず、いずれにしても独自の別のラベルを配置することになることがよくあるからLabelFieldです。

これに使用した 2 つの画像については、以下を参照してください。必要に応じてサイズを変更できます (実際には、私が作成した iPhone Retina アプリから取得したものです)。私が選んだ緑があなたが望むものではない場合、これも示されている基本的な白黒画像から画像 green を取得するために使用した Photoshop チュートリアルです。

ここに画像の説明を入力 ここに画像の説明を入力

ここに画像の説明を入力

制限事項

ここではフォーカス描画については触れませんでした。私はあなたがそれについて何を望んでいるのかわかりません。現在、フォーカス描画はまったくありません。描画する 2 つの新しい PNG 画像を作成することで、それを処理できます。drawFocus()または、 のメソッドをコメント アウトすることもできますBaseButtonField。これにより、透明なチェック ボックスのエッジの周りにデフォルトの BlackBerry ブルー フォーカス グラデーションが表示されます。または、画像の白い背景を透明にして、青のグラデーションがさらに透けて見えるようにすることもできます。Graphics#drawShadedFilledPath()または、 またはのいずれかpaint()を使用して、自分で描画を実装することもできますdrawFocus()。それはあなた次第です。

于 2013-02-18T08:55:03.133 に答える