0

我创建了一个 SliderField 类,以便在我的 BlackBerry 应用程序中显示一个可拖动的滑块。滑块主要用于设置应用程序中位置更新(通过 GPS)的间隔。该应用程序基于 OS 5.0 构建,因此未找到 SliderField 的 API。我面临的问题是,随着滑块的移动,我需要增加标签中的整数值。例如,如果标签中的整数值为 1,并且用户移动滑块,则该值应增加到 5、10、15 等。我不知道如何将移动滑块与增加标签字段中的值联系起来。有人可以帮忙吗?我将 SliderField 对象添加到屏幕,如下所示:

Bitmap sliderBack = Bitmap.getBitmapResource( "progress51.png" );
    Bitmap sliderFocus = Bitmap.getBitmapResource( "progress51.png" );
    Bitmap sliderThumb = Bitmap.getBitmapResource( "butt.png" );
SliderField theSlider = new SliderField( sliderThumb, sliderBack, sliderFocus,20, 1, 1, 1 );
         secondHFM.add(theSlider)

下面是我的 SliderField 类的代码。

public class SliderField extends Field
 {
 Bitmap _imageThumb;

Bitmap _imageSlider;
Bitmap _imageSliderLeft;
Bitmap _imageSliderCenter;
Bitmap _imageSliderRight;

Bitmap _imageSliderFocus;
Bitmap _imageSliderFocusLeft;
Bitmap _imageSliderFocusCenter;
Bitmap _imageSliderFocusRight;

private int _numStates;
private int _currentState;
private boolean _selected;

private int _xLeftBackMargin;
private int _xRightBackMargin;

private int _thumbWidth;
private int _thumbHeight;

private int _totalHeight;
private int _totalWidth;

private int _rop;

private int _backgroundColours[];
private int _backgroundSelectedColours[];

private int _defaultSelectColour = 0x977DED;
private int _defaultBackgroundColour = 0x000000;
private int _defaultHoverColour = 0x999999;


public SliderField( Bitmap thumb
            , Bitmap sliderBackground
            , int numStates
            , int initialState
            , int xLeftBackMargin
            , int xRightBackMargin )
{
    this( thumb, sliderBackground, sliderBackground, numStates, initialState, xLeftBackMargin, xRightBackMargin, FOCUSABLE );
}

public SliderField( Bitmap thumb
            , Bitmap sliderBackground
            , int numStates
            , int initialState
            , int xLeftBackMargin
            , int xRightBackMargin
            , long style )
{  
    this( thumb, sliderBackground, sliderBackground, numStates, initialState, xLeftBackMargin, xRightBackMargin, style );
}

public SliderField( Bitmap thumb
            , Bitmap sliderBackground
            , Bitmap sliderBackgroundFocus
            , int numStates
            , int initialState
            , int xLeftBackMargin
            , int xRightBackMargin )
{
    this( thumb, sliderBackground, sliderBackgroundFocus, numStates, initialState, xLeftBackMargin, xRightBackMargin, FOCUSABLE );
}

public SliderField( Bitmap thumb
            , Bitmap sliderBackground
            , Bitmap sliderBackgroundFocus
            , int numStates
            , int initialState
            , int xLeftBackMargin
            , int xRightBackMargin
            , long style )
{
    super( style );

    if( initialState > numStates || numStates < 2 ){
    }
    _imageThumb = thumb;
    _imageSlider = sliderBackground;
    _imageSliderFocus = sliderBackgroundFocus;
    _numStates = numStates;
    setState( initialState );

    _xLeftBackMargin = xLeftBackMargin;
    _xRightBackMargin = xRightBackMargin;

    _rop = _imageSlider.hasAlpha() ? Graphics.ROP_SRC_ALPHA : Graphics.ROP_SRC_COPY;

    _thumbWidth = thumb.getWidth();
    _thumbHeight = thumb.getHeight();
    initBitmaps();
}              
public SliderField( Bitmap thumb
            , Bitmap sliderBackground
            , int numStates
            , int initialState
            , int xLeftBackMargin
            , int xRightBackMargin
            , int[] colours
            , int[] selectColours )
{
    this(thumb, sliderBackground, sliderBackground, numStates, initialState, xLeftBackMargin, xRightBackMargin, FOCUSABLE );

    if( colours.length != numStates+1 ){
        throw new IllegalArgumentException();
    }
    _backgroundColours = colours;
    _backgroundSelectedColours = selectColours;
}
public void initBitmaps()
{
    int height = _imageSlider.getHeight();

    _imageSliderLeft = new Bitmap( _xLeftBackMargin, height );
    _imageSliderCenter = new Bitmap( _imageSlider.getWidth() - _xRightBackMargin - _xLeftBackMargin, height);
    _imageSliderRight = new Bitmap( _xRightBackMargin, height );

    copy( _imageSlider, 0, 0, _xLeftBackMargin, height, _imageSliderLeft );
    copy( _imageSlider, _xLeftBackMargin, 0, _imageSlider.getWidth() - _xRightBackMargin - _xLeftBackMargin, height, _imageSliderCenter);
    copy( _imageSlider, _imageSlider.getWidth() - _xRightBackMargin, 0, _xRightBackMargin, height, _imageSliderRight);

    _imageSliderFocusLeft = new Bitmap( _xLeftBackMargin, height );
    _imageSliderFocusCenter = new Bitmap( _imageSlider.getWidth() - _xRightBackMargin - _xLeftBackMargin, height);
    _imageSliderFocusRight = new Bitmap( _xRightBackMargin, height );

    copy( _imageSliderFocus, 0, 0, _xLeftBackMargin, height, _imageSliderFocusLeft );
    copy( _imageSliderFocus, _xLeftBackMargin, 0, _imageSlider.getWidth() - _xRightBackMargin - _xLeftBackMargin, height, _imageSliderFocusCenter);
    copy( _imageSliderFocus, _imageSlider.getWidth() - _xRightBackMargin, 0, _xRightBackMargin, height, _imageSliderFocusRight);
}
private void copy(Bitmap src, int x, int y, int width, int height, Bitmap dest) {
    int[] argbData = new int[width * height];
    src.getARGB(argbData, 0, width, x, y, width, height);
    for(int tx = 0; tx < dest.getWidth(); tx += width) {
        for(int ty = 0; ty < dest.getHeight(); ty += height) {
            dest.setARGB(argbData, 0, width, tx, ty, width, height);
        }
    }
}
public void setState(int newState) {
    if( newState > _numStates ){
        throw new IllegalArgumentException();
    } else {
        _currentState = newState;
        invalidate();
    }
}
public int getState() {
    return _currentState;
}
public int getNumStates() {
    return _numStates;
}
public int getColour() {
    if(_backgroundSelectedColours != null) {
        return _backgroundSelectedColours[getState()];
    }
    return 0x000000;
}

public int getPreferredWidth() {
    return _totalWidth;
}

public int getPreferredHeight() {
    return _totalHeight;
}
protected void layout( int width, int height ) {
    if (width < 0 || height < 0)
        throw new IllegalArgumentException();
    _totalWidth = width;
    _totalHeight = Math.max(_imageSlider.getHeight(), _imageThumb.getHeight());

    setExtent( _totalWidth, _totalHeight );
}

public void paint( Graphics g )
{
    int sliderHeight = _imageSlider.getHeight();
    int sliderBackYOffset = ( _totalHeight - sliderHeight ) >> 1;
    int backgroundColor = _defaultBackgroundColour;
    if( _backgroundSelectedColours != null || _backgroundColours != null ) {

        if( _selected ) {
            backgroundColor = _backgroundSelectedColours != null ? _backgroundSelectedColours[getState()] : _defaultSelectColour;
        } else if(g.isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS)) {
            backgroundColor = _backgroundColours != null ? _backgroundColours[getState()] : _defaultHoverColour;
        } else {
            backgroundColor = _defaultBackgroundColour;
        }
    }
    g.setColor( backgroundColor );
    g.fillRect( 1, sliderBackYOffset + 1, _totalWidth - 2, sliderHeight - 2 );

    if(g.isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS)) {    
        paintSliderBackground( g, _imageSliderFocusLeft, _imageSliderFocusCenter, _imageSliderFocusRight );
    } else {
        paintSliderBackground( g, _imageSliderLeft, _imageSliderCenter, _imageSliderRight );
    }
    int thumbXOffset = ( ( _totalWidth - _thumbWidth ) * _currentState ) / _numStates;
    g.drawBitmap( thumbXOffset, ( _totalHeight - _thumbHeight ) >> 1, _thumbWidth, _thumbHeight, _imageThumb, 0, 0 );
}

