我希望我知道一种更简单的方法,但是肯定会起作用的一种方法是简单地使您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 );
}
}
我试图模仿一些原生CheckboxField
API,所以这个新ImageCheckboxField
类可以放在你通常使用标准CheckboxField
. 我没有模仿标签功能,因为我经常发现我无法使用内置标签,并且最终还是将自己的标签分开LabelField
了。
请参阅下面我用于此的两张图片。如果需要,您可以调整它们的大小(它们实际上来自我构建的 iPhone Retina 应用程序)。如果我选择的绿色不是你想要的,这里是我用来获取图像绿色的 Photoshop 教程,从一个基本的黑白图像,也显示:
限制
我没有在这里讨论焦点绘图。我不知道你想要什么。目前,根本没有焦点绘制。您可以通过创建两个新的 PNG 图像来绘制来处理这个问题。或者,您可以注释掉 中的drawFocus()
方法BaseButtonField
,它将在透明复选框边缘周围显示默认的 BlackBerry 蓝色焦点渐变。或者,您可以使图像的白色背景透明,以显示更多的蓝色渐变。或者,您可以使用Graphics#drawShadedFilledPath()
inpaint()
或自己实现绘图drawFocus()
。由你决定。