Android FingerPaint Undo / Redo-Implementierung
Ich arbeite an einem ähnlichen TestprojektFingerPaint
Beispiel in Android SDK Demos. Ich habe versucht, die Undo / Redo-Funktion in meinem Projekt zu implementieren, aber die Dinge, die ich ausprobiert habe, haben nicht wie erwartet funktioniert. Ich finde einige ähnliche Fragen über das Internet und hier, aber sie haben mir nicht geholfen. Deshalb stelle ich eine neue Frage.
Hier ist eine Idee, was ich eigentlich mache:
<code> public class MyView extends View { //private static final float MINP = 0.25f; //private static final float MAXP = 0.75f; private Path mPath; private Paint mBitmapPaint; public MyView(Context c) { super(c); 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); mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); mCanvas.drawColor(Color.WHITE); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); 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); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // kill this so we don't double draw mPath.reset(); } @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; } } </code>
Irgendwelche Vorschläge / Ideen / Beispiele, wie diese Art von Funktionalität in meinem Projekt am besten implementiert werden kann?