Undo/redo system

Za vse novince v izdelovanju iger.

Undo/redo system

OdgovorNapisal/-a koscak » Pe Sep 28, 2012 5:58 pm

Koda: Izberi vse
Lep pozdrav vsem, imam sledeč problem...
Če spremenim barvo ali širino črte/kvadrata/ karkoli, in pritisnem gumb back se vse spremenijo v trenutno širino,..
Ne vem kako bi hranil tako da bi vse stvari obstale, le ta bi izginila, Če ima kdo kako idejo predlog bi prosil, kako to rešiti,..Če se da čimprej, obenem pa pošiljam izvleček kode.
Podobno je kot java,.. rabim da shranim barvo in velikost ..

Proti koncu se undo/redo nahaja, vmes so le inicializacije in ostale zadeve.
DrawHandler.java

public class DrawHandler {
       
        public Shape mCurrentShape;
        public SHAPES SELECTED_SHAPE = SHAPES.FREEHAND;
        public Paint mPaint;
        public Paint undopaint[];
        public Paint mErasePaint;
        public Paint mCurrentPaint;
        public Panel mPanel;
        public Point mDownPoint;
   
        // static so it will note be destroyed during screen rotations etc..
        private ArrayList<Path> GRAPHICOBJECTS;
        private ArrayList<Path> undonePaths ;
       // private ArrayList<Path> undonePaths ;
 
        private OnDrawListener mOnDrawListener;

        public interface OnDrawListener {
              public void onDrawShape(Shape shape, Paint paint); // narišeš shape dokončno
              public void onDrawShapeTemp(Shape shape, Paint paint); // narišeš shape, in ga potem ko je narisan, izbrišeš, če shape ni freehand
              public void onDrawAll(ArrayList<Path>  paths, Paint paint);
        }
 
     
 
        public DrawHandler() {
                initPaint();
        }
 
        public void setOnDrawListener(OnDrawListener onDrawListener) {
                mOnDrawListener = onDrawListener;
        }
         
         
 
        public Paint getPaint() {
                return mPaint;
        }
       
        public Paint getErasePaint() {
                return mErasePaint;
        }
       
        private void initPaint() {
               
                GRAPHICOBJECTS = new ArrayList<Path>();
                undonePaths = new ArrayList<Path>();
 
                mPaint = new Paint();
                mErasePaint=new Paint();
 
                mPaint.setDither(true);
                mPaint.setColor(Color.rgb(100, 100, 100));
                mPaint.setStyle(Paint.Style.STROKE);
                mPaint.setStrokeJoin(Paint.Join.ROUND);
                mPaint.setStrokeCap(Paint.Cap.ROUND);
                mErasePaint.setDither(true);
                mErasePaint.setColor(Color.rgb(255, 255, 255));
                mErasePaint.setStyle(Paint.Style.STROKE);
                mErasePaint.setStrokeJoin(Paint.Join.ROUND);
                mErasePaint.setStrokeCap(Paint.Cap.ROUND);
                mErasePaint.setStrokeWidth(15);
                setBrushWidth(6);
        }
 
        public void setColor(int color) {
                mPaint.setColor(color);
                 
        }
 
        public void setEraseColor(int barva) {
                mErasePaint.setColor(barva);
        }
       
        public void setBrushWidth(int bwidth) {
                mPaint.setStrokeWidth(bwidth);
              //  mErasePaint = new Paint(mPaint);
                //mErasePaint.setARGB(255, 255, 255, 255);
        }
 
        public void setShape(SHAPES shape) {
                SELECTED_SHAPE = shape;
        }
     
   
       
        public void handleTouchEvent(MotionEvent event) {
               
                Point point = new Point(event.getX(), event.getY());
               
                if(SELECTED_SHAPE == SHAPES.ERASE)
                {   mCurrentPaint = mErasePaint;
               
                }
                else
                        mCurrentPaint = mPaint;
               
                switch(event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                        mDownPoint = point;
                        break;
                case MotionEvent.ACTION_UP:
                case MotionEvent.ACTION_MOVE:
                        setCurrentShape(SELECTED_SHAPE, point);
                        if(mOnDrawListener != null) {
                                if(event.getAction() == MotionEvent.ACTION_MOVE) {
                                        mOnDrawListener.onDrawShapeTemp(mCurrentShape, mCurrentPaint);
                                } else {
                                        mOnDrawListener.onDrawShape(mCurrentShape, mCurrentPaint);
                                }
                                 
                        }
                       
                        break;
               
                }
                if(event.getAction() == MotionEvent.ACTION_UP) {
                        GRAPHICOBJECTS.add(mCurrentShape.getPath());
                    //    undopaint.length;
                        mCurrentShape = null;
                }
               
        }

        public void back() {
            if(GRAPHICOBJECTS.size()>0)
            {
            //undonePaths.add(GRAPHICOBJECTS.size()-1,;
            undonePaths.add(GRAPHICOBJECTS.remove(GRAPHICOBJECTS.size()-1));
            // GRAPHICOBJECTS.addAll(undonePaths);
            if(mOnDrawListener != null) {
                mOnDrawListener.onDrawAll( GRAPHICOBJECTS, mCurrentPaint);
             //   mPanel.invalidate();
    //  GRAPHICOBJECTS.remove(GRAPHICOBJECTS.size()-1);
                               
            //  mPanel.back();   
            //invalidate();
            }}
            }

