2012-03-26 6 views
2
私は自分のアプリケーションでの機能を元に戻すやりたい

.. iはxの配列リストを取り、私のネット見つけた私は図面を元に戻すためのができませんコードの下に行っているYポイントを検索します?Androidでペイントアプリケーションの機能を実装する方法を教えてください。このため

public Drawview(Context context, float x, float y, int r) { 
      super(context); 


      mBitmap = Bitmap.createBitmap(800, 1200, Bitmap.Config.ARGB_8888); 
      // mainbitmap.add(mBitmap); 
      //System.out.println("**mBitmapPaint***"+mBitmapPaint); 
      mCanvas = new Canvas(mBitmap); 
      mPath = new Path(); 
      mBitmapPaint = new Paint(Paint.DITHER_FLAG); 



     } 

     @Override 
     protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
      super.onSizeChanged(w, h, oldw, oldh); 
     } 

     @Override 
     protected void onDraw(Canvas canvas) { 

      System.out.println("***Drawinglines****"+Drawinglines); 

       canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
       canvas.drawPath(mPath, mPaint); 



     } 


     private float mX, mY; 
     private static final float TOUCH_TOLERANCE = 4; 

     private void touch_start(float x, float y) { 
      mPath.reset(); 
      mPath.moveTo(x, y); 
      mX = x; 
      mY = y; 
     } 

     private void touch_move(float x, float y) { 
      float dx = Math.abs(x - mX); 
      float dy = Math.abs(y - mY); 
      if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
       mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
       mX = x; 
       mY = y; 
      } 
     } 

     private void touch_up() { 


      mPath.lineTo(mX, mY); 
      mCanvas.drawPath(mPath, mPaint); 
     /// path. 
      //graphics.add(mPath); 
      mPath.reset(); 
     } 

     // events when touching the screen 
     public boolean onTouchEvent(MotionEvent event) { 

      event.getAction(); 
      int eventaction = event.getAction(); 

      int X = (int)event.getX(); 
      int Y = (int)event.getY(); 

      switch (eventaction) { 

      case MotionEvent.ACTION_DOWN: 

      { 
       touch_start(X, Y); 
       } 
       invalidate(); 
       break; 


      case MotionEvent.ACTION_MOVE: 

       System.out.println("***ACTION_MOVE**************"+X+"************"+Y); 
       if((Drawinglines.equals("Pen"))||(Drawinglines.equals("Erase"))) 
       { 
        touch_move(X, Y); 
        temp_point.add(new Point(X,Y)); 

       } 
       invalidate(); 
       break; 

      case MotionEvent.ACTION_UP: 

       main_Points.add(temp_point); 
       temp_point = null; 

       touch_up(); 

       invalidate(); 
       break; 
      } 

      return true; 

     } 




     public void undopath() 
     { 
       main_Points.remove(main_Points.size()-1); 
      invalidate(); 
     } 

    } 
    @Override 
    public void onClick(View v) { 


     if(v == Undo) 
     {  
      Drawview abc=new Drawview(); 
      abc.undopath(); 
     } 

しかし、元に戻すアンドゥ機能が動作しません。

+1

..代わりにXferModeを使用しての、白に色を設定し、正確に何しているしていますあなたに問題がありますか? iはmain_Points.removeのこの行の後に取得する方法 –

+0

私の問題は、(main_Points.size() - 1)、Y点のArrayListから要素の後に削除した後、私はxのArrayListのを行ったコードによるである取得する方法前の図面線 – user1287756

+0

をうんこれまでに試したアンドゥ/リドゥロジックはどこにありますか?あなたは言う: "元に戻すことはできません"が、私はあなたが言うではないコードを実行していないが表示されません。あなたの問題は、あなたが、あなたが「REDOを元に戻す」ためにSO最初に検索する必要があり、アンドゥ/リドゥを実装する方法がわからないということであれば、それでコマンド・デザイン・パターン –

答えて

0

私は試していないが、私は使用2枚のキャンバスとビットマップは、現在の状態を引き出す上で、有用であると考え、1はまだ以前の状態で、前者のみ1を復元する必要があります。しかし、それはステップでのみ復元することができます。

+0

こんにちは、これは答えより多くのコメントです....あなたは正しいことを示すいくつかのコードでそれを更新できますか? – Ben

0

ここにいくつかのコード: 作成:

private Canvas mCanvas; 
private Bitmap mBitmap; 

private Canvas mRestoreCanvas; 
private Bitmap mRestoreBitmap; 

のinit:

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    mPictureWidth = w; 
    mPictureHeight = h; 

    Loge.i("mPictureWidth = " + mPictureWidth + " mPictureHeight = " 
      + mPictureHeight); 
    if (mCanvas == null && mBitmap == null && mPictureWidth > 0 
      && mPictureHeight > 0) { 
     mBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight, 
       Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
     mCanvas.save(); 

     mRestoreBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight, 
       Bitmap.Config.ARGB_8888); 
     mRestoreCanvas = new Canvas(mRestoreBitmap); 
     mRestoreCanvas.save(); 
    } 
    super.onSizeChanged(w, h, oldw, oldh); 
} 

をonDraw:

@Override 
protected void onDraw(Canvas canvas) { 
    if (mPattern == DRAW_LINE) { 
     mCanvas.restore(); 
     mCanvas.drawPath(path, paint); 
     mCanvas.save(); 
    } 
    mCanvas.save(); 
    if (mBitmap != null) 
     canvas.drawBitmap(mBitmap, 0, 0, null); 
} 

onTouchEvent:

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if(event.getAction() == MotionEvent.ACTION_DOWN){ 
     mRestoreCanvas.drawBitmap(mBitmap, 0, 0, bitmapPaint); 
    } 

    if (mPattern == DRAW_LINE) { 
     return drawLines(event); 
    } else if (mPattern == DRAW_PATTERN) { 
     return drawPattern(event); 
    } 
    return false; 
} 

元に戻す:OKテスト済み

public void dust() { 
    path.reset(); 
    mBitmap.recycle(); 
    mBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight, 
      Bitmap.Config.ARGB_8888); 
    mCanvas.setBitmap(mBitmap); 

    mCanvas.drawBitmap(mRestoreBitmap, 0, 0, bitmapPaint); 

    invalidate(); 
} 

。私は私の消去ボタンline.In黒を削除するにはトリックのようなものを使用していたねえ

0

、私は

if(erase){ 
    paintColor = Color.parseColor(newColor); 
    drawPaint.setColor(paintColor); 
    } 
1
private Slate mSlate; 
private TiledBitmapCanvas mTiledCanvas; 

public void clickUndo(View unused) { 

     mSlate.undo(); 
    } 


public void undo() { 
     if (mTiledCanvas == null) { 
      Log.v(TAG, "undo before mTiledCanvas inited"); 
     } 
     mTiledCanvas.step(-1); 

     invalidate(); 
    } 
関連する問題