无法在Android绘图中更改颜色

时间:2016-10-24 00:04:08

标签: android android-canvas

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

下面是代码。

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;
}

}

1 个答案:

答案 0 :(得分:0)

您似乎在drawPaint变量上设置了新颜色。但是,在onDraw方法中:

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

此循环使用相同的Paint对象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));
}

这将使用相应的绘制绘制每个路径,保留每个路径的颜色。