LWUIT中的滑块控制

时间:2012-04-12 11:55:19

标签: slider lwuit

我可以在LWUIT中制作一个滑块控件,这意味着一个可以让用户移动来控制某个值的栏吗?

如果有人可以通过示例或教程提供帮助,我将不胜感激

3 个答案:

答案 0 :(得分:2)

我只使用了无限模式。但是你有一个教程

http://lwuit.blogspot.com.es/search?q=slider

答案 1 :(得分:1)

在LWUIT 1.5中有Slider类。

答案 2 :(得分:0)

我用动作组件完成了这个 我将为您提供

public MotionComponent(final Image background, final Image button,
            final int x, final int minX, final int maxX, final boolean
            useStops, final int numStops, final int time) {
        this.background = background;
        this.button = button;
        this.minX = minX;
        this.maxX = maxX;
        this.useStops = useStops;
        this.numStops = numStops;
        this.time = time;
        positionX = (maxX - minX) / 2;
        this.moveToPoint = this.minX;

        this.getStyle().setBgTransparency(0);

        if (this.maxX < this.minX) {
            int tmp = this.minX;
            this.minX = this.maxX;
            this.maxX = tmp;
        }

        if (button != null) {
            this.maxX += (button.getWidth() / 2);
            this.minX += (button.getWidth() / 2);
        }
    }

    public void setStepSize(int step) {
        this.stepSize = step;
    }

    public int getStepSize() {
        return stepSize;
    }



    protected Dimension calcPreferredSize() {
        //Style style = getStyle();
        Dimension dimension = null;
        dimension = new Dimension(background.getWidth(), 36);

        return dimension;
    }

    public void initComponent() {
        getComponentForm().registerAnimated(this);
    }

    public void paint(Graphics g) {


        if (background != null) {
            g.drawImage(background, getX(), 
                    (getHeight() - background.getHeight()) / 2);
        }
        if (button != null) {
            g.drawImage(button, positionX + button.getWidth()/2,
                    (getHeight() - button.getHeight()) / 2);
        }

    }

    public void keyPressed(int keyCode) {
        super.keyPressed(keyCode);
        switch (Display.getInstance().getGameAction(keyCode)) {
        case Display.GAME_DOWN:
        case Display.GAME_UP:
            break;
        case Display.GAME_LEFT:
        case Display.GAME_RIGHT:
            if (useStops && motionX == null) {
                System.out.println("key pressed motion");
                motionX = Motion.createSplineMotion(positionX,
                        getDestPoint(positionX, numStops, minX, maxX,
                                Display.getInstance().getGameAction(keyCode)), time);
                motionX.start();
            } else {
                if (motionX == null) {
                    motionX = Motion.createSplineMotion(positionX,
                            moveStep(positionX, stepSize,
                                    Display.getInstance().getGameAction(keyCode), minX, maxX), time);
                    motionX.start();
                }
            }
            System.out.println("key pressed");
            break;
        default:
            System.out.println("key default");
            return;
        }
    }

    public void keyRepeated(int keyCode) {
        super.keyRepeated(keyCode);
        switch (Display.getInstance().getGameAction(keyCode)) {
        case Display.GAME_DOWN:
        case Display.GAME_UP:
            break;
        case Display.GAME_LEFT:
        case Display.GAME_RIGHT:
            if (useStops && motionX == null) {
                motionX = Motion.createSplineMotion(positionX,
                        getDestPoint(positionX, numStops, minX, maxX,
                                Display.getInstance().getGameAction(keyCode)), time);
                motionX.start();
            }
            System.out.println("key Repeated");
            break;
        default:
            return;
        }
    }

    private int moveStep(int x, int stepSize, int keyCode, int min, int
            max) {
        if (keyCode == Display.GAME_LEFT) {
            if (x > min) {
                if (x - stepSize < min) {
                    return min;
                } else {
                    return x - stepSize;
                }
            } else {
                return min;
            }
        } else {
            if (x < max) {
                if (x + stepSize > max) {
                    return max;
                } else {
                    return x + stepSize;
                }
            } else {
                return max;
            }
        }
    }

    /**
     * returns a normalized value
     * @return
     */
     public float getValue() {
        return ((positionX - minX) / (maxX - minX));
    }

    public void pointerPressed(int x, int y) {
        Rectangle absoluteBounds  = new Rectangle(getAbsoluteX(), getAbsoluteY(), getBounds().getSize());
        if (absoluteBounds.contains(x, y)) {
            System.out.println("pointerPressed " + x + " y " + y);
            if (x != positionX) {
                if (motionX == null) {
                    if (x < minX) {
                        motionX = Motion.createSplineMotion(positionX,
                                minX, time);
                    } else if (x > maxX) {
                        motionX = Motion.createSplineMotion(positionX,
                                maxX, time);
                    } else {
                        motionX = Motion.createSplineMotion(positionX, x,
                                time);
                    }
                    motionX.start();
                } else {
                    // do what?
                }
            }
        }else{
            System.out.println("pointerPressed pointerPressed else " + x + " y " + y);
            System.out.println("getBounds() x " + getBounds().getX() + ", y " + getBounds().getY() + ", w " + getBounds().getSize().getWidth() + ", h " + getBounds().getSize().getHeight());
        }
    }
    int draggedX, draggedY;

    public void pointerDragged(int x, int y) {
        Rectangle absoluteBounds  = new Rectangle(getAbsoluteX(), getAbsoluteY(), getBounds().getSize());
        if (absoluteBounds.contains(x, y)) {
            System.out.println("pointerDragged " + x + " y " + y);
            draggedX = x;
            draggedY = y;
            if (motionX != null) {
                //motionX.getValue()
            } else {
                positionX = x;

                if (positionX < minX) {
                    positionX = minX;
                }

                if (positionX > maxX) {
                    positionX = maxX;
                }
            }
        } else {
            System.out.println("pointerDragged " + x + " y " + y);
            System.out.println("pointerReleased ");
            //when it exits bounds, call pointerReleased with the last
            pointerReleased(draggedX, draggedY);
        }
    }

    private int getDestPoint(int x, int numStops, int min, int max, int
            direction) {
        if (numStops < 2) {
            if (direction == Display.GAME_LEFT) {
                return min;
            } else {
                return max;
            }
        }
        int distance = (max - min) / (numStops - 1);

        if (direction == Display.GAME_LEFT) {
            return moveToStopPoint(x - distance, numStops, min, max);
        } else {
            return moveToStopPoint(x + distance, numStops, min, max);
        }
    }

    private int moveToStopPoint(int x, int numStops, int min, int max) {
        int distance = max - min;

        // will either go to min or max.
        if (numStops < 2) {
            if (x > min + (distance / 2)) {
                return max;
            } else {
                return min;
            }
        }
        float averageDistance = distance / (numStops - 1); // 5 stops,

        if (x > max) {
            return max;
        }

        if (x > min && x <= (min + (int) (averageDistance / 2))) {
            return min;
        } else if (x < max && x >= (max - (int) (averageDistance / 2))) {
            return max;
        } else {
            for (int i = 0; i < numStops; i++) {
                int currentMin = min + (int) (i * averageDistance);
                if (x >= currentMin && x < currentMin + (int)
                        averageDistance / 2) {
                    return currentMin;
                } else if (x >= currentMin + (int) averageDistance / 2 &&
                        x < currentMin + (int) averageDistance) {
                    return currentMin + (int) averageDistance;
                }
            }
        }
        return min;
    }

    public void pointerReleased(int x, int y) {
        Rectangle absoluteBounds  = new Rectangle(getAbsoluteX(), getAbsoluteY(), getBounds().getSize());
        if (absoluteBounds.contains(x, y)) {
            System.out.println("pointerReleased " + x + " y " + y);
            if (useStops) {
                if (x > maxX) {
                    x = maxX;
                }
                if (x < minX) {
                    x = minX;
                }

                if (motionX != null) {
                    motionX =
                        Motion.createSplineMotion(motionX.getValue(),
                                moveToStopPoint(motionX.getValue(), numStops, minX, maxX), time);
                } else {
                    motionX = Motion.createSplineMotion(x,
                            moveToStopPoint(x, numStops, minX, maxX), time);
                }
                motionX.start();
            }
        } else {
            // outside bounds. Should be caught previously with
        }
    }

    public boolean animate() {
        boolean val = false;
        if (motionX != null) {
            positionX = motionX.getValue();
            if (motionX.isFinished()) {
                motionX = null;
            }
            val = true;
        }
        return val;
    }
}

the out put of the above code is this and i think this is want you are searching. User can move the button left and right Pranav