もっと簡単な方法を知っていればよかったのですが、確実に機能する方法の 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()
。それはあなた次第です。