黑莓CheckBoxField勾选“颜色变化”可以实现吗?

时间:2013-02-17 20:27:28

标签: blackberry checkbox java-me

CheckboxField默认为蓝色勾号,如下图所示。刻度线的颜色可以改为绿色吗?

我认为,必须在paint()方法中完成一些工作。但是,我不确切知道是什么。 我的代码段以及默认的复选框外观如下:

enter image description here

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

1 个答案:

答案 0 :(得分:2)

我希望我知道一种更简单的方式,但是一种可行的方法就是简单地让你的CheckBoxField自定义字段,实际上是一个按钮字段。此自定义字段将为已选中和未选中状态提供不同的图像。

作为此自定义字段的基础,我从BlackBerry Advanced UI开源项目的BitmapButtonField开始,作为模板。这是使用自定义行为创建字段的一个很好的示例。在项目的BitmapButtonField中,他们维护两个图像,一个用于按钮的正常状态,另一个用于焦点状态。在我们的示例中,我们可以维护已选中未选中状态的图像。你当然也可以添加更多的状态,通过检查 - 不专心,检查集中,未检查 - 未集中和未检查为重点。但是,我会把它留给你。这个例子应该告诉你如何做到这一点。

首先,add the BaseButtonField class到您的项目。然后,使用此类扩展它:

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

请参阅下面我使用的两张图片。如果需要,您可以调整它们的大小(它们实际上来自我构建的iPhone Retina应用程序)。如果我选择的绿色不是你想要的,here is the Photoshop tutorial I used to get the image green,从基本的黑白图像,也显示:

enter image description here enter image description here

enter image description here

限制

我没有在这里讨论焦点图。我不知道你想要什么。目前,根本没有焦点图。你可以通过创建两个新的PNG图像来处理它。或者,您可以在drawFocus()中注释掉BaseButtonField方法,该方法将在透明复选框边缘显示默认的BlackBerry蓝色焦点渐变。或者,您可以使图像的白色背景透明,以显示更多的蓝色渐变。或者,您可以使用Graphics#drawShadedFilledPath()paint()中的drawFocus()自行实施绘图。这取决于你。