Чертежный вид с несколькими цветами с возможностью отмены
Мой чертежный вид работает хорошо с многоцветным изображением, а также выполняет отмену, но отмену работает, когда я меняю цвет. Если я использую один цвет и рисую несколько линий, тогда все отменяется, но если я рисую одну линию одним цветом, а вторую линию с другим цвет, который он может отменить, в целом, если я выберу один цвет, и я подниму палец вверх и начну рисовать одним цветом, то отмена отменяет все, а не один за другим.
public class DrawingView extends View {
private static final float TOUCH_TOLERANCE = 4;
public static ArrayList<Pair<Path, Paint>> p = new ArrayList<Pair<Path, Paint>>();
Paint mPaint;
//MaskFilter mEmboss;
//MaskFilter mBlur;
Bitmap mBitmap;
Canvas mCanvas;
Path mPath;
Paint mBitmapPaint;
ProgressDialog pd;
String color;
private ArrayList<Path> paths = new ArrayList<Path>();
private float mX, mY;
public DrawingView(Context context, String color) {
super(context);
// TODO Auto-generated constructor stub
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
// mPaint.setColor(Color.parseColor(color));
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(10);
pd = new ProgressDialog(context);
mPath = new Path();
// ImageEditOptionActivity.pathsList.add(mPath);
mBitmapPaint = new Paint();
p.add(new Pair<Path, Paint>(mPath, mPaint));
// ImageEditOptionActivity.pathsList.add(mPath);
//colorlist.put(mPath,color);
mBitmapPaint.setColor(Color.parseColor(color));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
if (w > 0 && h > 0) {
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
} else {
mBitmap = Bitmap.createBitmap(300, 250, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
}
@Override
public void draw(Canvas canvas) {
// TODO Auto-generated method stub
super.draw(canvas);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
// canvas.drawPath(mPath, mPaint);
for (Pair<Path, Paint> pp : p) {
canvas.drawPath(pp.first, pp.second);
}
}
private void touch_start(float x, float y) {
mPaint.setColor(ImageEditOptionActivity.pencolor);
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);
mCanvas.drawPath(mPath, mPaint);
ImageEditOptionActivity.pathsList.add(mPath);
p.add(new Pair<Path, Paint>(mPath, mPaint));
mPath.reset();
mPath = new Path();
//colorlist.put(mPath,color);
mPaint = new Paint(mPaint);
// p.add(new Pair<Path, Paint>(mPath, mPaint));
}
@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 SMILEY;
}
}
и я создаю вид, когда я нажимаю на кнопку инструмента пера, и он просит выбрать цвет, я выбрал цвет и рисую, приведенный ниже код
private String colorDialogForPentool() {
final Dialog dialogView = new Dialog(this);
dialogView.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialogView.setContentView(R.layout.dialog_colorpicker);
dialogView.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
textColor = (TextView) dialogView.findViewById(R.id.textView);
linearLayoutColorBox = (LinearLayout) dialogView.findViewById(R.id.linearLayout);
btn_dialog_ok = (Button) dialogView.findViewById(R.id.btn_dialog_ok);
colorPickerView = (ColorPickerView) dialogView.findViewById(R.id.colorPickerView);
colorPickerView.setColorListener(new ColorPickerView.ColorListener() {
@Override
public void onColorSelected(int color) {
textColor.setText("#" + colorPickerView.getColorHtml());
pencolor = color;
linearLayoutColorBox.setBackgroundColor(color);
}
});
btn_dialog_ok.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
color = textColor.getText().toString();
mDrawingView = new DrawingView(getApplicationContext(), color);
mDrawingPad.setId(id);
mDrawingPad.addView(mDrawingView);
dialogView.dismiss();
}
});
dialogView.show();
return pentoolcolor;
}
моя кнопка pen tool - это значок меню.