Android: Speichern der benutzerdefinierten Fingerfarbenansicht bei Änderung der Ausrichtung
Ich versuche, eine benutzerdefinierte Ansicht zu erstellen, in der ein Benutzer seine Signatur zeichnen kann. Eines, in dem Sie es programmgesteuert in die Ansicht einfügen und die Größe usw. festlegen können. Ich musste dies vorher nicht tun, also habe ich es auf der Grundlage der Fingerpaint-Klasse von Android-API-Demos erstellt. Das Problem im Moment ist, dass es das Objekt löscht, wenn sich die Ausrichtung ändert und ich nicht sicher bin, wie ich es dazu bringen soll, das nicht zu tun.
Der Code für PaintView
private Bitmap mBitmap;
private Canvas mCanvas;
private Path mPath;
private Paint mBitmapPaint;
private boolean mDrawPoint;
private int stateToSave;
private Paint mPaint;
public PaintView(Context context) {
super(context);
System.out.println("init");
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
setupPaint();
}
private void setupPaint()
{
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0xFF000000);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(4);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
System.out.println("w "+w+" h "+h+" oldw "+oldw+" oldh "+oldh);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
mCanvas = new Canvas(mBitmap);
}
@Override
protected void onDraw(Canvas canvas) {
System.out.println("on draw");
canvas.drawColor(0xFFAAAAAA);
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;
mDrawPoint=true;
}
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) {
mDrawPoint=false;
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
}
}
private void touch_up() {
if(mDrawPoint == true) {
mCanvas.drawPoint(mX, mY, mPaint);
} else {
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) {
getParent().requestDisallowInterceptTouchEvent(true);
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;
}
Als Minitest habe ich hinzugefügt
@Override
public Parcelable onSaveInstanceState()
{
System.out.println("save instance");
stateToSave++;
Bundle bundle = new Bundle();
bundle.putParcelable("instanceState", super.onSaveInstanceState());
bundle.putInt("stateToSave", this.stateToSave);
return bundle;
}
@Override
public void onRestoreInstanceState(Parcelable state)
{
System.out.println("on restore");
if (state instanceof Bundle)
{
System.out.println("on restore");
Bundle bundle = (Bundle) state;
this.stateToSave = bundle.getInt("stateToSave");
super.onRestoreInstanceState(bundle.getParcelable("instanceState"));
System.out.println(stateToSave);
return;
}
super.onRestoreInstanceState(state);
}
OnRestoreInstance () und onSaveInstance () werden jedoch niemals bei einer Änderung der Ausrichtung aufgerufen. Hier ist mein Code in der OnCreate-Aktivität, die eine Malansicht erstellt.
RelativeLayout inner= (RelativeLayout) findViewById(R.id.inner);
int width=600;
int height=360;
float X= 100;
float Y=60;
LayoutParams wrapped = new LayoutParams(width,height);
PaintView painting=new PaintView(this);
painting.setX(X);
painting.setY(Y);
painting.setLayoutParams(wrapped);
inner.addView(painting);
Edit: Ich habe herausgefunden, warum saveinstancestate nicht anrief, ich musste der View eine ID geben und dann würde es funktionieren.
painting.setId (4);
Jetzt muss ich herausfinden, wie ich die Zeichnung speichern kann.