        public void next() {
            // TODO Auto-generated method stub
            if(undonePaths.size()>0)
            {
            GRAPHICOBJECTS.add(undonePaths.remove(undonePaths.size()-1));
            // GRAPHICOBJECTS.addAll(undonePaths);
            if(mOnDrawListener != null) {
                mOnDrawListener.onDrawAll( GRAPHICOBJECTS, mCurrentPaint);
                }}
        }

Koda: Izberi vse
Panel.java

public void onDrawAll(ArrayList<Path> paths, Paint paint) {
    // TODO Auto-generated method stub
     prepareBitmaps();
     synchronized (mCanvas) {
         mCanvas.drawARGB(255, 255, 255, 255); // "pobriši" vse
         mCanvas.drawARGB(255, 255,255, 255); // "pobriši" vse
          for(Path path : paths)
              mCanvas.drawPath(path , paint);
      }
     // updateBitmap(tmpCanvas, tmpBitmap,paths, paint);
     synchronized (mBitmap) {
        // tmpCanvas.drawPath(paths, paint);
         drawBitmap(mBitmap);
}
     
}

koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Undo/redo system

OdgovorNapisal/-a impulse9 » So Sep 29, 2012 4:50 am

Pomagalo bi če poveš kaj sploh delaš. :)
What
Uporabniški avatar
impulse9
SGD Moderator
SGD Moderator
 
Prispevkov: 397
Pridružen: Pe Jan 10, 2003 10:14 pm

Re: Undo/redo system

OdgovorNapisal/-a koscak » So Sep 29, 2012 8:37 am

Hy danijel

lep pozdrav vsem, imam sledeč problem...
Če spremenim barvo ali širino črte/kvadrata/ karkoli, in pritisnem gumb back se vse spremenijo v trenutno širino,..
Ne vem kako bi hranil tako da bi vse stvari obstale, le ta bi izginila, Če ima kdo kako idejo predlog bi prosil, kako to rešiti,..Če se da čimprej, obenem pa pošiljam izvleček kode.
Podobno je kot java,.. rabim da shranim barvo in velikost ..

Proti koncu se undo/redo nahaja, vmes so le inicializacije in ostale zadeve.


Delam: pa risarki program v javi/android, in usposabljam funkciji undo/redo(naprej/Nazaj) . Vendar zapomni si kero oblika je bila narisana, ne zapomni si pa barve/debeline:
primer:
Zadnjo sem narisal debelo črto:
http://shrani.si/f/1l/68/1uu931qu/slika1.png
druga slika:

http://shrani.si/f/35/YL/1lJEbw1H/2verzija.png

Upam da se sedaj razumemo za kaj gre...
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Undo/redo system

OdgovorNapisal/-a koscak » So Sep 29, 2012 8:58 am

Aja pa če komu se lub stesterat aplikacijo, jo pošiljam, prosim če sporoči o bugih, če se mu zdi da je kak :D Ali pa predlog kaj manka :) .
Priponke
AdroidPaint.rar
(66.17 KiB) Prenešeno 33 krat
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm

Re: Undo/redo system

OdgovorNapisal/-a impulse9 » So Sep 29, 2012 5:06 pm

What
Uporabniški avatar
impulse9
SGD Moderator
SGD Moderator
 
Prispevkov: 397
Pridružen: Pe Jan 10, 2003 10:14 pm

Re: Undo/redo system

OdgovorNapisal/-a koscak » So Sep 29, 2012 9:33 pm

Uporabnik Kjodo mi je pomagal rešiti problem in se mu lepo zahvaljujem. Problem je bil da je manjkal "nev class":

Koda: Izberi vse
import android.graphics.Paint;
import android.graphics.Path;

public class AuditContainer
{
   private Paint mPaint;
   private Path mPath;
   
   /**
    * Creates undo/redo object.
    * Copies the paint object, no need for you to do it.
    * @param path
    * @param paint
    */
   public AuditContainer(Path path, Paint paint)
   {
      mPath = path;
      mPaint = new Paint();
      mPaint.setAlpha(paint.getAlpha());
      mPaint.setColor(paint.getColor());
      mPaint.setStrokeWidth(paint.getStrokeWidth());
      mPaint.setStrokeJoin(paint.getStrokeJoin());
      mPaint.setStrokeCap(paint.getStrokeCap());
      mPaint.setAntiAlias(paint.isAntiAlias());
      mPaint.setDither(paint.isDither());
      mPaint.setStyle(paint.getStyle());
   }
   
   public Path getPath()
   {
      return mPath;
   }
   
   public Paint getPaint()
   {
      return mPaint;
   }
}
koscak
wannabe
wannabe
 
Prispevkov: 97
Pridružen: Ne Nov 20, 2011 10:23 pm


Vrni se na Začetniki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost

cron