2012-03-19 41 views
0

我正在嘗試更改焦點上的自定義按鈕字段的位圖。我有2張圖片,一張是灰色的,另一張是紅色的,我希望在按鈕被聚焦時交換它們。如何更改焦點上的自定義buttonfield位圖? (Blackberry)

此代碼正在將按鈕抽搐的時間從灰色變爲紅色的幾分之一秒。聚焦時,它被選中,併產生不需要的事件。改變後,它會回到原來的顏色,模擬器凍結。

任何人都可以幫助我們找到這個代碼有什麼問題嗎?

我定製ButtonField字段類:

import net.rim.device.api.system.Bitmap; 
import net.rim.device.api.system.Characters; 
import net.rim.device.api.ui.Color; 
import net.rim.device.api.ui.Graphics; 
import net.rim.device.api.ui.component.BitmapField; 

public class ImageNavbarButtonField extends BitmapField{ 

private Bitmap image; 
private boolean isFocused; 

public ImageNavbarButtonField(Bitmap image) { 
    super(image); 
    this.image = image; 
} 

public boolean isFocusable() { 
    return true; 
} 

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

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

protected void drawFocus(Graphics graphics, boolean on){} 
public void onFocus(){ 
     setBitmap(ImageResizer.generateHitBitmap(image)); 
     invalidate(); 
} 

public void onUnfocus(){ 
     //super.onUnfocus(); 
     setBitmap(image); 
     invalidate(); 
} 

protected void paint(Graphics graphics) { 
    super.paint(graphics); 
} 

protected boolean keyChar(char character, int status, int time) { 
    if(Characters.ENTER == character || Characters.SPACE == character) { 
     fieldChangeNotify(0); 
     return true; 
    } 
    return super.keyChar(character, status, time); 
} 

}

回答

2

試試這個

final imagebutton sav_users = new imagebutton("",Field.FOCUSABLE, "normalimage.png","mouseoverimage.png", 0x9cbe95); 

的ImageButton班組長給予BEL ow-

import net.rim.device.api.ui.*; 
import net.rim.device.api.system.*; 

