Function undo et redo

  • Réponses :0
Mathieu le roux
  • Posts de Forum 1

3 nov. 2014 à 22:24:47 via site

Bonjour,

Je suis en train de réaliser une application android, ou j'ajoute des lignes et des cercles sur un plan quadrillé. J'ai une fonction doBitmap qui permet d'insérer mes éléments sur le plan, je suis en train d'essayer de faire les fonctions undo et redo mais j'éprouve quelques difficultés. Les boutons sont créés. Mon code concernant la ligne est le suivant :

public class Ligne extends EltPlan {
    private static final int epaisseur = 8;
    private int a, b;

    private Ligne(int x, int y, int width, int height) {
        super(x, y, width, height);
    }

    public static Ligne LigneHorizontal(int x, int y, int lgr) {
        return new Ligne(x, y, lgr, epaisseur);
    }

    public static Ligne LigneVertical(int x, int y, int lgr) {
        return new Ligne(x, y, epaisseur, lgr);
    }

    public void doBitmap() {
        // Si la ligne est selectionné on l'encadre en rouge
        if (isSelected()) {
            setBitmap(Bitmap.createBitmap(getPixelsWidth() + 10,
                    getPixelsHeight() + 10, Config.ARGB_8888));
            for (b = 5; b < getBitmap().getHeight() - 5; b++) {
                for (a = 5; a < getBitmap().getWidth() - 5; a++)
                    getBitmap().setPixel(a, b, Color.GRAY);
            }
            for (a = 0; a < getBitmap().getWidth(); a++)
                getBitmap().setPixel(a, 0, Color.RED);
            for (a = 0; a < getBitmap().getWidth(); a++)
                getBitmap().setPixel(a, getBitmap().getHeight() - 1, Color.RED);
            for (b = 0; b < getBitmap().getHeight(); b++)
                getBitmap().setPixel(0, b, Color.RED);
            for (b = 0; b < getBitmap().getHeight(); b++)
                getBitmap().setPixel(getBitmap().getWidth() - 1, b, Color.RED);
        } else {
            setBitmap(Bitmap.createBitmap(getPixelsWidth(), getPixelsHeight(),
                    Config.ARGB_8888));
            for (b = 0; b < getBitmap().getHeight(); b++) {
                for (a = 0; a < getBitmap().getWidth(); a++)
                    getBitmap().setPixel(a, b, Color.GRAY);
            }
        }
    }
}

et mon code permettant d'insérer la ligne et le suivant :

public class InsertionLigneListener implements OnTouchListener {

    private Plan plan;
    Ligne nvlElt;
    private int EltX, EltY;
    private int selection;
    private boolean onRight = false;

    public static final int NO_SELECTION = 0;
    public static final int SELECT_LIGNE = 1;

    public InsertionLigneListener(Plan plan) {
        this.plan = plan;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.performClick();
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            onTouchDown(event);
            return true;
        case MotionEvent.ACTION_MOVE:
            onTouchMove(event);
            return true;
        case MotionEvent.ACTION_UP:
            onTouchUp(event);
            break;
        }
        return false;
    }

    private void onTouchDown(MotionEvent event) {

    }

    private void onTouchMove(MotionEvent evnet) {

    }


    private void onTouchUp(MotionEvent event) {
        switch (selection) {
        case SELECT_LIGNE:
            if (EltX == -1) {
                EltX = (int) event.getX();
                EltY = (int) event.getY();
            } else {
                int departX, departY;
                if (Math.abs((int) event.getY() - EltY) > Math
                        .abs((int) event.getX() - EltX)) {

                    // Ligne vertical
                    if ((int) event.getY() > EltY){
                        departY = EltY;
                    }else{
                        departY = (int) event.getY();
                    }
                    departX = lastEltX;
                    if (onRight) {
                        nvlElt = Ligne.LigneVertical(departX, departY,
                                Math.abs((int) event.getY() - EltY));
                         nvlElt.setPixelsHeight(nvlElt.getPixelsHeight()
                                + nvlElt.getPixelsWidth());
                    } else {
                        nvlElt = Ligne.LigneVertical(departX, departY,
                                Math.abs((int) event.getY() - EltY));
                    }

                    EltY = (int) event.getY();
                    onRight = false;

                } else {
                    // Ligne horizontal
                    if ((int) event.getX() > EltX) {
                        onRight = true;
                        departX = EltX;
                    } else {
                        onRight = false;
                        departX = (int) event.getX();
                    }
                    departY = EltY;
                    nvlElt = Ligne.LigneHorizontal(departX, departY,
                            Math.abs((int) event.getX() - EltX));
                    EltX = (int) event.getX();
                }

                plan.add(nvlElt);

                plan.invalidate();
            }
            break;
        }
    }

Répondre