2012-04-22 11 views
1

私は完全に動作するカスタムビットマップボタンフィールドを持っていますが、画像の背景が白い四角形を表示しています。私はそれが色を白くする場所を見つけましたが、完全に透明にする方法を理解することはできません。何か案は?私は角にFYIボタン画像は、透明性を使用して丸みを帯びた角のpngファイルでのBlackBerry Java JDE 5.0カスタムビットマップボタンのフィールドを透明な背景にするにはどうすればよいですか?

でのプログラミングだ

コード:

public class BitmapButtonField extends Field 
{ 

    Bitmap _currentPicture; 
    private Bitmap _onPicture; 
    Bitmap _offPicture; 
    private int id; 


    public BitmapButtonField (Bitmap onImage, Bitmap offImage) 
    { 
     super(Field.FOCUSABLE|Field.FIELD_HCENTER); 
     _offPicture = offImage; 
     _onPicture = onImage; 
     _currentPicture = _onPicture; 
    } 

    public void setButtonImage (Bitmap onImage, Bitmap offImage) 
    { 
     _offPicture = offImage; 
     _onPicture = onImage; 
     _currentPicture = _onPicture; 
    } 

    public void setButtonId(int id) 
    { 
     this.id = id; 
    } 
    public int getButtonId() 
    { 
     return this.id; 
    }  

    public int getPreferredHeight() 
    { 
     return _onPicture.getHeight(); 
    } 


    public int getPreferredWidth() 
    { 
     return _onPicture.getWidth(); 
    } 

    protected void onFocus(int direction) 
    { 
     _currentPicture = _offPicture; 
     invalidate(); 
    } 

    protected void onUnfocus() 
    { 
     _currentPicture = _onPicture; 
     invalidate(); 
    } 

    protected void drawFocus(Graphics g, boolean on) 
    {   
     g.setBackgroundColor(Color.BLACK); 
    } 

    protected void layout(int width, int height) 
    { 
     setExtent(Math.min(width, getPreferredWidth()), Math.min( 
          height, getPreferredHeight())); 
    } 

    protected void paintBackground(Graphics g) { 
      int prevColor = g.getColor(); 
      int prevAlpha = g.getGlobalAlpha(); 
      g.setColor(Color.YELLOW); 
      g.setGlobalAlpha(0); 
      g.fillRect(0, 0, getWidth(), getHeight()); // or g.getClippingRect() 
      g.setColor(prevColor); 
      g.setGlobalAlpha(prevAlpha); 
     } 

     protected void paint (Graphics graph){ 

     graph.setColor(Color.WHITE); 
     //super.paint(graph); 

     graph.fillRect(0, 0, getWidth(), getHeight()); 
     graph.drawBitmap(0, 0, getWidth(), getHeight(), 
          _currentPicture, 0, 0);  
     } 


    protected boolean navigationClick(int status, int time) 
    { 
     fieldChangeNotify(0); 
     return true; 
    } 

    public boolean keyChar(char key, int status, int time) 
    { 
     if (key == Characters.ENTER) 
     { 
      fieldChangeNotify(0); 
      return true; 
     } 
     return false; 
    } 
} 
+1

あなたは 'protected void drawFocus(Graphics g、boolean on)'と 'protected void paintBackground(Graphics g)'を実装しました。また、フォーカスされた状態の背景画像も指定しています。 'paintBackground'と' drawFocus'の実装を削除することができます。また、グラフィックスの色を白に設定し、四角形を塗りつぶす行は、 'paint'メソッドから削除することができます。つまり、 'paint'メソッドでのみビットマップイメージをペイントする必要があります。私はここであなたのコードを修正しました、http://pastebin.com/g9n8bqYc。あなたはそれを確認することができます(私はそれをテストしていない)。 – Rupak

+0

完璧に機能したRupak!本当にありがとう。私はここであなたに名誉を与えようとしていますが、私に許してくれません:( –

答えて

0

あなたは

protected void drawFocus(Graphics g, boolean on) 

protected void paintBackground(Graphics g) 

を実装しているそして、あなたはまた、合焦状態の背景画像を指定しています。 paintBackground()drawFocus()の実装を削除できます。また、グラフィックスの色を白に設定し、四角形を塗りつぶす線は、メソッドpaintから削除することができます。つまり、ペイント方法でビットマップイメージをペイントするだけです。私はあなたのコード hereを変更しました。(私はそれをテストしなかった)ことを確認することができます。

0

必ずあなたのpaint()メソッドの使用法を作りますdrawARGB:ビットマップを画面に描画します。私は同様の問題"Scale a Bitmap and preserve alpha, on BlackBerry"を持っていました。drawRGBとdrawBitmapはアルファチャンネルを使わないので、何も透明にしません。

+0

私はdrawRGBを使用していません、私は自分のコードを投稿しますので、私が使っているものの良いアイデアを得ることができます: –

+0

あなたは使用しています'graph.drawBitmap(...)'私は最終的にdrawRGBを使用すると信じています。ピクセル描画を直接実装する必要があります - ビットマップでgetARGB(...)を使用し、graph.drawARGB(...)を使用してください –

+0

@私は透明なPNG画像を使用している場合、 'drawBitmap'メソッドはうまく動作し、描画中にアルファチャンネル情報を扱いますまた、(getARGB()と' setARGB() ')。 – Rupak

0

あなたは、あなたのコード(塗料中の()とpaintBackground()メソッド)を白色の矩形を作成するに

graph.setColor(Color.WHITE); 

graph.fillRect(0, 0, getWidth(), getHeight()); 

方法を使用しています。

私はこのコードを削除する必要があると思います。

まだ問題が見つからない場合は、別のカスタムBitmapFieldの例を提供します。

関連する問題