2012-09-06 18 views
5

En mi aplicación de pintura he implementado la función UNDO y está funcionando bien. Pero si cambia el color del pincel (o) el trazo del pincel, todos mis trazados trazados anteriores cambiarán al nuevo color de pintura. El código es el siguiente:Cómo cambiar el color de la pintura/trazo después de implementar la función DESHACER en la pintura de lienzo

public class CustomView extends View implements OnTouchListener { 
    public Canvas mCanvas; 
    private Path mPath; 
    public Paint mPaint, mBitmapPaint; 
    Bitmap mBitmap; 
    Canvas canvas; 
    public ArrayList<Path> paths = new ArrayList<Path>(); 
    public ArrayList<Path> undonePaths = new ArrayList<Path>(); 

    private Bitmap im; 

    public CustomView(Context context) { 
     super(context); 
     setFocusable(true); 
     setFocusableInTouchMode(true); 
     setOnTouchListener(this); 
     mPaint = new Paint(); 
     mPaint.setAntiAlias(true); 
     mPaint.setDither(true); 
     mPaint.setColor(0xFFFFFFFF); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.ROUND); 
     mPaint.setStrokeWidth(6); 
     mCanvas = new Canvas(); 
     mPath = new Path(); 

     im = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
     DisplayMetrics metrics = getContext().getResources().getDisplayMetrics(); 
     int w = metrics.widthPixels; 
     int h = metrics.heightPixels; 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     // mBitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); 
    } 

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

    @Override 
    protected void onDraw(Canvas canvas) { 
     // mPath = new Path(); 
     // canvas.drawPath(mPath, mPaint); 
     canvas.drawColor(Color.TRANSPARENT); 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     for (Path p : paths) { 
      canvas.drawPath(p, mPaint); 
     } 
     canvas.drawPath(mPath, mPaint); 
    } 

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

    private void touch_start(float x, float y) { 
     undonePaths.clear(); 
     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); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     paths.add(mPath); 
     mPath = new Path(); 

    } 

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

     } 
     // toast the user 
    } 

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

     } 
     // toast the user 
    } 

    @Override 
    public boolean onTouch(View arg0, MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
     } 
     return true; 
    } 
} 
+1

después de deshacer, debe llamar a la función de invalidación() con parametros que definir en los la parte de actualizarse voluntad de la pantalla, ahora Invalidate callign() sin parametros que conduce a la actualización de la pantalla entera para que los colores de los anteriores los toques también cambian –

Respuesta

1

Esta es una vieja pregunta, pero quería dejar una respuesta para cualquiera que venga aquí. La solución es realizar un seguimiento de instancias separadas de Paint para cada trazo (debe haber exactamente 1 objeto de pintura por objeto de Trayectoria).

Cambie su método touch_up para reiniciar mPaint, además de restablecer mPath.

private void touch_up() { 
    mPath.lineTo(mX, mY); 
    mCanvas.drawPath(mPath, mPaint); 
    paths.add(mPath); 
    mPath = new Path(); 
    mPaints.add(mPaint) 
    // Creates a new Paint reference, but keeps the previous state (color, width, etc.) 
    mPaint = new Paint(mPaint); 
} 

Luego su método onDraw se ve más o menos así.

for (int i = 0; i < mPaths.size(); i++) { 
    canvas.drawPath(mPaths.get(i), mPaints.get(i)); 
} 
Cuestiones relacionadas