private void paintSliderBackground( Graphics g, Bitmap left, Bitmap middle, Bitmap right ) 
{
    int sliderHeight = _imageSlider.getHeight();
    int sliderBackYOffset = ( _totalHeight - sliderHeight ) >> 1;
    g.drawBitmap( 0, sliderBackYOffset, _xLeftBackMargin, sliderHeight, left, 0, 0 );
    g.tileRop( _rop, _xRightBackMargin, sliderBackYOffset, _totalWidth - _xLeftBackMargin - _xRightBackMargin, sliderHeight, middle, 0, 0 );
    g.drawBitmap( _totalWidth - _xRightBackMargin, sliderBackYOffset, _xRightBackMargin, sliderHeight, right, 0, 0 );
}

public void paintBackground( Graphics g ) 
{
}

protected void drawFocus( Graphics g, boolean on )
{
    boolean oldDrawStyleFocus = g.isDrawingStyleSet( Graphics.DRAWSTYLE_FOCUS );
    try {
        if( on ) {
            g.setDrawingStyle( Graphics.DRAWSTYLE_FOCUS, true );
        }
        paint( g );
    } finally {
        g.setDrawingStyle( Graphics.DRAWSTYLE_FOCUS, oldDrawStyleFocus );
    }
}
protected boolean touchEvent(TouchEvent message)
{
    boolean isConsumed = false;
    boolean isOutOfBounds = false;
    int x = message.getX(1);
    int y = message.getY(1);
    if(x < 0 || y < 0 || x > getExtent().width || y > getExtent().height) {
        isOutOfBounds = true;
    }
    switch(message.getEvent()) {
        case TouchEvent.CLICK:
        case TouchEvent.MOVE:
            if(isOutOfBounds) return true; 
            _selected = true; 

            int stateWidth = getExtent().width / _numStates;
            int numerator = x / stateWidth;
            int denominator = x % stateWidth;
            if( denominator > stateWidth / 2 ) {
                numerator++;
            }
            _currentState = numerator;
            invalidate();

            isConsumed = true;
            break;
        case TouchEvent.UNCLICK:
            if(isOutOfBounds) {
                _selected = false; 
                return true;
            }
            _selected = false; 
            stateWidth = getExtent().width / _numStates;
            numerator = x / stateWidth;
            denominator = x % stateWidth;
            if( denominator > stateWidth / 2 ) {
                numerator++;
            }
            _currentState = numerator;
            invalidate();
            fieldChangeNotify(0);
            isConsumed = true;
            break;
    }
    return isConsumed;
}
protected boolean navigationMovement(int dx, int dy, int status, int time) 
{
    if( _selected )
    {
        if(dx > 0 || dy > 0) {
            incrementState();
            fieldChangeNotify( 0 );
            return true;
        } else if(dx < 0 || dy < 0) {
            decrementState();
            fieldChangeNotify( 0 );
            return true;
        }
    }
    return super.navigationMovement( dx, dy, status, time);
}
public void decrementState() {
    if(_currentState > 0) {
        _currentState--;
        invalidate();
    }
}
public void incrementState() {
    if(_currentState < _numStates) {
        _currentState++;
        invalidate();
    }
}
protected boolean invokeAction(int action) {
    switch(action) {
        case ACTION_INVOKE: {
            toggleSelected();
            return true;
        }
    }
    return false;
}
protected boolean keyChar( char key, int status, int time ) {
    if( key == Characters.SPACE || key == Characters.ENTER ) {
        toggleSelected();
        return true;
    }

    return false;
}
protected boolean trackwheelClick( int status, int time ) {
    if( isEditable() ) {
        toggleSelected();
        return true;
    }
    return super.trackwheelClick(status, time);
}
private void toggleSelected() {
    _selected = !_selected;
    invalidate();
}
public void setDirty( boolean dirty )
{  
}
public void setMuddy( boolean muddy )
{ 
}

}
4