public class imagebutton extends Field { 

private String _label; 
private int _labelHeight; 
private int _labelWidth; 
private Font _font; 

private Bitmap _currentPicture; 
private Bitmap _onPicture; 
private Bitmap _offPicture; 
int color; 

public imagebutton(String text, long style ,String img, String img_hvr, int color){ 
    super(style); 


    _offPicture = Bitmap.getBitmapResource(img); 
    _onPicture = Bitmap.getBitmapResource(img_hvr); 

    _font = getFont(); 
    _label = text; 
    _labelHeight = _onPicture.getHeight(); 
    _labelWidth = _onPicture.getWidth(); 

    this.color = color; 

    _currentPicture = _offPicture; 
} 

/** 
* @return The text on the button 
*/ 
String getText(){ 
    return _label; 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#getPreferredHeight() 
*/ 
public int getPreferredHeight(){ 
    return _labelHeight; 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#getPreferredWidth() 
*/ 
public int getPreferredWidth(){ 
    return _labelWidth; 
} 

/** 
* Field implementation. Changes the picture when focus is gained. 
* @see net.rim.device.api.ui.Field#onFocus(int) 
*/ 
protected void onFocus(int direction) { 
    _currentPicture = _onPicture; 
    invalidate(); 
} 

/** 
* Field implementation. Changes picture back when focus is lost. 
* @see net.rim.device.api.ui.Field#onUnfocus() 
*/ 
protected void onUnfocus() { 
    _currentPicture = _offPicture; 
    invalidate(); 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#drawFocus(Graphics, boolean) 
*/ 
protected void drawFocus(Graphics graphics, boolean on) { 
    // Do nothing 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#layout(int, int) 
*/ 
protected void layout(int width, int height) { 
    setExtent(Math.min(width, getPreferredWidth()), 
    Math.min(height, getPreferredHeight())); 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#paint(Graphics) 
*/ 
protected void paint(Graphics graphics){  
    // First draw the background colour and picture 
    graphics.setColor(this.color); 
    graphics.fillRect(0, 0, getWidth(), getHeight()); 
    graphics.drawBitmap(0, 0, getWidth(), getHeight(), _currentPicture, 0, 0); 

    // Then draw the text 
    graphics.setColor(Color.BLACK); 
    graphics.setFont(_font); 
    graphics.drawText(_label, 4, 2, 
     (int)(getStyle() & DrawStyle.ELLIPSIS | DrawStyle.HALIGN_MASK), 
     getWidth() - 6); 
} 

/** 
* Overridden so that the Event Dispatch thread can catch this event 
* instead of having it be caught here.. 
* @see net.rim.device.api.ui.Field#navigationClick(int, int) 
*/ 
protected boolean navigationClick(int status, int time){ 
    fieldChangeNotify(1); 
    return true; 
} 

} 
1

你可以創建你的CustomButton是這樣的:

public class ImageNavbarButtonField extends Field{ 

    protected Bitmap image; 
    protected Bitmap inverseImage; 
    protected int fieldWidth; 
    protected int fieldHeight; 

    public ImageNavbarButtonField (Bitmap image,long style) { 
     super(Field.FOCUSABLE | style); 
     this.image = image; 
     this.inverseImage = ImageResizer.generateHitBitmap(image); 
     fieldHeight = image.getHeight(); 
     fieldWidth = image.getWidth(); 
    } 
    public int getPreferredWidth() { 
     return fieldWidth; 
    } 
    public int getPreferredHeight() { 
     return fieldHeight; 
    } 
    protected void paint(Graphics graphics) { 
     if (isFocus()){ 
      graphics.drawBitmap(0,0,fieldWidth,fieldHeight,inverseImage,0,0); 
     }else{ 
      graphics.drawBitmap(0,0,fieldWidth,fieldHeight,image,0,0); 
     } 
    } 
    protected boolean navigationClick(int status, int time) { 
     fieldChangeNotify(0); 
     return true; 
    } 

    protected boolean trackwheelClick(int status, int time) { 
     fieldChangeNotify(0); 
     return true; 
    } 
    protected boolean keyChar(char character, int status, int time) { 
     if(Characters.ENTER == character || Characters.SPACE == character) { 
      fieldChangeNotify(0); 
      return true; 
     } 
     return super.keyChar(character, status, time); 
    } 
} 
1

使用PictureBackgroundButtonField類insted的的Buttonfieldyourcustom class。下面是班級。 `package com.picturebackgroundbuttonfield;

import net.rim.device.api.ui。 ; import net.rim.device.api.system。;

/** *自定義按鈕字段,顯示如何使用圖像作爲按鈕背景。 */ public class PictureBackgroundButtonField extends字段 {
private String _label; private int _labelHeight; private int _labelWidth; private Font _font; 私人位圖_onPicture,_offPicture; 私人位圖_currentPicture;

/** 
* Constructor. 
* @param text The text to be displayed on the button 
* @param style Combination of field style bits to specify display attributes 
*/ 
public PictureBackgroundButtonField(Bitmap onFocus, Bitmap offFocus, String text, long style) 
{ 
    super(style); 
    _onPicture = onFocus; 
    _offPicture = offFocus; 
    _font = getFont(); 
    _label = text; 
    _labelHeight = _onPicture.getHeight(); 
    _labelWidth = _onPicture.getWidth(); 
    _currentPicture = _offPicture; 
} 

/** 
* @return The text on the button 
*/ 
String getText() 
{ 
    return _label; 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#getPreferredHeight() 
*/ 
public int getPreferredHeight() 
{ 
    return _labelHeight; 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#getPreferredWidth() 
*/ 
public int getPreferredWidth() 
{ 
    return _labelWidth; 
} 

/** 
* Field implementation. Changes the picture when focus is gained. 
* @see net.rim.device.api.ui.Field#onFocus(int) 
*/ 
protected void onFocus(int direction) 
{ 
    _currentPicture = _onPicture; 
    // setFont(getFont().derive(Font.BOLD)); 
    invalidate(); 
} 

/** 
* Field implementation. Changes picture back when focus is lost. 
* @see net.rim.device.api.ui.Field#onUnfocus() 
*/ 

protected void onUnfocus() 
{ 
    _currentPicture = _offPicture; 
    // setFont(getFont().derive(Font.PLAIN)); 
    invalidate(); 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#drawFocus(Graphics, boolean) 
*/ 
protected void drawFocus(Graphics graphics, boolean on) 
{ 
    // Do nothing 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#layout(int, int) 
*/ 
protected void layout(int width, int height) 
{ 
    setExtent(Math.min(width, getPreferredWidth()), 
    Math.min(height, getPreferredHeight())); 
} 

/** 
* Field implementation. 
* @see net.rim.device.api.ui.Field#paint(Graphics) 
*/ 

/** 
* Overridden so that the Event Dispatch thread can catch this event 
* instead of having it be caught here.. 
* @see net.rim.device.api.ui.Field#navigationClick(int, int) 
*/ 
protected boolean navigationClick(int status, int time) 
{ 
    fieldChangeNotify(1); 
    return true; 
} 

/*protected void paint(Graphics graphics) { 
    // TODO Auto-generated method stub 

}*/ 

protected void paint(Graphics graphics) 
{  
    graphics.drawBitmap(0, 0, getWidth(), getHeight(), _currentPicture, 0, 0); 
    graphics.setBackgroundColor(Color.BLACK); 
    graphics.drawText(_label, 2, 0, 
      (int)(getStyle() & DrawStyle.ELLIPSIS | DrawStyle.HALIGN_MASK), 
      getWidth() - 6); 
} 

} `

USET它下面的方式..

PictureBackgroundButtonField button = new PictureBackgroundButtonField(onfocusimage,offfocusimage,"",Field.HCENTER); 
manager.add(button); 
相關問題