2016-10-24 59 views
0

我在绘画应用程序中有不同的一组颜色。我可以使用默认颜色在画布视图上绘制线条。但是当我改变颜色时,它会改变所有线条的颜色,包括旧线条。无法更改Android绘图中的颜色

下面

是代码。

public class DrawingArea extends View { 

private Path drawPath; 
private Paint drawPaint, canvasPaint; 
private int paintColor = 0xFF660000; 
private Canvas drawCanvas; 
private Bitmap canvasBitmap; 
private ArrayList<Path> paths = new ArrayList<Path>(); 
private ArrayList<Path> undonePaths = new ArrayList<Path>(); 
private ArrayList<Integer> colors = new ArrayList<Integer>(); 
private float mX, mY; 
private static final float TOUCH_TOLERANCE = 4; 
private static boolean mRedoStatus = false; 
private static boolean mUndoStatus = false; 
private float currentBrushSize; 
private float lastBrushSize; 
// for Undo, Redo 
private int historyPointer = 0; 
private boolean erase = false; 

public DrawingArea(Context context) { 
    super(context); 
    setupDrawing(); 
} 

public DrawingArea(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setupDrawing(); 
} 

public void setupDrawing() { 
    drawPath = new Path(); 
    drawPaint = new Paint(); 
    drawPaint.setAntiAlias(true); 
    drawPaint.setStrokeWidth(20); 
    drawPaint.setStyle(Paint.Style.STROKE); 
    drawPaint.setStrokeJoin(Paint.Join.ROUND); 
    drawPaint.setStrokeCap(Paint.Cap.ROUND); 
    canvasPaint = new Paint(Paint.DITHER_FLAG); 
    //paths.add(drawPath); 
} 

public void setColor(String newColor) { 
    invalidate(); 
    paintColor = Color.parseColor(newColor); 
    drawPaint.setColor(paintColor); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    for (Path p : paths) { 
     canvas.drawPath(p, drawPaint); 
    } 
    canvas.drawPath(drawPath, 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); 
} 

@Override 
public boolean onTouchEvent(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; 
} 

private void touch_start(float x, float y) { 
    undonePaths.clear(); 
    drawPath.reset(); 
    drawPath.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) { 
     drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     mY = y; 
    } 
} 

public void setErase() { 
    canvasBitmap.eraseColor(Color.TRANSPARENT); 
    drawPath.reset(); 
    invalidate(); 
} 

private void touch_up() { 
    drawPath.lineTo(mX, mY); 
    // commit the path to our offscreen 
    drawCanvas.drawPath(drawPath, drawPaint); 
    paths.add(drawPath); 
    // kill this so we don't double draw 
    drawPath = new Path(); 
} 

public void startNew() { 
    drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR); 
    invalidate(); 
} 

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

public void setEmptyStatus(boolean status) { 
    mRedoStatus = status; 
    mUndoStatus = status; 
} 

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

public void setBrushSize(float newSize) { 
    float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 
      newSize, getResources().getDisplayMetrics()); 
    currentBrushSize = pixelAmount; 
    canvasPaint.setStrokeWidth(newSize); 
} 

public void setLastBrushSize(float lastSize) { 
    lastBrushSize = lastSize; 
} 

public float getLastBrushSize() { 
    return lastBrushSize; 
} 

}

回答

0

它看起来像你设置你的drawPaint变量的新颜色。然而,在你的onDraw方法:

for (Path p : paths) { 
    canvas.drawPath(p, drawPaint); 
} 

这个循环绘制都使用相同的喷漆的对象,drawPaint,这就是为什么他们都用相同的颜色绘制以前的路径。要考虑的一个可能的解决方案是将每个Paint对象与Path一起保存,并为每个路径及其对应的Paint.Just调用drawPath,因为您有一个所有旧路径的列表,您还可以创建一个旧的绘制列表。

private ArrayList<Paint> paints = new ArrayList<Paint>(); 

当您将每个路径保存到路径列表中时,可以将当前drawPaint添加到涂料列表中。然后,在你的onDraw方法,你可以改变你的循环看起来是这样的:

for(int i = 0 ; i < paths.size() ; i++) { 
    canvas.drawPath(paths.get(i), paints.get(i)); 
} 

这将绘制每个路径与其相应的漆,保护每个通道的颜色。

+0

您能否请示例代码。我在onDraw()方法中添加了下面的代码,但是撤消操作不起作用。 canvas.drawBitmap(canvasBitmap,0,0,canvasPaint); – chait

+0

添加示例代码。当你添加一行canvas.drawBitmap(canvasBitmap,0,0,canvasPaint);你的onDraw方法现在正在绘制包含所有到屏幕的路径的位图,而不是单独绘制每个路径。您的撤销从路径列表中删除路径,但不能从canvasBitmap中删除路径。 – Thomas

+0

你可以发送完整的代码吗?即使我不能改变颜色 – chait