2 回答 2

1

如果您使用下面的代码,您将得到您的实际需求,您可以通过在滑块字段引用上调用 getValue() 方法将滑块当前值获取到您的屏幕类中。

实现FieldChangeListener接口并尝试覆盖fieldChanged()方法。

使用Horizo ​​ntalFieldManager类和setStatus()方法,如果你想在屏幕底部显示你的滑块,否则你可以正常显示。

这里的代码:

    public class SliderScreen extends MainScreen implements FieldChangeListener
{
private SliderField slider;
 private HorizontalFieldManager hm;

public SliderField(){

slider = new SliderField(
                    Bitmap.getBitmapResource("slider2_thumb_normal.png"),
                    Bitmap.getBitmapResource("slider2_progress_normal.png"),
                    Bitmap.getBitmapResource("slider2_base_normal.png"),
                    Bitmap.getBitmapResource("slider2_thumb_focused.png"),
                    Bitmap.getBitmapResource("slider2_progress_focused.png"),
                    Bitmap.getBitmapResource("slider2_base_focused.png"), 8, 4,
                    8, 8, FOCUSABLE);

            slider.setChangeListener(this);
            hm = new HorizontalFieldManager();


            hm.add(slider);

            setStatus(hm);

}



public void fieldChanged(Field field, int context) {
        try {

            if (field == slider) {
                int value = slider.getValue();

            }

        } catch (IllegalStateException e) {

            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }

    }
于 2012-10-18T07:21:11.990 回答
1

我已经完成了如何使用此代码的简单示例,检查一下

