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

我希望我知道一种更简单的方法,但是肯定会起作用的一种方法是简单地使您CheckBoxField的自定义字段,这实际上是一个按钮字段。对于选中和未选中状态,此自定义字段将具有不同的图像。

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

首先,将 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 );
   }
}

我试图模仿一些原生CheckboxFieldAPI,所以这个新ImageCheckboxField类可以放在你通常使用标准CheckboxField. 我没有模仿标签功能,因为我经常发现我无法使用内置标签,并且最终还是将自己的标签分开LabelField了。

请参阅下面我用于此的两张图片。如果需要,您可以调整它们的大小(它们实际上来自我构建的 iPhone Retina 应用程序)。如果我选择的绿色不是你想要的,这里是我用来获取图像绿色的 Photoshop 教程,从一个基本的黑白图像,也显示:

在此处输入图像描述 在此处输入图像描述

在此处输入图像描述

限制

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

于 2013-02-18T08:55:03.133 回答