studio - ¿Cómo implementar las características de deshacer en la aplicación de pintura en Android?
como quitar la actionbar/toolbar de mi aplicación android (4)
Quiero deshacer funciones en mi aplicación ... para esto busqué i net encontré que toma una lista de niveles x, y que he hecho debajo del código no puedo deshacer los dibujos ??
public Drawview(Context context, float x, float y, int r) {
super(context);
mBitmap = Bitmap.createBitmap(800, 1200, Bitmap.Config.ARGB_8888);
// mainbitmap.add(mBitmap);
//System.out.println("**mBitmapPaint***"+mBitmapPaint);
mCanvas = new Canvas(mBitmap);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
}
@Override
protected void onDraw(Canvas canvas) {
System.out.println("***Drawinglines****"+Drawinglines);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
private float mX, mY;
private static final float TOUCH_TOLERANCE = 4;
private void touch_start(float x, float y) {
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);
/// path.
//graphics.add(mPath);
mPath.reset();
}
// events when touching the screen
public boolean onTouchEvent(MotionEvent event) {
event.getAction();
int eventaction = event.getAction();
int X = (int)event.getX();
int Y = (int)event.getY();
switch (eventaction ) {
case MotionEvent.ACTION_DOWN:
{
touch_start(X, Y);
}
invalidate();
break;
case MotionEvent.ACTION_MOVE:
System.out.println("***ACTION_MOVE**************"+X+"************"+Y);
if((Drawinglines.equals("Pen"))||(Drawinglines.equals("Erase")))
{
touch_move(X, Y);
temp_point.add(new Point(X,Y));
}
invalidate();
break;
case MotionEvent.ACTION_UP:
main_Points.add(temp_point);
temp_point = null;
touch_up();
invalidate();
break;
}
return true;
}
public void undopath()
{
main_Points.remove(main_Points.size()-1);
invalidate();
}
}
@Override
public void onClick(View v) {
if(v == Undo)
{
Drawview abc=new Drawview();
abc.undopath();
}
Pero deshacer la funcionalidad de deshacer no funciona.
No lo intenté, pero creo que usar dos lienzos y mapas de bits es útil, al dibujar el estado actual, uno sigue siendo estado anterior, solo es necesario restaurar el anterior. Pero solo puede restaurar en el paso.
Hola, he usado una especie de truco para eliminar la línea negra. En mi botón borrar, he establecido el color en blanco, en lugar de usar XferMode ..
if(erase){
paintColor = Color.parseColor(newColor);
drawPaint.setColor(paintColor);
}
aquí algunos códigos: crear:
private Canvas mCanvas;
private Bitmap mBitmap;
private Canvas mRestoreCanvas;
private Bitmap mRestoreBitmap;
en eso:
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mPictureWidth = w;
mPictureHeight = h;
Loge.i("mPictureWidth = " + mPictureWidth + " mPictureHeight = "
+ mPictureHeight);
if (mCanvas == null && mBitmap == null && mPictureWidth > 0
&& mPictureHeight > 0) {
mBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight,
Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
mCanvas.save();
mRestoreBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight,
Bitmap.Config.ARGB_8888);
mRestoreCanvas = new Canvas(mRestoreBitmap);
mRestoreCanvas.save();
}
super.onSizeChanged(w, h, oldw, oldh);
}
onDraw:
@Override
protected void onDraw(Canvas canvas) {
if (mPattern == DRAW_LINE) {
mCanvas.restore();
mCanvas.drawPath(path, paint);
mCanvas.save();
}
mCanvas.save();
if (mBitmap != null)
canvas.drawBitmap(mBitmap, 0, 0, null);
}
onTouchEvent:
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){
mRestoreCanvas.drawBitmap(mBitmap, 0, 0, bitmapPaint);
}
if (mPattern == DRAW_LINE) {
return drawLines(event);
} else if (mPattern == DRAW_PATTERN) {
return drawPattern(event);
}
return false;
}
Deshacer:
public void dust() {
path.reset();
mBitmap.recycle();
mBitmap = Bitmap.createBitmap(mPictureWidth, mPictureHeight,
Bitmap.Config.ARGB_8888);
mCanvas.setBitmap(mBitmap);
mCanvas.drawBitmap(mRestoreBitmap, 0, 0, bitmapPaint);
invalidate();
}
Probado OK;
private Slate mSlate;
private TiledBitmapCanvas mTiledCanvas;
public void clickUndo(View unused) {
mSlate.undo();
}
public void undo() {
if (mTiledCanvas == null) {
Log.v(TAG, "undo before mTiledCanvas inited");
}
mTiledCanvas.step(-1);
invalidate();
}