Как нарисовать большое изображение на холсте и перейти к ключевому событию - PullRequest
2 голосов
/ 23 января 2012

У меня большое изображение.На этом изображении есть текст для пользователя.Поэтому я не должен изменять размер изображения, чтобы оно помещалось на меньшем экране.Изображение намного больше, чем размер экрана устройства.Мое намерение состоит в том, чтобы нарисовать полное изображение на холсте без размера.Я хочу перемещать изображение постепенно по событию пользовательского ключа (влево, вправо, вверх, вниз), что-то вроде прокрутки.

Я могу нарисовать изображение на холсте с помощью: -

g.drawImage(image, 0, 0, Graphics.TOP | Graphics.LEFT);

Я не знаю, как действовать в соответствии с ключевым событием, чтобы вызвать другие части изображения, такие как прокрутка.
Я видел много игр j2me с такой функцией.
Где искать эту информацию?

1 Ответ

1 голос
/ 16 февраля 2012

Вы можете использовать Pngcrush Его основное назначение - уменьшить размер потока данных PNG IDAT, пробуя различные уровни сжатия и методы фильтра PNG. Если размер ширины или длины очень велик, и вы намереваетесь нарисовать егона холсте, после создания изображения , вы можете использовать метод DrawRegion Graphics в методе рисования canvas для рисования на нем нужного фрагмента изображения. Вы можете изменить нарисованный фрагмент изображения (например, когда пользователь нажимает клавишу)путем изменения параметров метода drawRegion () и перекрасить холст:

public class CanvasButterfly extends Canvas implements ... {


private int ix, iy;
//image
private Image picture;
/*
* Constructor
*/
public CanvasButterfly() {
    init();
}

/* Function   : paint(Graphics)
* Description : This method is used for rendering Graphics
* Input       : Graphics
* return      : Void
*/
protected void paint(Graphics g) {
    g.setColor(255, 255, 255);
    g.fillRect(0, 0, this.getWidth(), this.getHeight());
    if (picture != null) {
        g.drawRegion(picture, ix, iy,
              picture.getWidth() - ix, picture.getHeight() - iy,
              Sprite.TRANS_NONE, 0, 0, Graphics.TOP | Graphics.LEFT);
    }
}

/* Function   : moveImage(int)
* Description : This method handle Canvas events
* Input       : void
* return      : Void
*/
private void moveImage(int keyCode) {

    int key = -1;

    try {
        key = getGameAction(keyCode);
    } catch (Exception ex) {
        key = keyCode;
    }

    switch (key) {
        case Canvas.DOWN:
            iy = Math.min(iy + 1,picture.getHeight());
            break;
        case Canvas.UP:
            iy = Math.max(iy - 1,0);
            break;
        case Canvas.LEFT:
            ix = Math.max(ix - 1,0);
            break;
        case Canvas.RIGHT:
            ix = Math.min(ix + 1,picture.getWidth());
            break;
    }

}

//keyPressed 
public void keyPressed(int keyCode) {
    moveImage(keyCode);
    repaint();
}
//keyRepeated
public void keyRepeated(int keyCode) {
    moveImage(keyCode);
    repaint();
}

/* Function   : init()
* Description : This method initialized the class objects
* Input       : void
* return      : Void
*/
private void init() {
//
    ix = ...
    iy = ...

    try {
            picture= Image.createImage("/" + image + ".png");
    } catch (IOException ex) {
        ex.printStackTrace();
    }
}
}

Здесь впервые изображение, нарисованное из Coordinate (ix, iy) на холсте.

...