2016-10-24 3 views
0

페인트 애플리케이션에 다른 색상 집합이 있습니다. 기본 색상으로 캔버스 뷰에 선을 그릴 수 있습니다. 하지만 색상을 변경하면 이전 라인을 포함한 모든 라인의 색상이 변경됩니다.Android 드로잉에서 색상을 변경할 수 없습니다.

아래 코드는 당신이 당신의 drawPaint 변수에 새로운 색상을 설정하는 것처럼

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

것 같습니다. 그러나 귀하의 onDraw 방법 :

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

이 루프는 그들이 모두 같은 색으로 그려집니다 왜 같은 페인트 개체, drawPaint를 사용하여 이전의 모든 경로를 끌고있다. 가능한 한 해결책은 각 Paint 객체를 Path와 함께 저장하고 각 경로와 해당 Paint에 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

관련 문제