    public final class MyScreen extends MainScreen implements FieldChangeListener//,FocusChangeListener
{
    /**
     * Creates a new MyScreen object
     */
    public MyScreen()
    {        
        // Set the displayed title of the screen       
        setTitle("MyTitle");

        SliderField slider;

        slider = new SliderField( 
            Bitmap.getBitmapResource( "slider_thumb_normal.png" ),  Bitmap.getBitmapResource( "slider_progress_normal.png" ),  Bitmap.getBitmapResource( "slider_base_normal.png" ),
            Bitmap.getBitmapResource( "slider_thumb_focused.png" ), Bitmap.getBitmapResource( "slider_progress_focused.png" ), Bitmap.getBitmapResource( "slider_base_focused.png"),
            Bitmap.getBitmapResource( "slider_thumb_pressed.png" ), Bitmap.getBitmapResource( "slider_progress_pressed.png" ), Bitmap.getBitmapResource( "slider_base_pressed.png"),
            10, 0, 12, 12, FOCUSABLE );
        slider.setPadding( 20, 20, 20, 20 );
        slider.setBackground( BackgroundFactory.createSolidBackground( 0xD3D3D3 ) );
        slider.setChangeListener(this);
        //slider.focusChangeNotify(0);
        add( slider );




    }

    public void fieldChanged(Field field, int context) {
        // TODO Auto-generated method stub
        if(field instanceof SliderField)
        {
            SliderField temp = (SliderField)field;
            System.out.println("Temp value is"+temp.getValue());
        }
    }


}
于 2012-10-18T07:49:21.783 回答