2012-04-22 87 views
1

我有一个自定义的位图buttonfield,完全可以工作,但是,图像后面的背景显示一个白色的矩形。我发现它使颜色变白,但我无法弄清楚如何使它完全透明。有任何想法吗?我在黑莓的Java编程JDE 5.0如何让我的自定义位图按钮字段使用透明背景?

FYI按钮图像是圆角png文件是在角落使用透明度

代码:

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 2012-04-23 04:28:24

+0

Rupak工作完美!非常感谢你。我试图在这里给你赞誉,但它不让我:( – 2012-04-23 16:18:04

回答

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不使用alpha通道,所以不会留下任何透明的东西。

+0

虽然我没有使用drawRGB,但我会发布我的代码,以便您可以更好地了解我正在使用的内容: – 2012-04-23 03:59:57

+0

您正在使用'graph.drawBitmap(...)',我相信它最终会使用drawRGB,你需要直接实现像素绘图 - 在位图上使用getARGB(...),然后使用graph.drawARGB(...) – 2012-04-23 04:05:37

+0

@ MichaelDonohue,通常如果我使用透明的PNG图像,'drawBitmap'方法效果很好,并且在绘制时处理alpha通道信息。如果我操作图像的数据(透明度)(通过'getARGB()'和' setARGB()')。 – Rupak 2012-04-23 04:31:25

0

您使用的是在你的代码(在paint()方法和paintBackground()方法),这将创建一个白色矩形

graph.setColor(Color.WHITE); 

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

方法。

我认为你需要删除这段代码。

如果您仍然无法找到问题,那么我会提供另一个自定义BitmapField示例。