2014-02-09 4 views
1

Я пытаюсь сделать undo, redo вариантов в пользовательском приложении для рисования. Но он не работает, как я хочу.В пользовательских видах чертежа варианты отмены и повтора не работают

Я плохо разбираюсь в английском. Через изображение позвольте мне попытаться показать работу undo, redo функций. Надеюсь, что эта картина объяснит мою проблему. enter image description here

я хочу, чтобы удалить первую строку на первой отмен щелчок и второй линии на втором отмен мыши и так далее ... так же на повтор нажмите нарисовать последнюю строку первого щелчка, второй последний на второй щелчок и так далее ..

Это мой пользовательский класс вида.

public class DrawingView extends View{ 

    ArrayList<Path> undoPath = new ArrayList<Path>(); 
    ArrayList<Path> paths = new ArrayList<Path>(); 
    private static int pathSize =0; 
    //draw path 
    private Path drawPath; 
    //drawing and canvas point 
    private Paint drawPaint, canvasPaint; 
    //initial color 
    private int paintColor=0xFF660000; 
    //canvas 
    private Canvas drawCanvas; 
    //canvas bitmap 
    private Bitmap canvasBitmap; 

    private float brushSize, lastBrushSize; 

    public DrawingView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setupDrawing(); 
    } 
    public void setPattern(String newPattern){ 
     invalidate(); 
     int patternID = getResources().getIdentifier(newPattern, "drawable", "com.faisalahsan.paintingapp"); 
     Bitmap patternBMP = BitmapFactory.decodeResource(getResources(), patternID); 
     BitmapShader patternBMPShader = new BitmapShader(patternBMP, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT); 
     drawPaint.setColor(0xFFFFFFFF); 
     drawPaint.setShader(patternBMPShader); 

    } 
    private void setupDrawing(){ 
     //get drawing area setup for interaction 
     drawPath = new Path(); 
     drawPaint= new Paint(); 

     paths.add(drawPath); 

     brushSize = getResources().getInteger(R.integer.medium_size); 
     lastBrushSize = brushSize; 

     drawPaint.setColor(paintColor); 
     drawPaint.setAntiAlias(true); 
     drawPaint.setStrokeWidth(brushSize); 
     drawPaint.setStyle(Paint.Style.STROKE); 
     drawPaint.setStrokeJoin(Paint.Join.ROUND); 
     drawPaint.setStrokeCap(Paint.Cap.ROUND); 

     canvasPaint = new Paint(Paint.DITHER_FLAG);  
    } 

    @Override 
    protected void onDraw(Canvas canvas) {   
     for(Path p: paths){   
      canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint); 
      canvas.drawPath(p, drawPaint);   
     } 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
     super.onSizeChanged(w, h, oldw, oldh); 
     canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     drawCanvas = new Canvas(canvasBitmap); 

    } 

    public void onClickUndo() { 
     if (paths.size()>0) { 
     undoPath.add(paths.remove(paths.size()-1));   
     invalidate(); 
     }   
     } 

     public void onClickRedo(){ 
     if (undoPath.size()>0) { 
     paths.add(undoPath.remove(undoPath.size()-1));   
     invalidate(); 
     } 
     } 


    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     float touchX = event.getX(); 
     float touchY = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      drawPath.moveTo(touchX, touchY); 
      break;   
     case MotionEvent.ACTION_MOVE: 
      drawPath.lineTo(touchX, touchY);    
      break; 
     case MotionEvent.ACTION_UP: 
      drawCanvas.drawPath(drawPath, drawPaint); 
      drawPath.reset(); 
      drawPath = new Path(); 
      paths.add(drawPath); 
      break; 
     default: 
      return false; 
     } 
     invalidate(); 
     return true;   
    } 
} 

ответ

0

Вы не «перекройки» на холсте, когда «отменить» удаляет действие из ArrayList «пути» - другими словами, вынимая его из списка не изменяет изображение. Вы должны перерисовать то, что было на холсте, прежде чем оно было нарисовано, чтобы «отменить» действие.

Сохранение состояния холста при запуске «onDraw», а затем перерисовывание этого холста при вызове отмены. Вам необходимо сохранить синхронизированный стек состояний холста, чтобы выполнить ряд вызовов «отменить» и «повторить».

+0

не могли бы вы помочь мне с каким-то примером или куском кода? – FAISAL

+0

читайте на этом: http://stackoverflow.com/questions/3973557/how-to-implement-undo-redo-operation-without-major-changes-in-program?rq=1 вам не хватает "стека" (вы отслеживаете «команды», но не стек действий ... вам, вероятно, понадобится кэшированная версия каждого растрового изображения по соображениям памяти, поэтому ArrayList bitmaps = new ArrayList (), где вы сохраняете состояние их изображения до каждое изменение. Но вам понадобится кеширование для более чем нескольких вариантов отмены. Затем для «повтора» вам нужен еще один, например ArrayList redoBitmaps – Jim

 Смежные вопросы

  • Нет связанных вопросов^_^