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