2016-10-24 11 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); 
} 

このループは、それらがすべて同じ色で描かれている理由である同じPaintオブジェクト、drawPaintを使用して、以前のすべてのパスを描いています。考えられる解決策は、パスと共に各Paintオブジェクトを保存し、各パスとそれに対応するPaint.Justを呼び出すことです。すべての古いパスのリストがあるので古いペイントのリストを作成することもできます。

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

各パスをパスリストに保存すると、現在のdrawPaintをペイントのリストに追加できます。

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

これは、各パスの色を維持し、それに対応する塗料で、各パスを引く:次に、あなたのonDrawメソッドで、あなたはこのような何かを見て、あなたのループを変更することができます。

+0

サンプルコードを表示してください。私はonDraw()メソッドの下にコードを追加しましたが、元に戻すことはできません。 canvas.drawBitmap(canvasBitmap、0、0、canvasPaint); – chait

+0

サンプルコードが追加されました。 canvas.drawBitmap(canvasBitmap、0、0、canvasPaint)という行を追加したとき。 onDrawメソッドは、各パスを個別に描画するのではなく、すべてのパスを含むビットマップを描画しています。元に戻す操作はパスリストからパスを削除しますが、canvasBitmapからパスを削除することはできません。 – Thomas

+0

完全なコードを送信してください。色を変更できません。 – chait

関連する問題